Как я могу ограничить количество циклов в цикле Do While?

Итак, я написал функцию, которая использует входные данные текстового поля для поиска соответствующих значений на другом листе. Проблема в том, что если он не находит соответствия, он входит в бесконечный цикл. Могу ли я ограничить петли, чтобы они не зависали? Если есть другое решение, а не ограничивающие петли, я все уши. Вот с чем я работаю:

Function Most_Recent_Deployment(Label1 As String, Label2 As String, Label3 As String) As Long
    Dim all_rows As Range
    Dim row As Range
    Dim LastCell As Range
    Dim LastCellRowNumber As Long
    Set LastCell = Sheet7.Cells(Sheet7.Rows.Count, "A").End(xlDown).End(xlUp)
    LastCellRowNumber = LastCell.row + 1
    Set row = Sheet7.Range("A:A").Find(Label1, LookIn:=xlValues, After:=Cells(LastCellRowNumber, "A"), SearchDirection:=xlPrevious)
    Do While row.row > 1

        If (Sheet7.Cells(row.row, 2).Text = Label2) And (Sheet7.Cells(row.row, 3).Text = Label3) Then
            Most_Recent_Deployment = row.row
            Exit Function
        End If
        LastCellRowNumber = row.row
        Set row = Sheet7.Range("A:A").Find(Label1, LookIn:=xlValues, After:=Cells(LastCellRowNumber, "A"), SearchDirection:=xlPrevious)

    Loop
    Most_Recent_Deployment = 0
End Function

2 ответа

Решение

Вы можете добавить часть "И" в свой цикл "Делать пока" со счетчиком внутри цикла, который будет указывать, когда вы достигли конца данных в вашей электронной таблице.

Что-то вроде:

dim counter as integer    
Do While row.row > 1 and counter > worksheetfunction.counta(sheet7.range("A:A")

    If (Sheet7.Cells(row.row, 2).Text = Label2) And (Sheet7.Cells(row.row, 3).Text = Label3) Then
        Most_Recent_Deployment = row.row
        Exit Function
    End If
    LastCellRowNumber = row.row
    Set row = Sheet7.Range("A:A").Find(Label1, LookIn:=xlValues, After:=Cells(LastCellRowNumber, "A"), SearchDirection:=xlPrevious)
    coutner=counter+1

Loop

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

Редактировать:

LastCellRowNumber=row.row
temp2=temp1
temp1=LastCellRowNumber

Set row = Sheet7.Range("A:A").Find(Label1, LookIn:=xlValues, After:=Cells(LastCellRowNumber, "A"), SearchDirection:=xlPrevious)

if row.row=temp1 and temp1=temp2 then
    exit do
end if

Вы можете попробовать сделать до. например:

Do Until IsEmpty(Cells(iRow, 1)) 
    ' Store the current cell value in the dCellValues array
    dCellValues(iRow) = Cells(iRow, 1).Value
    iRow = iRow + 1 
Loop  

Код из ExcelFunctions.net.

Другие вопросы по тегам