Регулировка значения диапазона без цикла For

#excel #vba

#превосходить #vba

Вопрос:

Я хочу удалить левый символ из столбца строк без зацикливания на каждой ячейке, но я получаю ошибку в Excel. Вот мой код, могу ли я сделать это без цикла for?

 Public Sub TestRngAdjust()  Dim TestRNG As Range  Set TestRNG = Range("A1:A5")  TestRNG.NumberFormat = "@"  TestRNG.Value = Right(TestRNG.Value, Len(TestRNG.Value) - 1) End Sub  

Комментарии:

1. Я бы поместил полный диапазон в массив вариантов, повторил бы это, внеся изменения, а затем вернул массив обратно в диапазон. Это будет очень быстро.

Ответ №1:

Если вы не хотите зацикливаться:

 Dim s As String s = "RIGHT(" amp; TestRNG.Address amp; ",LEN(" amp; TestRNG.Address amp; ") - 1)" TestRNG.Value = TestRNG.Parent.Evaluate(s)  

Но на самом деле очень легко прочитать данные в Variant массив, использовать Right их для каждого элемента, а затем записать массив обратно в диапазон.

Комментарии:

1. Кстати, проверено на полной колонке. Варианту потребовалось 1,3 секунды, а оценке-1,5 секунды, чтобы выполнить полный столбец.

2. Блер @СкоттКранер ха-ха-ха, конечно, ты бы так и сделал.

3. Мне всегда было любопытно, что будет быстрее. Подумал, что это хороший тест.

Ответ №2:

Петли не так уж плохи. Они плохи при циклическом отображении диапазонов на рабочих листах. Используйте массивы вариантов для цикла.

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

  1. диапазон загрузки в массив вариантов.
  2. зациклите массив и внесите изменения.
  3. верните данные массива вариантов в диапазон.
 Public Sub TestRngAdjust()    Dim TestRNG As Range  Set TestRNG = Range("A1:A5")    Dim rngarr As Variant  rngarr = TestRNG.Value    Dim i As Long  For i = 1 To UBound(rngarr, 1)  rngarr(i, 1) = Mid$(rngarr(i, 1), 2)  Next i  TestRNG.NumberFormat = "@"  TestRNG.Value = rngarr   End Sub  

Комментарии:

1. Молниеносный ответ с молниеносным кодом! Спасибо!

2. Почему вы использовали СЕРЕДИНУ против правой?

3. vba Mid не нуждается в третьем критерии длины. Если этот параметр опущен, он будет означать конец строки. Таким образом, мне не нужны Right() - Len()

4. Ах, я понимаю, СЕРЕДИНА, начиная со 2-й позиции = Справа(Str,Len(Str) -1

5. Несмотря на то, что это больше кода, я нахожу его более читаемым для себя, и я вижу, что вы проверили скорость