Excel VBA Длина-1 в диапазоне - PullRequest
2 голосов
/ 18 мая 2011

Я недавно приступил к разработке макросов для Excel после долгого отсутствия необходимости.

У меня есть один столбец с двумястами строками, где каждая строка имеет значение.Я написал цикл для итерации к каждому значению строки, прочитал текущее значение и затем записал значение обратно минус последний символ.

Вот некоторый фактический (и псевдо) код того, что я написал.

Dim theRow as Long
Dim totRow as Long
Dim fooStr as String


theRow = 2 'we begin on the second row of the colummn
totRow = 201 'there are 200 values


For theRow = 2 to totRow
    fooStr = WorkSheets(DestSheet).Cells(theRow,"A").Formula 'read the cell value
    fooStr = Left(fooStr,Len(fooStr)-1 'subtract the last character from the value
    Cells(theRow,1).Value = fooStr 'write the value back
Next theRow

После некоторого чтения я узнал, что лучше всего читать и записывать значения, используя Range.Можно ли переписать то, что я делаю, используя Range, чтобы он шел быстрее?

Вот что я придумал до сих пор.

Range("A2:A201").Value = Len(Range.Left("A2:A201").Value)-1

Однако это не работает.

Любые подсказки о том, как это сделать, если это действительно возможно?

Спасибо за любые советы.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Если вам нужна максимальная производительность (она вам не нужна для 200 строк, но ...), вам нужно минимизировать количество операций чтения и записи (в основном записи) в диапазоны. Это означает чтение всего диапазона в массив, манипулирование массивом, а затем запись его обратно в диапазон. Это одно чтение и одна запись по сравнению с 200 в цикле. Вот пример.

Sub RemoveLastChar()

    Dim vaValues As Variant
    Dim i As Long

    vaValues = Sheet1.Range("A2").Resize(200).Value

    For i = LBound(vaValues, 1) To UBound(vaValues, 1)
        vaValues(i, 1) = Left$(vaValues(i, 1), Len(vaValues(i, 1)) - 1)
    Next i

    Sheet1.Range("A2").Resize(UBound(vaValues, 1), UBound(vaValues, 2)).Value = vaValues

End Sub
0 голосов
/ 18 мая 2011

Вы могли бы сделать что-то вроде

 Sub StringTrim()
    Dim xCell as Range 
    Range("A1:A201").Select

    For Each xCell in Selection
       xCell.Value = Left(xCell.Value, Len(xCell.Value) - 1)
    Next

 End Sub

Я не знаю, какие улучшения скорости вы ищете, но это также помогло бы.

Вы, возможно, уже знаете это, но если поставить Application.ScreenUpdating = False наверху своего кода, это может значительно ускорить его (если вы не хотите, чтобы все происходило, как работает скрипт). Вам следует сбросить значение до True в конце вашего кода.

...