VBA не может перебирать строки - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть фрагмент кода, который loops через мой rows в Excel, и нахожу первый character из string в конкретном column.Хотя это прекрасно работает с i = i + 1, когда первый condition пройден, он затем выполнит другое действие.Внутри действия иногда происходит errors, поэтому я помещаю On error Handlers, чтобы перейти к следующему row.Вот код, который у меня есть.

On Error GoTo errHandler
Check:
    While Cells(7 + i, 1).Value <> ""
        firstChar = Left(Cells(7 + i, 6).Value, 1)
        If firstChar = "A" Then
            .findById("wnd[0]/tbar[0]/okcd").Text = "/nmm02"
            .findById("wnd[0]").sendVKey 0
            .findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = ""
            .findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = Cells(7 + i, 2)
            .findById("wnd[0]").sendVKey 0
            .findById("wnd[1]/tbar[0]/btn[0]").press
            .findById("wnd[1]/usr/ctxtRMMG1-LGTYP").Text = "AN1"
            .findById("wnd[1]/usr/ctxtRMMG1-LGTYP").SetFocus
            .findById("wnd[1]/usr/ctxtRMMG1-LGTYP").caretPosition = 3
            .findById("wnd[1]/tbar[0]/btn[0]").press
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP21/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2731/ctxtMLGN-PLKPT").Text = "AN1"
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP21/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2733/ctxtMLGN-LTKZA").Text = "AN1"
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP21/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2733/ctxtMLGN-LTKZE").Text = "AN1"
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP21/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2733/ctxtMLGN-LTKZE").SetFocus
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP21/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2733/ctxtMLGN-LTKZE").caretPosition = 3
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP22").Select
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP22/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2734/ctxtMLGT-LGPLA").Text = Cells(7 + i, 6)
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP22/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2734/ctxtMLGT-LGPLA").SetFocus
            .findById("wnd[0]/usr/tabsTABSPR1/tabpSP22/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2734/ctxtMLGT-LGPLA").caretPosition = 8
            .findById("wnd[0]/tbar[0]/btn[11]").press
            .findById("wnd[0]/tbar[0]/okcd").Text = "/N"
            .findById("wnd[0]").sendVKey 0
        ElseIf firstChar = "B" Then
             #another action
        ElseIf firstChar = "C" Then
             #another action
        Else:
        End If
        i = i + 1
errHandler:
    Cells(7 + i, 9).Value = "Error"
    session.findById("wnd[2]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/tbar[0]/btn[12]").press
    session.findById("wnd[0]/tbar[0]/okcd").Text = "/n"
    GoTo Check

В принципе, если между действиями нет ошибок, loop работает нормально и переходит к другому rows, если есть error, errHandler действие будет выполнено, но оно вернется к check: и снова выполнит тот же row.Также просто, чтобы все знали, что firstChar, который я ищу, не существует в каждом row, он может быть на row 10, а следующий будет 55th.Кроме того, я протестировал, добавив i = i + 1 к errHandler, и да, первый error был успешно исключен путем перехода к следующему row.Однако, если он встречает другой error, то же самое происходит снова, выполняя тот же row.Это как-то связано с поиском char 'A', 'B', 'C'?

1 Ответ

1 голос
/ 26 сентября 2019

Обработчик ошибок может обрабатывать только одну ошибку за раз.Ваш обработчик не был сброшен, поэтому он сталкивается со второй ошибкой во время обработки первой.

Единственный способ сбросить обработчик - выполнить одно из следующих действий:

  • Resume

  • Exit Sub

  • Exit Function

  • Exit Property

  • On Error Goto -1

Обратите внимание, что Err.Clear и On Error Goto 0 сбросят номер ошибки, ноони не будут сбрасывать handier.Кроме того, On Error Resume Next - это не то же самое, что Resume (выше), поэтому он не сбросит ваш обработчик.

Ваше решение: заменить GoTo Check на Resume Check

Использование Resume Check сбросит обработчик и отправит выполнение на Label точно так же, как ваш GoTo.Это также исправит бесконечный цикл, который кажется причиной вашего GoTo.Предположительно, этот блок кода должен выполняться только после появления ошибки, поэтому вы можете использовать Exit Sub или Exit Function выше errHandler:.

...