Как я могу ограничить количество циклов в цикле 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.