使用VBA for SAP GUI脚本比较excel中的2个单元格

使用VBA for SAP GUI脚本比较excel中的2个单元格,excel,vba,sap-gui,Excel,Vba,Sap Gui,目前,我有一个脚本,可以从excel工作表复制数据并将其粘贴到SAP中的事务代码scal中 我的代码所做的是按每个ID(例如AA/AB)过滤日历选择,然后将开始日期和结束日期的数据复制到scal ID中。保存更改,然后移动到下一个ID 假设我有一个excel工作表,其中有多个相同日历ID的条目。我可以如何让excel检查下一行是否与当前行具有相同的日历ID,然后,复制并粘贴相同ID的开始/结束日期,而不是保存,然后再移到下一行 tldr:比较当前列和下面的列;如果两列相同,则继续更改;否则保存

目前,我有一个脚本,可以从excel工作表复制数据并将其粘贴到SAP中的事务代码scal中

我的代码所做的是按每个ID(例如AA/AB)过滤日历选择,然后将开始日期和结束日期的数据复制到scal ID中。保存更改,然后移动到下一个ID

假设我有一个excel工作表,其中有多个相同日历ID的条目。我可以如何让excel检查下一行是否与当前行具有相同的日历ID,然后,复制并粘贴相同ID的开始/结束日期,而不是保存,然后再移到下一行

tldr:比较当前列和下面的列;如果两列相同,则继续更改;否则保存并返回

代码如下:

Sub Main()
    Dim row As Integer
    Dim Session

'1. System name entry
    sSystemName = sSystemName_EntrySTD()
'2. Connect to open SAP session
    If bSessionConfirmSTD(Session, sSystemName) = False Then
        MsgBox sSystemName & " session is not opened", vbCritical
        End
    End If

'3. Display status in EXCEL
    application.StatusBar = "Attached to active session"

    On Error Resume Next

'4. for all rows in active sheet (Tabelle1)
    row = 2
    While Tabelle1.Cells(row, 1).Value <> ""

        Dim s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19 As String
        Dim i As Integer

'5. Get value from first column of current row
        s1 = Tabelle1.Cells(row, 1).Value
        s2 = Tabelle1.Cells(row, 2).Value
        s3 = Tabelle1.Cells(row, 3).Value
        s4 = Tabelle1.Cells(row, 4).Value
        s5 = Tabelle1.Cells(row, 5).Value
        s6 = Tabelle1.Cells(row, 6).Value
        s7 = Tabelle1.Cells(row, 7).Value
        s8 = Tabelle1.Cells(row, 8).Value
        s9 = Tabelle1.Cells(row, 9).Value
        s10 = Tabelle1.Cells(row, 10).Value
        s11 = Tabelle1.Cells(row, 11).Value
        s12 = Tabelle1.Cells(row, 12).Value
        s13 = Tabelle1.Cells(row, 13).Value
        s14 = Tabelle1.Cells(row, 14).Value
        s15 = Tabelle1.Cells(row, 15).Value
        s16 = Tabelle1.Cells(row, 16).Value
        s17 = Tabelle1.Cells(row, 17).Value
        s18 = Tabelle1.Cells(row, 18).Value
        s19 = Tabelle1.Cells(row, 19).Value

'6. Update status in EXCEL
        application.StatusBar = "Processing row " & RTrim(LTrim(Str(row))) & ": " & s1

'BEGIN Paste your script here
'===============================================================================================================

