Excel 如何在SAP VBA脚本中创建循环

Excel 如何在SAP VBA脚本中创建循环,excel,vba,sap-erp,Excel,Vba,Sap Erp,我的VBA SAP脚本有问题。我在excel中有数据,我想通过复制和粘贴excel中的数据来执行事务代码IW41。我在Excel中有所有的数据,比如日期、订单数量、谁做的等等,我想实现自动化。我为变量I做了一个循环,但是我得到了一个错误,我无法修复它 错误: 运行时错误“619”:应用程序定义的错误或对象定义的错误 代码如下所示 你能给我一些专业的建议或者帮我修一下吗 出现错误的IW41屏幕: 代码: Sub ConfirmPM_Nots() SystemName = "C

我的VBA SAP脚本有问题。我在excel中有数据,我想通过复制和粘贴excel中的数据来执行事务代码
IW41
。我在Excel中有所有的数据,比如日期、订单数量、谁做的等等,我想实现自动化。我为变量
I
做了一个循环,但是我得到了一个错误,我无法修复它

错误:

运行时错误“619”:应用程序定义的错误或对象定义的错误

代码如下所示

你能给我一些专业的建议或者帮我修一下吗

出现错误的
IW41
屏幕:

代码:

Sub ConfirmPM_Nots()

    SystemName = "CCP"          'change as needed or use a variable
Transaction = "SESSION_MANAGER"      'change as needed or use a variable

On Error GoTo ErrorHandler:
If Not IsObject(Sap_Applic) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set Sap_Applic = SapGuiAuto.GetScriptingEngine
End If
On Error GoTo 0
koniec:
qConnections = Sap_Applic.Connections.Count
If qConnections = 0 Then
    MsgBox "No connection to SAP"
    End
End If

bSession = False
For iConnectionCounter = 0 To qConnections - 1
    Set Connection = Sap_Applic.Children(Int(iConnectionCounter))
    If Not Connection.Description = "" Then
    qSessions = Connection.Children.Count
        For iSessionCounter = 0 To qSessions - 1
            Set session = Connection.Children(Int(iSessionCounter))
        If session.info.SystemName <> SystemName Then Exit For
            If session.info.Transaction = Transaction Then
                bSession = True
                Exit For
            End If
        Next
    End If
    If bSession Then Exit For
Next

If Not bSession Then
    MsgBox SystemName & " not available or free session not available"
    End
End If

Do
i = 1
session.findById("wnd[0]").resizeWorkingPane 128, 37, False
session.findById("wnd[0]/tbar[0]/okcd").Text = "iw41"
session.findById("wnd[0]").sendVKey 0

Order = Cells(i, 1)
b = Cells(i, 2)
c = Cells(i, 3)
d = Cells(i, 4)

session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").Text = Order
session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").SetFocus
session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").caretPosition = 2
session.findById("wnd[0]").sendVKey 2
session.findById("wnd[0]/usr/chkAFRUD-AUERU").Selected = True
session.findById("wnd[0]/usr/chkAFRUD-LEKNW").Selected = True
session.findById("wnd[0]/usr/ctxtAFRUD-ISDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-IDAUR").Text = b
session.findById("wnd[0]/usr/ctxtAFRUD-IEDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").Text = d
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").SetFocus
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").caretPosition = 10

session.findById("wnd[0]/tbar[0]/btn[11]").press
   i = i + 1
Loop

Exit Sub

ErrorHandler:
MsgBox "No connection to SAP"
End

