VBA: обрезать по столбцу с несколькими значениями - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь обрезать столбец с большим количеством строк. Сначала я попробовал с «Для каждого», но это занимает так много времени. Затем я попытался с кодом, подобным этому:

Sub TrimTest()

Dim rangeTrim As Range

  Set rangeTrim = Workbooks("Book1").Sheets("Sheet1").Column("A:A")
    rangeTrim.Value = Application.Trim(rangeTrim.Value)


End Sub

Несмотря на то, что он такой быстрый, он работает только иногда. Она выдает ошибку «Run-time error» 1004 (ошибка приложения или объекта), и мне приходится снова запускать макрос.

Есть ли другой способ обрезки всего столбца?

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Столбец TRIM

Тест

Я протестировал оба решения на столбцах с миллионными строковыми значениями, используя MicroTimer. В версии с массивом производительность была немного лучше (1-2%). Обрезка, используемая таким образом, не вызовет ошибку, если есть значение ошибки, число или формула. Любые формулы будут потеряны, только значения будут записаны обратно на лист. Время, необходимое для усечения миллиона строковых значений, составляло на моем компьютере около 3,5 секунд.

Использование: вызов из другого вспомогательного примера

trimColumnA Sheet1, "A", 2
trimColumnA Sheet2, 2
trimColumnA Thisworkbook.Worksheets("Sheet1"), "H"

Код

Sub trimColumnA(Sheet As Worksheet, trimColumn As Variant, _
  Optional FirstRow As Long = 1)

    Dim rng As Range
    Dim vnt As Variant

    With Sheet
        ' Define last cell range containing a value.
        Set rng = .Columns(trimColumn).Find(What:="*", LookIn:=xlValues, _
          Searchdirection:=xlPrevious)
        ' Define Trim Range.
        Set rng = .Range(.Cells(FirstRow, trimColumn), rng)
        vnt = rng
        rng.Value = Application.Trim(vnt)
    End With

End Sub

Sub trimColumnR(Sheet As Worksheet, trimColumn As Variant, _
  Optional FirstRow As Long = 1)

    Dim rng As Range

    With Sheet
        ' Define last cell range containing a value.
        Set rng = .Columns(trimColumn).Find(What:="*", LookIn:=xlValues, _
          Searchdirection:=xlPrevious)
        ' Define Trim Range.
        Set rng = .Range(.Cells(FirstRow, trimColumn), rng)
    End With

    rng.Value = Application.Trim(rng.Value)

End Sub
0 голосов
/ 02 мая 2020

Вы можете ускорить обработку каждой ячейки, выполнив ее в массиве VBA. Я не верю, что вы можете применить WorksheetFunction.Trim к массиву ячеек.

так:

Sub trimColumn(WS As Worksheet, Optional colNum As Long = 1)
    Dim v As Variant, I As Long, R As Range

With WS
    Set R = Range(.Cells(1, colNum), .Cells(.Rows.Count, colNum).End(xlUp))
End With

v = R

For I = 1 To UBound(v, 1)
    v(I, 1) = WorksheetFunction.Trim(v(I, 1))
Next I

R = v

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...