Session.findById("wnd[0]").maximize
Session.findById("wnd[0]/tbar[0]/okcd").Text = "scal"
Session.findById("wnd[0]").sendVKey 0
Session.findById("wnd[0]/usr/radFMEN-FABKAL").Select
Session.findById("wnd[0]/usr/radFMEN-FABKAL").SetFocus
Session.findById("wnd[0]/usr/btnUPDATE").press
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").currentCellRow = -1
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectColumn "IDENT"
Session.findById("wnd[0]/tbar[1]/btn[38]").press
Session.findById("wnd[1]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/ctxt%%DYN001-LOW").Text = s1
Session.findById("wnd[1]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/ctxt%%DYN001-LOW").caretPosition = 2
Session.findById("wnd[1]").sendVKey 0
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").currentCellColumn = ""
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectedRows = "0"
Session.findById("wnd[0]/tbar[1]/btn[7]").press
Session.findById("wnd[0]/tbar[1]/btn[17]").press
Session.findById("wnd[0]/tbar[1]/btn[13]").press
Session.findById("wnd[1]/usr/chkTIFAB-ARBTAG").Selected = s4
Session.findById("wnd[1]/usr/ctxtTIFAB-DATUMVON").Text = s2
Session.findById("wnd[1]/usr/ctxtTIFAB-DATUMBIS").Text = s3
Session.findById("wnd[1]/usr/txtTFAIT-LTEXT").Text = s5
Session.findById("wnd[1]/usr/txtTFAIT-LTEXT").SetFocus
Session.findById("wnd[1]/usr/txtTFAIT-LTEXT").caretPosition = 11
Session.findById("wnd[1]").sendVKey 0



'===============================================================================================================
'END Paste your script here
Tabelle1.Cells(row, 15).Value = Session.findById("wnd[0]/sbar").Text

'7. Log processed entries in Tabelle1
        Tabelle1.Cells(row, 16).Value = "Done"
'8. Continue with next row
        row = row + 1

    Wend

    application.StatusBar = "Processing finished"

    On Error GoTo 0
    Exit Sub

info:
    MsgBox "error on line " & row

