Самый быстрый / самый элегантный метод для просмотра диапазона в Excel VBA - PullRequest
0 голосов
/ 14 марта 2019

Добрый день,

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

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

Пример кода:

Set FindStr = .Sheets(c).Range("C2:C" & LRow).Find("MANUALLY", lookat:=xlWhole)
If Not FindStr is Nothing Then
    FRow = FindStr.Row
End If

Do While Not FindStr Is Nothing
    If FindStr.Offset(0,2) = "SA" Then
        FindStr.Offset(0,5) = "Confirmed"
    End If
    Set FindStr = .Sheets(c).Range("C2:C" & LRow).Find("MANUALLY", after:=FindStr, lookat:=xlWhole)

    If Not FindStr Is Nothing Then
        If FindStr.Row = FRow then Exit Do
    End If
Loop

1 Ответ

1 голос
/ 14 марта 2019

Если вы хотите продолжить поиск, вы можете использовать FindNext вместо возобновления нового поиска.

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

Одно замечание к названию вашей переменной: Find/FindNext return Ranges, и вы должны дать своей переменной имя, которое отражает это. FindStr подразумевает, что он содержит строку, что неверно. Значение по умолчанию для Range является его значением, поэтому оно может выглядеть так, как будто это строка, но это не так.

Посмотрите на этот кусок кода:

Const searchStr = "MANUALLY"
With .Sheets(c).Range("C2:C" & LRow)
    Dim findRange As Range, firstHit As Range
    Set findRange = .Find(searchStr, lookat:=xlWhole)
    If Not findRange Is Nothing Then
        Set firstHit = findRange     ' Remember first hit.
        Do
            ' ... (Do your stuff here)
            Set findRange = .FindNext(findRange)
        Loop While Not findRange Is Nothing And findRange.Address <> firstHit.Address
    Else
        ' in case you didn't find anything
    End If
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...