End Sub
Sub-ConfirmPM\u Nots()
SystemName=“CCP”根据需要更改或使用变量
Transaction=“SESSION\u MANAGER”'根据需要更改或使用变量
错误转到错误处理程序时:
如果不是IsObject(Sap_Applic),则
设置SapGuiAuto=GetObject(“SAPGUI”)
设置Sap_Applic=SapGuiAuto.GetScriptingEngine
如果结束
错误转到0
科尼克:
qConnections=Sap_Applic.Connections.Count
如果qConnections=0,则
MsgBox“未连接到SAP”
终点
如果结束
bSession=False
对于iConnectionCounter=0到qConnections-1
设置连接=Sap_Applic.Children(Int(iConnectionCounter))
如果不是连接。说明=“则
qSessions=Connection.Children.Count
对于iSessionCounter=0到qSessions-1
Set session=Connection.Children(Int(iSessionCounter))
如果是session.info.SystemName SystemName,则退出
如果session.info.Transaction=事务,则
bSession=True
退出
如果结束
下一个
如果结束
如果退出,则退出
下一个
如果不是bSession,那么
MsgBox SystemName&“不可用或空闲会话不可用”
终点
如果结束
做
i=1
session.findById(“wnd[0]”)。调整工作窗格大小128、37、False
session.findById(“wnd[0]/tbar[0]/okcd”).Text=“iw41”
session.findById(“wnd[0]”)。sendVKey 0
顺序=单元(i,1)
b=单元(i,2)
c=单元(i,3)
d=单元(i,4)
session.findById(“wnd[0]/usr/ctxtCORUF AUFNR”).Text=Order
session.findById(“wnd[0]/usr/ctxtCORUF AUFNR”).caretPosition=7
session.findById(“wnd[0]”)。sendVKey 0
session.findById(“wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD VORNR[1,0]”)。SetFocus
session.findById(“wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD VORNR[1,0]”。caretPosition=2
session.findById(“wnd[0]”)。sendVKey 2
session.findById(“wnd[0]/usr/chkAFRUD AUERU”)。Selected=True
session.findById(“wnd[0]/usr/chkAFRUD LEKNW”)。Selected=True
session.findById(“wnd[0]/usr/ctxtAFRUD ISDD”).Text=c
session.findById(“wnd[0]/usr/txtAFRUD-IDAUR”).Text=b
session.findById(“wnd[0]/usr/ctxtAFRUD IEDD”).Text=c
session.findById(“wnd[0]/usr/txtafrad-LTXA1”).Text=d
session.findById(“wnd[0]/usr/txtafrad-LTXA1”).SetFocus
session.findById(“wnd[0]/usr/txtafrad-LTXA1”)。caretPosition=10
session.findById(“wnd[0]/tbar[0]/btn[11]”。按
i=i+1
环
出口接头
错误处理程序:
MsgBox“未连接到SAP”
终点
端接头
“iw41”
(来自
session.findById(“wnd[0]/tbar[0]/okcd”)。Text=“iw41”
)仅在当前屏幕为开始菜单时有效。OK Code“/niw41”将始终有效!因此此代码可能有效(未经测试):


我还用
resizeWorkingPane
caretPosition
SetFocus
对行进行了注释,因为这通常是不需要的
resizeWorkingPane
将调整SAPGUI屏幕的大小,
caretPosition
是文本框中光标的位置。例如,如果要替换文本,有时需要。但在这种情况下肯定不会。

我想拍一张最差的照片是很困难的。。。我们看不到返回错误的黄线,这比错误本身更重要。你能编辑你的问题并复制返回错误的行吗?您好,我做了一个循环,但在这个地方的最后一个记录崩溃了:另外我还有一个问题,当没有记录时,如何使循环停止?循环应该如何终止?您在循环本身中没有
While
Until
条件,也没有
Exit Do
Exit Sub
。该循环将一直运行,直到程序崩溃。它不能在5行代码上停止。。。尝试在VBE中进行下一次修改:工具->选项->常规(选项卡),并选中“闯入类模块”。以下通道上出现错误:session.findById(“wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD VORNR[1,0]”。SetFocus
Do
i = 1
' session.findById("wnd[0]").resizeWorkingPane 128, 37, False
' iw41 only works in the start menu. OK-Code /niw41 will always work!
session.findById("wnd[0]/tbar[0]/okcd").Text = "/niw41"
session.findById("wnd[0]").sendVKey 0

Order = Cells(i, 1)
b = Cells(i, 2).value
c = Cells(i, 3).value
d = Cells(i, 4).value

session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").Text = Order
' session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").SetFocus
' session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").caretPosition = 2
session.findById("wnd[0]").sendVKey 2
session.findById("wnd[0]/usr/chkAFRUD-AUERU").Selected = True
session.findById("wnd[0]/usr/chkAFRUD-LEKNW").Selected = True
session.findById("wnd[0]/usr/ctxtAFRUD-ISDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-IDAUR").Text = b
session.findById("wnd[0]/usr/ctxtAFRUD-IEDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").Text = d
' session.findById("wnd[0]/usr/txtAFRUD-LTXA1").SetFocus
' session.findById("wnd[0]/usr/txtAFRUD-LTXA1").caretPosition = 10

session.findById("wnd[0]/tbar[0]/btn[11]").press
   i = i + 1
Loop