VBA 无法遍历行

VBA cannot loop through rows

我有一段代码 loops 通过我在 excel 中的 rows 并在特定 string 中找到第一个 character =16=]。虽然这与 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,如果有 errorerrHandler 的操作将被执行,但它会返回到 check: 并再次执行相同的 row。也让大家知道,我要找的firstChar并不是每个row都有的,可以在row 10,下一个就是55th。 此外,我通过将 i = i + 1 添加到 errHandler 进行了测试,是的,通过转到下一个 row 成功避免了第一个 error。但是,如果遇到另一个error,同样的事情再次发生,在同一个row上执行。跟找char'A','B','C'有关系吗?

错误处理程序一次只能处理一个错误。您的处理程序未重置,因此它在处理第一个错误时遇到了第二个错误。

重置处理程序的唯一方法是执行以下操作之一:

  • Resume

  • Exit Sub

  • Exit Function

  • Exit Property

  • On Error Goto -1

请注意,Err.ClearOn Error Goto 0会清除错误编号,但不会重置手柄。此外,On Error Resume NextResume(以上)不同,因此它也不会重置您的处理程序。

您的解决方案:GoTo Check 替换为 Resume Check

使用 Resume Check 将重置处理程序并将执行发送到 Label,就像您的 GoTo 一样。这也将修复您的 GoTo 似乎导致的无限循环。据推测,该代码块只应在引发错误后执行,因此您可能希望在 errHandler:.

上方使用 Exit SubExit Function