#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:
Петли не так уж плохи. Они плохи при циклическом отображении диапазонов на рабочих листах. Используйте массивы вариантов для цикла.
Использование вариантного метода:
- диапазон загрузки в массив вариантов.
- зациклите массив и внесите изменения.
- верните данные массива вариантов в диапазон.
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. Несмотря на то, что это больше кода, я нахожу его более читаемым для себя, и я вижу, что вы проверили скорость