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
,如果有 error
,errHandler
的操作将被执行,但它会返回到 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.Clear
和On Error Goto 0
会清除错误编号,但不会重置手柄。此外,On Error Resume Next
与 Resume
(以上)不同,因此它也不会重置您的处理程序。
您的解决方案: 将 GoTo Check
替换为 Resume Check
使用 Resume Check
将重置处理程序并将执行发送到 Label
,就像您的 GoTo
一样。这也将修复您的 GoTo
似乎导致的无限循环。据推测,该代码块只应在引发错误后执行,因此您可能希望在 errHandler:
.
上方使用 Exit Sub
或 Exit Function
我有一段代码 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
,如果有 error
,errHandler
的操作将被执行,但它会返回到 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.Clear
和On Error Goto 0
会清除错误编号,但不会重置手柄。此外,On Error Resume Next
与 Resume
(以上)不同,因此它也不会重置您的处理程序。
您的解决方案: 将 GoTo Check
替换为 Resume Check
使用 Resume Check
将重置处理程序并将执行发送到 Label
,就像您的 GoTo
一样。这也将修复您的 GoTo
似乎导致的无限循环。据推测,该代码块只应在引发错误后执行,因此您可能希望在 errHandler:
.
Exit Sub
或 Exit Function