Не могу четко понять, как вы хотите фильтровать «пробел».Предположение (из кода), что цель состоит в том, чтобы отфильтровать любые строки, содержащие пробел или пробел, я хотел бы сделать это непосредственно для чтения и записи в текстовый файл.
Более того, если предположение верно, команды Select, Активировать и т. Д. В течение кода увеличить время работы.Также хорошо работать в цикле для каждого столбца, но думаю, что метод диапазона объединения не нужен.После применения фильтра ко всем столбцам можно скопировать и вставить всю область данных.Но это также может увеличить вероятность ошибки 1004. «MS Excel не может создать или использовать ссылку на диапазон данных, потому что она слишком сложна», так как здесь данные, с которыми приходится иметь дело, превышают 100 К.
Поэтому я попытался сданные более 150 тыс. строк и 50 столбцов напрямую. Требуется 20 с лишним секунд, чтобы обработать данные как текстовый файл, и еще 20 с, чтобы открыть полученный файл CSV
и сохранить его как xlsx
.Формат файла, используемый в коде, создает некоторую проблему (по крайней мере, в Excel 2007), поэтому я сохранил его как xlsx
.
Sub test()
Dim oFlNo As Integer, iFlNo As Integer
Dim oFlName As String, iFlName As String
Dim oFolder As String, iFolder As String
Dim Arr As Variant, HaveBlank As Boolean
Dim Tm As Double
Tm = Timer
iFlName = "C:\users\user\desktop\FilerCSv.Csv"
oFlName = "C:\users\user\desktop\FilteredCSv.Csv"
iFlNo = FreeFile
Open iFlName For Input As #iFlNo
oFlNo = FreeFile
Open oFlName For Output As #oFlNo
Do While Not EOF(iFlNo) ' Loop until end of file.
Line Input #iFlNo, Ln ' Read line into variable.
Arr = Split(Ln, ",")
HaveBlank = False
For Each xVal In Arr
xVal = Trim(xVal)
If xVal = "" Then
HaveBlank = True
Exit For
End If
Next
If HaveBlank = False Then
Write #oFlNo, Ln
End If
Loop
Close #iFlNo
Close #oFlNo
Debug.Print Timer - Tm
Workbooks.Open (oFlName)
oFlName = Left(oFlName, Len(oFlName) - 4)
ActiveWorkbook.SaveAs Filename:=oFlName & ".xlsx" ', FileFormat:=xlOpenXMLStrictWorkbook, CreateBackup:=False
Debug.Print Timer - Tm
End Sub
Поскольку я лично не предпочитаю вести вычисления, обработку событий иобновление экрана выключено (в обычных случаях) я не добавил эти стандартные строки.Однако вы можете использовать эти стандартные методы по своему усмотрению.