End Sub
Sub-Main()
将行设置为整数
昏暗的会议
'1.系统名称条目
sSystemName=sSystemName\u EntrySTD()
“2.连接到打开的SAP会话
如果bSessionConfirmSTD(会话,sSystemName)=False,则
MsgBox sSystemName&“会话未打开”,vbCritical
终点
如果结束
'3.在EXCEL中显示状态
application.StatusBar=“已附加到活动会话”
出错时继续下一步
'4.对于活动工作表中的所有行(表1)
行=2
而Tabelle1.Cells(行,1.Value“”
尺寸s1、s2、s3、s4、s5、s6、s7、s8、s9、s10、s11、s12、s13、s14、s15、s16、s17、s18、s19作为字符串
作为整数的Dim i
'5.从当前行的第一列获取值
s1=表1.单元格(第1行).值
s2=表1.单元格(第2行).值
s3=表1.单元格(第3行).值
s4=表1.单元格(第4行).值
s5=表1.单元格(第5行).值
s6=表1.单元格(第6行).值
s7=表1.单元格(第7行).值
s8=表1.单元格(第8行).值
s9=表1.单元格(第9行).值
s10=表1.单元格(第10行).值
s11=表1.单元格(第11行).值
s12=表1.单元格(第12行).值
s13=表1.单元格(第13行).值
s14=表1.单元格(第14行).值
s15=表1.单元格(第15行).值
s16=表1.单元格(第16行).值
s17=表1.单元格(第17行).值
s18=表1.单元格(第18行).值
s19=表1.单元格(第19行).值
“6.在EXCEL中更新状态
application.StatusBar=“处理行”和RTrim(LTrim(Str(row))&”:“&s1
'开始在此处粘贴脚本
'===============================================================================================================
Session.findById(“wnd[0]”)。最大化
Session.findById(“wnd[0]/tbar[0]/okcd”).Text=“scal”
Session.findById(“wnd[0]”)。sendVKey 0
Session.findById(“wnd[0]/usr/radFMEN FABKAL”)。选择
Session.findById(“wnd[0]/usr/radFMEN FABKAL”).SetFocus
Session.findById(“wnd[0]/usr/btnUPDATE”)。按
Session.findById(“wnd[0]/usr/cntlGRID1/shellcont/shell”)。currentCellRow=-1
Session.findById(“wnd[0]/usr/cntlGRID1/shellcont/shell”)。选择列“IDENT”
Session.findById(“wnd[0]/tbar[1]/btn[38]”。按
Session.findById(“wnd[1]/usr/ssub%\u子屏幕\u FREESEL:SAPLSSEL:1105/ctxt%%DYN001-LOW”)。Text=s1
Session.findById(“wnd[1]/usr/ssub%\u子屏幕\u FREESEL:SAPLSSEL:1105/ctxt%%DYN001-LOW”)。caretPosition=2
Session.findById(“wnd[1]”)。sendVKey 0
Session.findById(“wnd[0]/usr/cntlGRID1/shellcont/shell”).currentCellColumn=“”
Session.findById(“wnd[0]/usr/cntlGRID1/shellcont/shell”)。selectedRows=“0”
Session.findById(“wnd[0]/tbar[1]/btn[7]”。按
Session.findById(“wnd[0]/tbar[1]/btn[17]”。按
Session.findById(“wnd[0]/tbar[1]/btn[13]”。按
Session.findById(“wnd[1]/usr/chkTIFAB ARBTAG”)。选中=s4
Session.findById(“wnd[1]/usr/ctxtTIFAB DATUMVON”).Text=s2
Session.findById(“wnd[1]/usr/ctxtTIFAB DATUMBIS”).Text=s3
Session.findById(“wnd[1]/usr/txtTFAIT LTEXT”).Text=s5
Session.findById(“wnd[1]/usr/txtTFAIT LTEXT”).SetFocus
Session.findById(“wnd[1]/usr/txtTFAIT LTEXT”).caretPosition=11
Session.findById(“wnd[1]”)。sendVKey 0
'===============================================================================================================
'结束在此处粘贴脚本
Tabelle1.Cells(第15行).Value=Session.findById(“wnd[0]/sbar”).Text
'7.在选项卡1中记录已处理的条目
表1.单元格(第16行)。Value=“完成”
'8.继续下一行
行=行+1
温德
application.StatusBar=“处理完成”
错误转到0
出口接头
信息:
MsgBox“第行出错”&行
端接头

不知道我是否正确理解了它,实际上应该比较什么。但一个可能的解决方案可能如下所示:

. . .
'4. for all rows in active sheet (Tabelle1)
row = 2
While Tabelle1.Cells(row, 1).Value <> ""

    Dim s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19 As String
    Dim i As Integer

'5. Get value from first column of current row
    s1 = Tabelle1.Cells(row, 1).Value
    if Tabelle1.Cells(row + 1, 1).Value <> "" then
       if s1 = Tabelle1.Cells(row + 1, 1).Value then row = row + 1
    end if
    s2 = Tabelle1.Cells(row, 2).Value
    . . .
。
'4.对于活动工作表中的所有行(表1)
行=2
而Tabelle1.Cells(行,1.Value“”
尺寸s1、s2、s3、s4、s5、s6、s7、s8、s9、s10、s11、s12、s13、s14、s15、s16、s17、s18、s19作为字符串
作为整数的Dim i
'5.从当前行的第一列获取值
s1=表1.单元格(第1行).值
如果表1.Cells(行+1,1).Value为“”,则
如果s1=Tabelle1.Cells(行+1,1).Value,则行=行+1
如果结束
s2=表1.单元格(第2行).值
. . .
问候,,
ScriptMan

请回答您的问题,并展示您迄今为止为实现您的要求所做的努力(包括您遇到了哪些错误,在哪里,或者您的代码在哪里被卡住):感谢您的留言。我已将代码添加到我的帖子中。我要做的是比较正在读取的列上的ID和下一列上的ID是否相同。① 在没有错误处理的情况下,不要在错误恢复下使用
。这只是隐藏了所有的错误,但它们仍然会发生,您只是看不到它们。它会使您失明,您无法修复代码,因为您看不到错误。移除它。② 我们现在知道你在尝试什么,但你没有说你是如何尝试实现这一目标的,以及在尝试过程中出现了什么问题?您从哪里得到错误?哪些错误?感谢您的反馈。不幸的是,我遇到的问题