Значение поиска в нескольких листах с помощью «Далее» без ошибок

Я попытался настроить окно поиска, чтобы найти значение на нескольких листах.

Если значение можно найти, оно отобразит столбец на листе. Затем нажмите «ОК», чтобы продолжить поиск на следующем листе или «Отмена», чтобы выйти из поиска. Я считаю, что эта часть работает.

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

Не могли бы вы взглянуть и исправить «не найденную» часть (после Else), если это возможно?

Private Sub CommandButton1_Click() Dim ws As Worksheet Dim Search As String Search = TextBox1.Text For Each ws In ThisWorkbook.Worksheets Dim r As Range Dim f1 As Range If ws.Name = "SELECTOR" Then GoTo nws Set r = ws.Cells.Find(What:=Search, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 'finds first match If Not r Is Nothing Then Application.Goto (Sheets(ws.Name).Range(r.Address)) If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If Set f1 = r Do While Not r Is Nothing Set r = ws.Cells.FindNext(r) If f1.Address = r.Address Then GoTo nws Application.Goto (Sheets(ws.Name).Range(r.Address)) If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If Loop Else If MsgBox("not found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If nws: Set r1 = Nothing Next ws End Sub 

Если вы используете последовательный отступ кода, вы увидите, что отсутствует End If . Это смущает компилятор, потому что он встречается с Next ws без For на соответствующем уровне отступа для его соответствия:

 Private Sub CommandButton1_Click() Dim ws As Worksheet Dim Search As String Search = TextBox1.Text For Each ws In ThisWorkbook.Worksheets Dim r As Range Dim f1 As Range If ws.Name = "SELECTOR" Then GoTo nws Set r = ws.Cells.Find(What:=Search, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 'finds first match If Not r Is Nothing Then Application.Goto (Sheets(ws.Name).Range(r.Address)) If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If Set f1 = r Do While Not r Is Nothing Set r = ws.Cells.FindNext(r) If f1.Address = r.Address Then GoTo nws Application.Goto (Sheets(ws.Name).Range(r.Address)) If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If Loop Else If MsgBox("not found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If nws: Set r1 = Nothing Next ws '<-- This has no matching For, but really you are missing an End If ' (Probably meant to be an End If just before your nws label ' in order to close your If Not r Is Nothing Then statement) End Sub 

Мое «лучшее предположение» о том, где вы хотите End If (основанный на том, что у вас есть GoTo nws до If , If отсутствует его End If ), находится непосредственно перед меткой nws: таким образом, последняя часть вашего код:

  Else If MsgBox("not found on " & ws.Name, vbOKCancel) = vbCancel Then Exit Sub End If End If nws: Set r1 = Nothing Next ws End Sub 

Заметки:

  • У вас есть Set r1 = Nothing , но вы никогда не объявляли или не использовали переменную r1 нигде.

  • Вы дважды используете инструкцию Application.Goto (Sheets(ws.Name).Range(r.Address)) которая эквивалентна Application.Goto Sheets(ws.Name).Range(r.Address).Value . Я считаю, что вы хотите использовать Application.Goto Sheets(ws.Name).Range(r.Address) (т.е. без скобок), которые могут быть упрощены до Application.GoTo r .

Давайте будем гением компьютера.