Не удается устранить ошибку времени выполнения 92: цикл не инициализирован. Любая идея? - PullRequest
0 голосов
/ 20 марта 2019


У меня есть небольшой цикл, чтобы проверить все рабочие листы и прошлое и скопировать столбец, если соблюдены определенные критерии.Однако после того, как все рабочие листы заполнены, я запускаю сообщение «Ошибка времени выполнения 92: цикл не инициализирован».Я понимаю, что Next ws будет обрабатываться до тех пор, пока выполняется цикл (до самого последнего рабочего листа) или если произойдет ошибка.Я не понимаю, почему Next ws используется после завершения цикла.
У вас есть идеи, что я делаю неправильно?
Заранее большое спасибо!

Dim MonthBC As String
Dim YearBC As String
Dim Phase As String
Dim colBC As Long
Dim colNo As Long
Dim vCol As Variant
Dim coli As Long

MonthBC = Form_Start_Update.ComboBox_Month.Value
YearBC = Form_Start_Update.ComboBox_Year.Value
Phase = "Plan"

For Each ws In ThisWorkbook.Worksheets
    With ws
        Debug.Print ws.Range("A1").Parent.Name
        colNo = ws.Cells(8, Columns.Count).End(xlToLeft).Column
        vCol = Application.WorksheetFunction.Transpose(ws.Range(Cells(8, 1).Address, Cells(10, colNo).Address).Value2)
        If colNo = 1 Then
        GoTo Continue_Next
        Else
            For coli = LBound(vCol, 1) To UBound(vCol, 1)
                On Error GoTo Continue_Next
                If IsDate(vCol(coli, 1)) = True Then
                    vCol(coli, 1) = Year(vCol(coli, 1))
                End If
                If vCol(coli, 1) = YearBC Then
                    If vCol(coli, 2) = MonthBC Then
                        If vCol(coli, 3) = Phase Then
                        colBC = coli
                        ws.Range(Cells(1, colBC + 1).Address).EntireColumn.Insert
                        ws.Range(Cells(1, colBC).Address, Cells(Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row, colBC).Address).Copy
                        ws.Range(Cells(1, colBC + 1).Address).PasteSpecial Paste:=xlPasteValues
                        ws.Range(Cells(11, 10).Address, Cells(Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row, 10).Address).Copy
                        ws.Range(Cells(11, colBC).Address).PasteSpecial Paste:=xlPasteFormulas
                        End If
                    End If
                End If
            Next coli
        End If
    End With

Continue_Next:
    Next ws

1 Ответ

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

Проблема заключается в использовании меток внутри цикла.Измените логику своего кода и избавьтесь от них.К вашему сведению, вам нужно сбросить процедуру обработки ошибок, когда вы переходите к метке при ошибке, но опять же, вы все равно хотите избавиться от меток.

/ e: если быть более точным, on error goto Continue_Next переходит к метке, которая находится за пределамицикла, и я считаю, что это вызывает ошибку.Если вы ожидаете ошибки здесь, поместите On Error Resume Next сверху, проверьте свою ошибку, затем If Err.Number > 0 then Exit For - ярлык не нужен.Не забудьте очистить процедуру обработки ошибок и ошибок.Попробуйте что-то вроде этого:

For Each ws In ThisWorkbook.Worksheets

    Debug.Print ws.Range("A1").Parent.Name
    colNo = ws.Cells(8, Columns.count).End(xlToLeft).Column
    vCol = Application.WorksheetFunction.Transpose(ws.Range(Cells(8, 1).Address, Cells(10, colNo).Address).Value2)

    If colNo > 1 Then
        For coli = LBound(vCol, 1) To UBound(vCol, 1)
            On Error Resume Next
            'test your error
            If Err.number > 0 Then Exit For
            On Error GoTo 0
            If IsDate(vCol(coli, 1)) = True Then vCol(coli, 1) = Year(vCol(coli, 1))
            If vCol(coli, 1) = YearBC Then
                If vCol(coli, 2) = MonthBC Then
                    If vCol(coli, 3) = Phase Then
                        colBC = coli
                        ws.Range(Cells(1, colBC + 1).Address).EntireColumn.Insert
                        ws.Range(Cells(1, colBC).Address, Cells(Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).row, colBC).Address).Copy
                        ws.Range(Cells(1, colBC + 1).Address).PasteSpecial Paste:=xlPasteValues
                        ws.Range(Cells(11, 10).Address, Cells(Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).row, 10).Address).Copy
                        ws.Range(Cells(11, colBC).Address).PasteSpecial Paste:=xlPasteFormulas
                    End If
                End If
            End If
        Next coli
        On Error GoTo 0
    End If
Next ws
...