2016-06-16 15 views
0

Просто вопрос об эффективности здесь. Я по существу перебираю ячейки в столбце, чтобы увидеть, содержит ли они определенную строку, но тогда эта ячейка также не должна включать в себя ни одну из 14 разных строк. Мое текущее решение состоит в том, чтобы найти строку, а затем выполнить цикл через массив, используя instr в ячейке. Однако это произойдет, возможно, сотни раз, когда выполняется макрос. Мне любопытно, есть ли лучший способ.VBA - Поиск строки для всех значений в массиве

Например:

NotArr = Array("blah1", "blah2", "blah3", "etc") 

For r = 1 to 10 
    'Let's assume I've already found the first string 
    For i = 1 to 4 
     If Not InStr(Cells(r, 1).value, NotArr(i)) > 0 Then 
      'Do things 
     End If 
    Next i 
Next r 

Примечание: Я знаю, что я, вероятно, overthinking или просто отсутствует очевидное. Я был похоронен в VBA около 6 недель @ 10-часовых дней и может чувствовать, что мой мозг тает.

Спасибо всем!

+1

Вы можете сделать это быстрее, если вы также установите диапазон в массиве, чтобы вы не возвращались к листу столько раз. Или, по крайней мере, поместите значение каждой ячейки в переменную и проверьте, что она также сократит количество ссылок на ячейку на листе. –

+0

Взаимодействие с листом (с использованием 'Cells()' in macro) несколько раз замедляет макрос. Вы можете сохранить диапазон поиска в массиве, а затем использовать массив в макросе, чтобы увеличить скорость. И некоторые основные вещи, такие как держать расчеты в ручном режиме и отключать обновление экрана. –

+0

Спасибо, ребята, это полезно. Это быстрее! –

ответ

1

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

Dim arr() as Variant 
arr = Range("A1:G10") 
For each rng in arr 
    For i = 1 to 4 
     If Not InStr(rng.value, NotArr(i)) > 0 Then 
      'Do things 
     End If 
    Next i 
Next