Вопрос:
Я использую следующий код для прокрутки листов 1-31, которые фильтруют каждый лист по значению в ячейке (“E1”) в листах (“RunFilter_2”), а затем копируют отфильтрованный диапазон и копируют в следующую пустую строку в листах ( “RunFilter_2”).
Ошибки кода, когда он не находит значения листов (“RunFilter_2”). Диапазон (“E1”) в столбце 18 активного листа.
Поэтому я добавил проверку диапазона, которая проверяет ли листы (“RunFilter_2”). Range (“E1”). Значение находится в столбце Range (“R: R”).
Но как я перехожу к следующему I, если rngFound ничего не значит?
Sub RunFilter2() Rows(«5:5»).Select Range(Selection, Selection.End(xlDown)).Select Selection.Delete Shift:=xlUp Range(«A1»).Select Dim wb As Workbook Dim ws As Worksheet Set wb = ActiveWorkbook Set ws = wb.sheets(«01») Dim WS_Count As Integer Dim I As Integer WS_Count = ActiveWorkbook.Worksheets.Count — 3 For I = 1 To WS_Count Dim LastRow As Long LastRow = ActiveSheet.UsedRange.Rows.Count sheets(I).Select Columns(«A:U»).Select Dim rng As Range Dim rngFound As Range Set rng = Range(«R:R») Set rngFound = rng.Find(sheets(«RunFilter_2»).Range(«E1»).Value) If rngFound Is Nothing Then ‘———————————- ‘ How do I code … GO TO Next I ‘———————————- Else: Selection.AutoFilter ActiveSheet.Range(«$A$1:$U» & LastRow).AutoFilter Field:=18, Criteria1:=sheets(«RunFilter_2»).Range(«E1»).Value Range(«A1»).Offset(1, 0).Select Rows(ActiveCell.Row).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy sheets(«RunFilter_2»).Select If Range(«A4»).Value = «» Then Range(«A4»).Select Else Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select End If ActiveSheet.Paste ws.Select Application.CutCopyMode = False Selection.AutoFilter Range(«A1»).Select sheets(«RunFilter_2»).Select Next I End Sub Лучший ответ:
Поместите некоторую метку перед Next I:
NextI: Next I
Тогда вы можете сделать это:
If rngFound Is Nothing Then Goto NextI Else ….
В качестве альтернативы вы можете упростить его, не требуя выражения else
If rngFound Is Nothing Then Goto NextI …. ‘ Proceed without the need for ‘Else’ and ‘End If’
EDIT.. Еще несколько
В то время как обычно считается, что плохая практика программирования использует заявления Goto, это не так в этой конкретной ситуации. Он просто используется в качестве обходного пути из-за отсутствия оператора continue который существует на языках C и производных.
Ответ №1
Вы можете сделать это следующим образом:
For I = 1 To WS_Count If rngFound Is Nothing Then goto NextIPlace your code NextIPlace: Next I
Но вы должны пересмотреть так, как это, это не хорошая практика VBA для использования GoTo. Весь код должен быть изменен. Подробнее здесь. Как только ваш код работает, не стесняйтесь отправить его на https://codereview.stackexchange.com/, они дадут вам хорошие идеи.
Ответ №2
Здесь нет необходимости использовать GoTo. Простой способ выполнить это:
For I = 1 To WS_Count ‘ do stuff If Not rngFound is Nothing ‘execute desired action End If ‘ do more stuff Next i
Вы также можете поместить do more stuff в первый блок if, если это необходимо. Код в вашем сообщении был довольно грязным, и я не успел вскрыть полностью.
Ответ №3
вы должны добавить маркер перед Next I
MARKER: Next I
Итак, после того, как If rngFound Is Nothing Then вы добавите GoTo MARKER