我有一段代码,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'
有什么关系?
答案 0 :(得分:1)
错误处理程序一次只能处理一个错误。您的处理程序未重置,因此在仍处理第一个错误时遇到第二个错误。
重置处理程序的唯一方法是执行以下操作之一:
Resume
Exit Sub
Exit Function
Exit Property
On Error Goto -1
请注意,Err.Clear
和On Error Goto 0
将清除错误号,但不会重置操作者。另外,On Error Resume Next
与Resume
(在上方)不同,因此也不会重置处理程序。
您的解决方案:将GoTo Check
替换为Resume Check
使用Resume Check
将重置处理程序,并将执行发送给Label
,就像您的GoTo
一样。这也将解决您的GoTo
可能引起的无限循环。大概应该只在引发错误后才执行代码块,因此您可能要在Exit Sub
上方使用Exit Function
或errHandler:
。