VBA无法遍历行

时间:2019-09-26 01:15:23

标签: vba sap sap-gui

我有一段代码,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可以正常工作,并且如果存在rowserror,则转到另一个errHandler会执行操作,但会返回到check:并再次在相同的row上执行。还要让大家知道,即时搜索中的firstChar并不存在于每个row中,它可以位于row 10上,下一个将是55th。 另外,我通过将i = i + 1添加到errHandler进行测试,然后通过转到下一个error成功地避免了第一个row。但是,如果遇到另一个error,则会在同一row上再次执行相同的操作。与找到char 'A''B''C'有什么关系?

1 个答案:

答案 0 :(得分:1)

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

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

  • 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可能引起的无限循环。大概应该只在引发错误后才执行代码块,因此您可能要在Exit Sub上方使用Exit FunctionerrHandler: