Как изменить диапазон ячеек без петли - PullRequest
0 голосов
/ 15 мая 2019

У меня есть массивный шаблон Excel с проблемами производительности.Я хотел бы оптимизировать код VBA, который я использую для модификации ячеек, чтобы они были более универсальными.У меня есть несколько основных функций, использующих циклы для изменения значений.Вот пример:

Dim aCell as Range
For Each aCell In Range("A1:A9999").Cells

    'appends prefix to value of each cell
     aCell.Value = "CC_" & aCell.Value

Next aCell

Хотя это работает, недостатком этого является то, что он вызывает несколько пересчетов и обновлений, которые замедляют шаблон.Я знаком с включением и выключением расчетов / обновлением экрана, но по причинам, в которые я не буду вдаваться, это не вариант.

Этот код ниже работает НЕ , но этоподход, который я ищу.Есть ли способ сделать такое изменение с помощью массива или другого инструмента, о котором я не думаю, что это минимизировало бы обновления вычислений шаблонов?

Range("A1:A9999").Value = "CC_" & Range("A1:A9999").Value

Спасибо!

Ответы [ 4 ]

2 голосов
/ 15 мая 2019

Чтение / запись в / из листа занимает много времени. Выполните изменения в массиве VBA, а затем запишите его обратно.

Dim myRange As Range, myArr As Variant
Set myRange = Range("A1:A9999")

myArr = myRange

For i = 1 To UBound(myArr, 1)
    myArr(i, 1) = "CC_" & myArr(i, 1)
Next i

myRange = myArr
1 голос
/ 15 мая 2019

FWIW, вы можете сделать это без цикла, используя Evaluate, например:

Sub addText()
     With Range("A1:A9999")
        .Value2 = .Worksheet.Evaluate("INDEX(""CC_""&" & .Address & ",)")
    End With
End Sub
1 голос
/ 15 мая 2019

Вы можете временно создать столбец, полный функций, а затем вставить эти значения в значения столбца A:

Range("XFD1:xfd9999").Formula = "=""CC_""&A1"
Calculate
Range("A1:a9999").Value = Range("XFD1:XFD8").Value
Range("XFD1:XFD9999").ClearContents

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

0 голосов
/ 11 июня 2019

Я пересматривал это (пытаясь все еще сделать это быстрее), и теперь, когда у меня есть немного лучшее понимание, я бы рекомендовал подход, показанный ниже.Принятый ответ жестко запрограммирован для одного столбца, который был задан в моем примере, но приведенный ниже подход более динамичен.

Sub sampleArraySheetEdit()
Dim aRange As Range: Set aRange = Range("A1:B9999") ' or whatever your range is...
Dim vRng() As Variant: vRng = aRange
Dim r As Long, c As Long


For r = LBound(vRng, 1) To UBound(vRng, 1) 'this ensures all cells always accounted for
    For c = LBound(vRng, 2) To UBound(vRng, 2)

        'perform you operation here....
        vRng(r, c) = "CC_" & vRng(r, c)

    Next c
Next r

aRange = vRng

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