【SAP GUI 脚本 VBA】

4 篇文章 1 订阅
1 篇文章 0 订阅

目录

启用 SAP脚本

Tracker

Excel启用VBA

对象声明

用法

TEXT文本

Press点击

Key选择

Selected复选框

判断字段是否存在

VerticalScrollbar 滑动滚动条

Enter

粘贴剪贴板

读取shell

读取shell[1]

VBS登入SAP

 实例

函数-提取Tcode 

 登入开发区

CO03

MM03

CS15

TEST

KS13

KSH1

KSH2

KSH3

FS00

SM30

Tcode

CKM3N

FB02

KSU1

KSU2

KSU3

KSV1、KSV2、KSV3

与其他方式对比



启用 SAP脚本

1.使用前“脚本录制和回放”的功能是要开启状态。如果没开启是要找管理员开启。

2.点击后红色按钮开启录制

 

3.此时可以在SAP里进行手动操作,可以记录下用户操作的脚本。

录制完之后可以点击关闭。再点击“更多”。

4.可以把这个Script1.vbs这个复制到桌面,把后缀名改成txt

 如下是进入MM03查询了某个料号的脚本。

Tracker

进入SAP后,启用Tracker,点击这个 图标。可以查询程式里字段的ID。 

如物料的ID是

wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB1:SAPLMGD1:1002/ctxtRMMG1-MATNR

Excel启用VBA

勾选“开发工具”

点击“宏安全性”

点击“启用所有宏”。关闭EXCEL再打开即可。

点击“Visual Basic”

进入后点击插入

点击插入模块

在编辑界面输入SUB,命名程序后回车

可以复制录制脚本的代码进去,点击执行即可

录制的这个部分是VBS的内容,不能在EXCEL里执行,要改下。

对象声明

改成的这个如果没进入SAP的话会报错,并要调试。

   Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

 如果没进SAP的话,改成MsgBox提醒错误

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    On Error Resume Next
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    If Err > 0 Then
        MsgBox "请检查是否登入SAP", vbExclamation
        Exit Sub
    End If
    On Error GoTo 0

定义函数直接调用,更方便

Public session As Object

Function MyConnectSAP() As Boolean
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object
    
    On Error Resume Next
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    If Err > 0 Then
        MsgBox "请检查是否登入SAP", vbExclamation
        MyConnectSAP = True
    Else
        MyConnectSAP = False
    End If
    
    Set SapGuiAuto = Nothing
    Set AppSap = Nothing
    Set Connection = Nothing
End Function

用法

TEXT文本

在栏位里输入文本,例如

session.findById("wnd[0]/tbar[0]/okcd").Text = "/NCKM3N"

Press点击

点击,例如:

session.findById("wnd[0]/tbar[1]/btn[13]").press

Key选择

选择,例如:

session.findById("wnd[0]/usr/cmbMLKEY-CURTP").Key = "10"

Selected复选框

可以操作复选框,TRUE表示勾选,FALSE表示不勾选

session.findById("wnd[0]/usr/chkPA_XKONS").Selected = False

判断字段是否存在

如下是判断某个字段确实存在,删去Not表示判断某个字段确实不存在

If Not session.findById("wnd[2]/usr/txtMESSTXT1", False) Is Nothing Then

End If

VerticalScrollbar 滑动滚动条

16代表一次滑动16个栏位

session.findById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").verticalScrollbar.Position = 16

Enter

输入Enter键

session.findById("wnd[0]").sendVKey 0

粘贴剪贴板

先声明了字典d,在Excel中取值(此处省略了这个部分),然后通过“多项选择”,除去重复值后,粘贴到剪贴板中

Dim objData As New MSForms.DataObject, d As Object
Dim objData As New MSForms.DataObject

With session
    .findById("wnd[0]/usr/btn%_SO_WERKS_%_APP_%-VALU_PUSH").press '点击
    objData.SetText Join(d.keys, Chr(13) & Chr(10))
    objData.PutInClipboard '复制到剪贴板中
    .findById("wnd[1]/tbar[0]/btn[16]").press '删除整个选择
    .findById("wnd[1]/tbar[0]/btn[24]").press '自剪切板上载
    .findById("wnd[1]/tbar[0]/btn[8]").press '点击
    d.RemoveAll '删除
End With

读取shell

'读取shell时不同于text,要通过循环取值
'把取到的shell赋值给Table
'Table.RowCount表示总行数
'Table.ColumnCount表示总列数
'Table.ColumnOrder可以取列名
'Table.getcellvalue 可以取表的值
'例如此处把取到的Table传到了数组arr里,然后在读取到Excel中

Dim x As Integer, y As Integer, k As Integer, arr(), Title()
ReDim arr(1 To 100000, 1 To 15)
ReDim Title(1 To 15)

With session
    Set Table = .findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell")
    Set Columns = Table.ColumnOrder() '取列
    For x = 0 To Table.RowCount() - 1 'Table.RowCount表示为总行数
        k = k + 1
        For y = 0 To Table.ColumnCount() - 1
            arr(k, y + 1) = Table.getcellvalue(x, CStr(Columns(y))) '取值
        Next y
    Next x
    For y = 0 To Table.ColumnCount() - 1
        Title(y + 1) = CStr(Columns(y)) 'Columns返回标题文本
    Next y
End With

读取shell[1]

    '读取shell[1]里隐藏的内容时需要打开节点
    'Table.GetAllNodeKeys 表示所有的节点,返回值是数字
    'Table.expandNode 打开节点
    'Table.GetAllNodeKeys.Count 表示总节点数
    'Table.getitemtext 可以获取内容
    
    Dim Table As Object, GetNodeK As Object, arr(), i As Integer, x
    
    '进入程式获取节点
    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/NFS00"
        .findById("wnd[0]").sendVKey 0 'Enter
        Set Table = .findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]")
        Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
    End With
    
    '打开所有节点
    For x = GetNodeK.Count - 1 To 0 Step -1
        Table.expandNode GetNodeK.Item(x)
    Next x
    
    '重新读取shell[1]
    Set Table = session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]")
    Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
    For x = 0 To GetNodeK.Count - 1
        i = i + 1
        ReDim Preserve arr(1 To i)
        arr(i) = GetNodeK.Item(x) '节点
        arr(i) = Table.getitemtext(arr(i), "&Hierarchy") '获得内容
    Next x

VBS登入SAP

 VBS登入SAP开发区110

这个能不能成功运行,主要还是靠SendKeys操作键盘,让SAP弹出输入密码的界面,网络延迟,或者SAP Logon不是当时的选择的状态的话都有可能登不上。

Dim wsh
Set wsh = CreateObject("Wscript.shell")
'如果路径中带空格需要用chr(34)&"path"& chr(34)包起来
wsh.Run Chr(34) & "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" & Chr(34)

wscript.sleep 500
wsh.SendKeys "~"
wscript.sleep 2000

If Not IsObject(Application) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set Application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = Application.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(wscript) Then
   wscript.ConnectObject session, "on"
   wscript.ConnectObject Application, "on"
End If

With session
    .findById("wnd[0]").maximize
    .findById("wnd[0]/usr/txtRSYST-MANDT").Text = "110"
    .findById("wnd[0]/usr/txtRSYST-BNAME").Text = "C10089213"
    .findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "" '密码
    .findById("wnd[0]").sendVKey 0
End With

 实例

函数-提取Tcode 

Function MyGetSAPtCode() As String
    If MyConnectSAP() Then Exit Function
    
    Application.Volatile
    
    MyGetSAPtCode = session.findById("wnd[0]/sbar/pane[1]").Text
    
    Set session = Nothing
End Function

 登入开发区

Sub 登入110()
    Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus
    Application.Wait (Now() + TimeValue("00:00:02"))
    SendKeys "~"
    Application.Wait (Now() + TimeValue("00:00:04")) '如果系统反应不过来的话后面会赋值不到,有必要的话可以延长时间

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/usr/txtRSYST-MANDT").Text = "110"
        .findById("wnd[0]/usr/txtRSYST-BNAME").Text = "C10089213"
        .findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "" '密码
        .findById("wnd[0]").sendVKey 0
    End With
End Sub

CO03

CO03中批量查询研发工单的信息

Sub CO03_显示_结算规则()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示CO03?" & Chr(10) & " " & Chr(10), vbYesNo, "CO03")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, y As Integer, sr As String, rg As Range, arr1(), i As Integer, bl As Boolean
    Dim Table As Object, Columns As Object
    ReDim arr2(1 To 1000, 1 To 10)

    sr = "CO03"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value
 
    With session
        For x = 2 To UBound(arr1)
            If arr1(x, 1) = "" Then Exit For
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NCO03"
            .findById("wnd[0]").sendVKey 0 'Enter
            .findById("wnd[0]/usr/ctxtCAUFVD-AUFNR").Text = arr1(x, 1) '工单
            .findById("wnd[0]").sendVKey 0 '
            arr2(x - 1, 1) = "'" & .findById("wnd[0]/usr/ctxtCAUFVD-WERKS").Text '工厂
            .findById("wnd[0]/usr/tabsTABSTRIP_0115/tabpVERW").Select '管理
            arr2(x - 1, 2) = .findById("wnd[0]/usr/tabsTABSTRIP_0115/tabpVERW/ssubSUBSCR_0115:SAPLCOKO1:0170/txtCAUFVD-ERNAM").Text '创建
            arr2(x - 1, 3) = .findById("wnd[0]/usr/tabsTABSTRIP_0115/tabpVERW/ssubSUBSCR_0115:SAPLCOKO1:0170/txtCAUFVD-AENAM").Text '更改
            .findById("wnd[0]/mbar/menu[4]/menu[3]").Select '结算规则
            arr2(x - 1, 4) = .findById("wnd[0]/usr/tblSAPLKOBSTC_RULES/ctxtCOBRB-KONTY[0,1]").Text 'CTR
            .findById("wnd[0]").sendVKey 2 '进入结算规则里
            arr2(x - 1, 5) = .findById("wnd[0]/usr/subBLOCK1:SAPLKOBS:0200/txtCOBR_INFO-OBJ_TEXT").Text ' 工单说明
            arr2(x - 1, 6) = .findById("wnd[0]/usr/subBLOCK2:SAPLKACB:1014/ctxtCOBL-KOSTL").Text '成本中心
            arr2(x - 1, 7) = .findById("wnd[0]/usr/subBLOCK2:SAPLKACB:1014/ctxtCOBL-PS_POSID").Text 'WBS元素
            arr2(x - 1, 8) = .findById("wnd[0]/usr/subBLOCK2:SAPLKACB:1014/ctxtCOBL-SAKNR").Text '总账科目
            arr2(x - 1, 9) = .findById("wnd[0]/usr/subBLOCK2:SAPLKACB:1014/ctxtCOBL-PRCTR").Text '利润中心
            arr2(x - 1, 10) = .findById("wnd[0]/usr/txtCOBRB-PROZS").Text '百分比
        Next x
    End With
    
    With ThisWorkbook.Sheets("CO03")
        .AutoFilterMode = False
        With .Cells(1, 2)
            .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
            .Resize(1, UBound(arr2, 2)) = Split("工厂;创建人;更改人;CTR;工单说明;成本中心;WBS元素;总账科目;利润中心;百分比", ";")
            .Cells(2, 1).Resize(UBound(arr1), UBound(arr2, 2)) = arr2
        End With
    End With
End Sub

MM03

MM03查询标估价等

Sub MM03_显示物料()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示物料?" & Chr(10) & " " & Chr(10), vbYesNo, "MM03")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, y As Integer, sr As String, rg As Range, arr1(), k As Integer, i As Integer, j As Integer, bl As Boolean
    Dim Table As Object, Columns As Object
    ReDim arr2(1 To 10000, 1 To 20)

    sr = "MM03"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    bl = False
    With session
        For x = 2 To UBound(arr1)
            If arr1(x, 1) = "" Then Exit For
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NMM03"
            .findById("wnd[0]").sendVKey 0 'Enter
            .findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = arr1(x, 2) '查询物料
            .findById("wnd[0]").sendVKey 0
            i = 0
            j = 0
            Do
                i = i + 1
                sr = "wnd[1]/usr/tblSAPLMGMMTC_VIEW/txtMSICHTAUSW-DYTXT[0," & i & "]"
                If .findById(sr, False) Is Nothing Then
                    bl = True
                    Exit Do
                Else
                    If .findById(sr).Text = "会计 1" Then
                        .findById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").getAbsoluteRow(j * 16 + i).Selected = True
                        .findById("wnd[1]/tbar[0]/btn[0]").press
                        Exit Do
                    End If
                End If
                If i Mod 16 = 0 Then '选择视图最大有16个栏位, 超过要下滑滚动条
                    .findById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").verticalScrollbar.Position = 16
                    i = 0
                    j = j + 1
                End If
            Loop
           
            If .findById("wnd[0]/sbar/pane[0]").Text <> "" Then '物料查不到下面会有一个警告冒出来
                bl = True
            Else
                sr = "wnd[2]/tbar[0]/btn[0]"
                If Not session.findById(sr, False) Is Nothing Then '测试区没有这个错误提示,正式区有
                    .findById(sr).press '输入工厂前有个错误提示要确定
                End If
                .findById("wnd[1]/usr/ctxtRMMG1-WERKS").Text = arr1(x, 1)
                .findById("wnd[1]/tbar[0]/btn[0]").press
                If Not .findById("wnd[2]/usr/txtMESSTXT1", False) Is Nothing Then '查不到某个工厂的物料会有个警告
                    bl = True
                Else
                    arr2(x - 1, 4) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP25/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2800/subSUB1:SAPLCKMMAT:0010/tabsTABS/tabpPPLF").Text '会计期间
                    arr2(x - 1, 5) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP25/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2800/subSUB1:SAPLCKMMAT:0010/tabsTABS/tabpPPLF/ssubSUBML:SAPLCKMMAT:0100/subSUBCURR:SAPLCKMMAT:0200/txtCKMMAT_DISPLAY-STPRS_1").Text '公司代码货币 标准价格
                    arr2(x - 1, 6) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP25/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2800/subSUB1:SAPLCKMMAT:0010/tabsTABS/tabpPPLF/ssubSUBML:SAPLCKMMAT:0100/subSUBCURR:SAPLCKMMAT:0200/txtCKMMAT_DISPLAY-PEINH_1").Text '公司代码货币 价格单位
                    arr2(x - 1, 7) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP25/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2800/subSUB1:SAPLCKMMAT:0010/tabsTABS/tabpPPLF/ssubSUBML:SAPLCKMMAT:0100/subSUBCURR:SAPLCKMMAT:0200/txtCKMMAT_DISPLAY-STPRS_2").Text '集团公司记帐货币,利润中心评估
                    arr2(x - 1, 8) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP25/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2800/subSUB1:SAPLCKMMAT:0010/tabsTABS/tabpPPLF/ssubSUBML:SAPLCKMMAT:0100/subSUBCURR:SAPLCKMMAT:0200/txtCKMMAT_DISPLAY-PEINH_2").Text '集团公司记帐货币,利润中心评估 价格单位
                    .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28").Select '成本核算2
                    arr2(x - 1, 1) = "'" & .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB1:SAPLMGD1:1009/ctxtRMMG1-WERKS").Text '工厂
                    arr2(x - 1, 2) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB1:SAPLMGD1:1009/ctxtRMMG1-MATNR").Text '物料
                    arr2(x - 1, 3) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB1:SAPLMGD1:1009/txtMAKT-MAKTX").Text '描述
                    arr2(x - 1, 9) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-PDATL").Text '会计年度
                    arr2(x - 1, 10) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-PPRDL").Text '期间
                    arr2(x - 1, 11) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB4:SAPLMGD1:2902/ctxtMBEW-BKLAS").Text '评估类
                    arr2(x - 1, 12) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB4:SAPLMGD1:2902/ctxtMBEW-VPRSV").Text '价格控制
                    arr2(x - 1, 13) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB4:SAPLMGD1:2902/txtMBEW-PEINH").Text '价格单位
                    arr2(x - 1, 14) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-LPLPR").Text '计划价格
                    arr2(x - 1, 15) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-STPRS").Text '标准价格
                    arr2(x - 1, 16) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2952/txtMBEW-ZPLP1").Text '计划价格1
                    arr2(x - 1, 17) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2952/ctxtMBEW-ZPLD1").Text '计划价格日期1
                    arr2(x - 1, 18) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-PPRDZ").Text '将来期间
                    arr2(x - 1, 19) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-PDATZ").Text '将来年份
                    arr2(x - 1, 20) = .findById("wnd[0]/usr/tabsTABSPR1/tabpSP28/ssubTABFRA1:SAPLMGMM:2000/subSUB2:SAPLMGD1:2953/txtMBEW-ZPLPR").Text '将来价格
                End If
            End If
        Next x
    End With

    With ThisWorkbook.Sheets("MM03")
        .AutoFilterMode = False
        With .Cells(1, 3)
            .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
            .Resize(1, UBound(arr2, 2)) = Split("工厂;物料;描述;会计期间;公司标准价;公司价格单位;利润中心标准价;利润中心价格单位;会计年度;期间;评估类;价格控制;价格单位;计划价格;标准价格;计划价格1;计划价格日期1;将来期间;将来年份;将来价格", ";")
            .Cells(2, 1).Resize(UBound(arr1), UBound(arr2, 2)) = arr2
        End With
    End With
    
    If bl Then
        MsgBox "注意!有物料没查到!"
    Else
        MsgBox "成功"
    End If
End Sub

CS15

CS15查询多个料号的BOM

Sub CS15_单层反查清单_多层()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示 CS15?" & Chr(10) & " " & Chr(10), vbYesNo, "CS15 - 单层反查清单")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, y As Integer, z As Integer, sr As String, rg As Range, arr1(), k As Integer, brr(), bl As Boolean
    Dim Table As Object, Columns As Object
    ReDim arr2(1 To 100000, 1 To 15) '此处要提前知道列数,并且加了一列 'Table.ColumnCount()
    ReDim brr(1 To 15)
     
    sr = "CS15"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value
    brr(1) = "物料"
    With session
        For z = 2 To UBound(arr1)
            If arr1(z, 1) = "" Then Exit For
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NCS15"
            .findById("wnd[0]").sendVKey 0 'Enter
            .findById("wnd[0]/usr/ctxtRC29L-DATUV").Text = TheTime(0, "yyyy.mm.dd")
            .findById("wnd[0]/usr/ctxtRC29L-MATNR").Text = arr1(z, 2) '物料
            .findById("wnd[0]/usr/chkRC29L-DIRKT").Selected = True
            .findById("wnd[0]/tbar[1]/btn[5]").press
            .findById("wnd[0]/usr/ctxtRC29L-WERKS").Text = arr1(z, 1) '工厂
            .findById("wnd[0]/usr/chkRC29L-MEHRS").Selected = True '多层
            .findById("wnd[0]/tbar[1]/btn[8]").press
            If .findById("wnd[0]/sbar/pane[0]").Text <> "" Then
                bl = True
                k = k + 1
                arr2(k, 1) = arr1(z, 2)
                arr2(k, 4) = arr1(z, 1)
                arr2(k, 5) = .findById("wnd[0]/sbar/pane[0]").Text
            Else
                Set Table = .findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell")
                Set Columns = Table.ColumnOrder()
                For x = 0 To Table.RowCount() - 1
                    k = k + 1
                    arr2(k, 1) = arr1(z, 2)
                    For y = 0 To Table.ColumnCount() - 1
                        arr2(k, y + 2) = Table.getcellvalue(x, CStr(Columns(y)))
                    Next y
                    If x Mod 39 = 0 Then 'bom 测试是每39行后要刷一次屏,否则导出的数据是空白
                        Table.SetCurrentCell x, CStr(Columns(0))
                        Table.firstVisibleRow = x
                    End If
                Next x
                For y = 0 To Table.ColumnCount() - 1
                    brr(y + 2) = CStr(Columns(y)) '目前关闭
                Next y
            End If
        Next z
    End With
    For x = 1 To k
        arr2(x, 4) = "'" & arr2(x, 4)
    Next x

    With ThisWorkbook.Sheets("CS15")
        .AutoFilterMode = False
        With .Cells(1, 3)
            .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
            .Resize(1, UBound(arr2, 2)) = brr '目前没用
            .Resize(1, UBound(arr2, 2)) = Split("物料;级别;物料清单用途;工厂;对象;对象标识;备选物料清单;项目编号;超出需求数量;需求数量;组件计量单位;ResQ excess;重计划数量;基本计量单位;对象描述", ";")
            If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr2, 2)) = arr2
        End With
    End With

    If bl Then
        MsgBox "注意!有部分没有查到!"
    Else
        MsgBox "成功"
    End If
End Sub

TEST

测试运行,读取Shell

Sub test()
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    Dim Table As Object, Columns As Object
    
    Dim x As Integer, y As Integer, k As Integer, arr(), Title()
    ReDim arr(1 To 100000, 1 To 15)
    ReDim Title(1 To 15)

    With session
        Set Table = .findById("wnd[0]/usr/cntlFDBL_BALANCE_CONTAINER/shellcont/shell")  '把表shell赋值给Table
        Set Columns = Table.ColumnOrder() '取列
        For x = 0 To Table.RowCount() - 1  'Table.RowCount表示为总行数
            k = k + 1
            For y = 0 To Table.ColumnCount() - 1 'Table.ColumnCount表示总列数Table.ColumnCount
                arr(k, y + 1) = Table.getcellvalue(x, CStr(Columns(y))) '取值
            Next y
        Next x
        For y = 0 To Table.ColumnCount() - 1
            Title(y + 1) = CStr(Columns(y)) 'Columns返回标题文本
        Next y
    End With
    
    With ThisWorkbook.Sheets("test")
        .AutoFilterMode = False
        .Cells.ClearContents
         .Cells(1, 1).Resize(1, UBound(arr, 2)) = Title
         If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr, 2)) = arr
    End With
End Sub

KS13

KS13用Excel导出的方式批量读取成本中心


Sub KS13_显示成本中心()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示成本中心?" & Chr(10) & " " & Chr(10), vbYesNo, "KS13")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Long, y As Integer, z As Integer, sr As String, rg As Range, bl As Boolean, wb As Workbook, j As Integer
    Dim arr1(), arr2(), arr3(), k As Long
    ReDim arr3(1 To 100000, 1 To 23)
     
    sr = "KS13"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    Call KillSapPath

    With session
        For z = 2 To UBound(arr1)
            If arr1(z, 1) = "" Then Exit For
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NKS13"
            .findById("wnd[0]").sendVKey 0 'Enter
            .findById("wnd[0]/usr/subKOSTL_SELECTION:SAPLKMS1:0100/radKMAS_D-KZKOSTL").Select
            .findById("wnd[0]/usr/subKOSTL_SELECTION:SAPLKMS1:0100/ctxtKMAS_D-KOSTL").Text = "" '成本中心
            .findById("wnd[0]/usr/subKOSTL_SELECTION:SAPLKMS1:0100/radKMAS_D-KZVARIANT").Select
            .findById("wnd[0]/usr/subKOSTL_SELECTION:SAPLKMS1:0100/ctxtKMAS_D-VARIANT_KS").Text = "" '选择变式
            .findById("wnd[0]/usr/ctxtCSKSZ-DATAB_ANFO").Text = TheTime(0, "yyyy.mm.01")
            .findById("wnd[0]/usr/subKOSTL_SELECTION:SAPLKMS1:0100/radKMAS_D-KZKOSTLSET").Select
            .findById("wnd[0]/usr/subKOSTL_SELECTION:SAPLKMS1:0100/ctxtKMAS_D-KOSTL_SET").Text = arr1(z, 1) '成本中心组
            .findById("wnd[0]/tbar[1]/btn[8]").press '执行
            bl = True
            sr = "wnd[0]/sbar/pane[0]"
            If .findById(sr, False) Is Nothing Then
                If Right(.findById(sr), 3) <> "不存在" Then
                    bl = False
                End If
            End If
            If bl Then
                If Not .findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell", False) Is Nothing Then
                    .findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").contextMenu
                    .findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").selectContextMenuItem "&XXL"
                    .findById("wnd[1]/tbar[0]/btn[0]").press
                    .findById("wnd[1]/usr/ctxtDY_PATH").Text = SapPath()
                    j = j + 1 '每次命名的文件不一致
                    .findById("wnd[1]/usr/ctxtDY_FILENAME").Text = j & ".XLSX"
                    .findById("wnd[1]/tbar[0]/btn[0]").press
                    Set wb = Workbooks.Open(SapPath() & "/" & j & ".XLSX") '对文件取值
                    arr2 = wb.Sheets(1).Range("A1").CurrentRegion.Value
                    wb.Close
                    Set wb = Nothing
                    For x = 2 To UBound(arr2)
                        k = k + 1
                        arr3(k, 1) = arr1(z, 1)
                        For y = 1 To UBound(arr2, 2)
                            arr3(k, y + 1) = arr2(x, y)
                        Next y
                    Next x
                End If
            End If
        Next z
    End With

    With ThisWorkbook.Sheets("KS13")
        .AutoFilterMode = False
        With .Cells(1, 2)
            .Resize(1, UBound(arr3, 2)).EntireColumn.ClearContents
            .Resize(1, UBound(arr3, 2)) = Split("成本中心组;成本中心;部门编码;名称;描述;负责人;部门;利润中心;公司代码;数据线;打印机所在地;货币;CostCtrCat;功能范围;有效期自;有效期至;计划: 次成本(锁标识);计划: 收入(锁标识);计划: 主成本(锁标识);实际: 收入 (锁标识);实际: 主成本(锁标识);实际:次收入 (锁标识);成本核算表", ";")
            If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr3, 2)) = arr3
        End With
    End With
    
    MsgBox "完成!"
End Sub

KSH1

KSH1建立成本中心组

Sub KSH1_创建成本中心组()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否创建成本中心组?" & Chr(10) & " " & Chr(10) & "创建之前要自行检查下是否确实需要创建!", vbYesNo, "KSH1")
    If iMg = 7 Then Exit Sub
    
    Dim x As Integer, y As Integer, rg As Range, sr As String, sg As String, v, u, i As Integer, j As Integer, k As Integer

    sr = "KSH1"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    Dim arr()
        arr = rg.CurrentRegion.Value
    Dim dZ As Object
        Set dZ = CreateObject("scripting.dictionary")
        For x = 1 To UBound(arr, 2)
            dZ(arr(1, x)) = x
        Next x
    Dim a As Byte, b As Byte, c As Byte, d As Byte
        a = dZ("成本中心组")
        b = dZ("成本中心组名称")
        c = dZ("成本中心")
        d = dZ("成本中心名称")

    Dim dic1 As Object, dic2 As Object
    Set dic1 = CreateObject("scripting.dictionary")
    Set dic2 = CreateObject("scripting.dictionary")
    
    For x = 2 To UBound(arr)
        sr = arr(x, a)
        sg = arr(x, c)
        If Not dic1.exists(sr) Then
            Set dic1(sr) = CreateObject("scripting.dictionary")
        End If
        dic1(sr)(sg) = ""
    Next x
    For x = 2 To UBound(arr)
        sr = arr(x, a)
        sg = arr(x, b)
        dic2(sr) = sg
    Next x

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    With session
        For Each v In dic1.keys
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSH1"
            .findById("wnd[0]").sendVKey 0 'Enter
            If Not .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]", False) Is Nothing Then '检测是否需要输入控制范围
                .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = 2688
                .findById("wnd[0]").sendVKey 0
            End If
            .findById("wnd[0]/usr/ctxtGRPDYNP-NAME_COALL").Text = v
            .findById("wnd[0]").sendVKey 0
            If Not .findById("wnd[1]/usr/btnBUTTON_2", False) Is Nothing Then '检测是否被创建
                .findById("wnd[1]/usr/btnBUTTON_2").press
                MsgBox "失败!【" & v & "】已经被创建!"
                Exit Sub
            End If
            .findById("wnd[0]/usr/txt[16,0]").Text = dic2(CStr(v))
            i = 1 '记录屏幕上的输入框行数,跨页要重置
            j = 0 '计算点击“插入成本中心”的次数
            k = 0 '计算“竖向滚动条”下拉的频次
            Do
                j = j + 1
                .findById("wnd[0]/tbar[1]/btn[16]").press
            Loop Until j = dic1(CStr(v)).Count \ 5 + 1 '点击“插入成本中心”一次可以填五个成本中心
            For Each u In dic1(CStr(v)).keys
                i = i + 1
                .findById("wnd[0]/usr/txt[4," & i & "]").Text = u
                If i Mod 29 = 0 Then '测试DELL电脑最大显示的成本中心个数,到46时 i 会报错,要填45;测试华硕电脑是要写29
                    k = k + 1
                    .findById("wnd[0]/usr").verticalScrollbar.Position = i * k
                    i = 0
                End If
            Next u
            .findById("wnd[0]/tbar[0]/btn[11]").press '保存(慎用)
        Next v
    End With
    
    MsgBox "成功!"
End Sub

KSH2

KSH2修改成本中心组

Sub KSH2_标题()
    Dim arr() As String
    arr = Split("成本中心组;成本中心组名称;成本中心;成本中心名称", ";")
    
    With ThisWorkbook.Sheets("KSH2")
        .AutoFilterMode = False
        .Cells(1, 1).Resize(1, UBound(arr) + 1) = arr
    End With
End Sub



Sub KSH2_修改成本中心组_重置() '会修改成本中心组名称
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否修改成本中心组?" & Chr(10) & " " & Chr(10) & "修改之前要检查成本中心组是否已经创建,否则会出现修改一半进行不下去的情况!", vbYesNo, "KSH2")
    If iMg = 7 Then Exit Sub
    
    Dim x As Integer, y As Integer, rg As Range, sr As String, sg As String, v, u, i As Integer, j As Integer, k As Integer

    sr = "KSH2"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    Dim arr()
        arr = rg.CurrentRegion.Value
    Dim dZ As Object
        Set dZ = CreateObject("scripting.dictionary")
        For x = 1 To UBound(arr, 2)
            dZ(arr(1, x)) = x
        Next x
    Dim a As Byte, b As Byte, c As Byte, d As Byte
        a = dZ("成本中心组")
        b = dZ("成本中心组名称")
        c = dZ("成本中心")
        d = dZ("成本中心名称")

    Dim dic1 As Object, dic2 As Object
    Set dic1 = CreateObject("scripting.dictionary")
    Set dic2 = CreateObject("scripting.dictionary")
    
    For x = 2 To UBound(arr)
        sr = arr(x, a)
        sg = arr(x, c)
        If Not dic1.exists(sr) Then
            Set dic1(sr) = CreateObject("scripting.dictionary")
        End If
        dic1(sr)(sg) = ""
    Next x
    For x = 2 To UBound(arr)
        sr = arr(x, a)
        sg = arr(x, b)
        dic2(sr) = sg
    Next x

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    With session
        For Each v In dic1.keys
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSH2"
            .findById("wnd[0]").sendVKey 0 'Enter
            If Not .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]", False) Is Nothing Then '检测是否需要输入控制范围
                .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = 2688
                .findById("wnd[0]").sendVKey 0
            End If
            .findById("wnd[0]/usr/ctxtGRPDYNP-NAME_COALL").Text = v
            .findById("wnd[0]").sendVKey 0
            If Not .findById("wnd[1]/usr/btnBUTTON_2", False) Is Nothing Then '检测是否有成本中心组
                .findById("wnd[1]/usr/btnBUTTON_2").press
                MsgBox "失败!【" & v & "】还没创建!"
                Exit Sub
            End If
            .findById("wnd[0]/usr/txt[16,0]").Text = dic2(CStr(v))
            Do '删除组下面所有的成本中心
                If .findById("wnd[0]/usr/lbl[4,2]", False) Is Nothing Then Exit Do
                .findById("wnd[0]/usr/lbl[4,2]").SetFocus
                .findById("wnd[0]/tbar[1]/btn[9]").press
                .findById("wnd[0]/tbar[1]/btn[5]").press
            Loop

            i = 1 '记录屏幕上的输入框行数,跨页要重置
            j = 0 '计算点击“插入成本中心”的次数
            k = 0 '计算“竖向滚动条”下拉的频次
            Do
                j = j + 1
                .findById("wnd[0]/tbar[1]/btn[16]").press
            Loop Until j = dic1(CStr(v)).Count \ 5 + 1 '点击“插入成本中心”一次可以填五个成本中心
            For Each u In dic1(CStr(v)).keys
                i = i + 1
                .findById("wnd[0]/usr/txt[4," & i & "]").Text = u
                If i Mod 29 = 0 Then '测试DELL电脑最大显示的成本中心个数,到46时 i 会报错,要填45;测试华硕电脑是要写29
                    k = k + 1
                    .findById("wnd[0]/usr").verticalScrollbar.Position = i * k
                    i = 0
                End If
            Next u
            .findById("wnd[0]/tbar[0]/btn[11]").press '保存(慎用)
        Next v
    End With
    
    MsgBox "成功!"
End Sub




Sub KSH2_修改成本中心组_新增()  '不会改成本中心组名称
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否修改成本中心组?" & Chr(10) & " " & Chr(10) & "修改之前要检查成本中心组是否已经创建,否则会出现修改一半进行不下去的情况!", vbYesNo, "KSH2")
    If iMg = 7 Then Exit Sub
    
    Dim x As Integer, y As Integer, rg As Range, sr As String, sg As String, v, u, i As Integer, j As Integer, k As Integer

    sr = "KSH2"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    Dim arr()
        arr = rg.CurrentRegion.Value
    Dim dZ As Object
        Set dZ = CreateObject("scripting.dictionary")
        For x = 1 To UBound(arr, 2)
            dZ(arr(1, x)) = x
        Next x
    Dim a As Byte, b As Byte, c As Byte, d As Byte
        a = dZ("成本中心组")
        b = dZ("成本中心组名称")
        c = dZ("成本中心")
        d = dZ("成本中心名称")

    Dim dic1 As Object
    Set dic1 = CreateObject("scripting.dictionary")
    
    For x = 2 To UBound(arr)
        sr = arr(x, a)
        sg = arr(x, c)
        If Not dic1.exists(sr) Then
            Set dic1(sr) = CreateObject("scripting.dictionary")
        End If
        dic1(sr)(sg) = ""
    Next x

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    With session
        For Each v In dic1.keys
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSH2"
            .findById("wnd[0]").sendVKey 0 'Enter
            If Not .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]", False) Is Nothing Then '检测是否需要输入控制范围
                .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = 2688
                .findById("wnd[0]").sendVKey 0
            End If
            .findById("wnd[0]/usr/ctxtGRPDYNP-NAME_COALL").Text = v
            .findById("wnd[0]").sendVKey 0
            If Not .findById("wnd[1]/usr/btnBUTTON_2", False) Is Nothing Then '检测是否有成本中心组
                .findById("wnd[1]/usr/btnBUTTON_2").press
                MsgBox "失败!【" & v & "】还没创建!"
                Exit Sub
            End If

            i = 1 '记录屏幕上的输入框行数,跨页要重置
            j = 0 '计算点击“插入成本中心”的次数
            k = 0 '计算“竖向滚动条”下拉的频次
            Do
                j = j + 1
                .findById("wnd[0]/tbar[1]/btn[16]").press
            Loop Until j = dic1(CStr(v)).Count \ 5 + 1 '点击“插入成本中心”一次可以填五个成本中心
            For Each u In dic1(CStr(v)).keys
                i = i + 1
                .findById("wnd[0]/usr/txt[4," & i & "]").Text = u
                If i Mod 29 = 0 Then '测试DELL电脑最大显示的成本中心个数,到46时 i 会报错,要填45;测试华硕电脑是要写29
                    k = k + 1
                    .findById("wnd[0]/usr").verticalScrollbar.Position = i * k
                    i = 0
                End If
            Next u
            .findById("wnd[0]/tbar[0]/btn[11]").press '保存(慎用)
        Next v
    End With
    
    MsgBox "成功!"
End Sub



Sub KSH2_修改成本中心组_删除() '不会改成本中心组名称
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否修改成本中心组?" & Chr(10) & " " & Chr(10) & "修改之前要检查成本中心组是否已经创建,否则会出现修改一半进行不下去的情况!", vbYesNo, "KSH2")
    If iMg = 7 Then Exit Sub
    
    Dim x As Integer, y As Integer, rg As Range, sr As String, sg As String, v, u, i As Integer, j As Integer, k As Integer

    sr = "KSH2"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    Dim arr()
        arr = rg.CurrentRegion.Value
    Dim dZ As Object
        Set dZ = CreateObject("scripting.dictionary")
        For x = 1 To UBound(arr, 2)
            dZ(arr(1, x)) = x
        Next x
    Dim a As Byte, b As Byte, c As Byte, d As Byte
        a = dZ("成本中心组")
        b = dZ("成本中心组名称")
        c = dZ("成本中心")
        d = dZ("成本中心名称")

    Dim dic1 As Object
    Set dic1 = CreateObject("scripting.dictionary")
   
    For x = 2 To UBound(arr)
        sr = arr(x, a)
        sg = arr(x, c)
        If Not dic1.exists(sr) Then
            Set dic1(sr) = CreateObject("scripting.dictionary")
        End If
        dic1(sr)(sg) = ""
    Next x

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    With session
        For Each v In dic1.keys
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSH2"
            .findById("wnd[0]").sendVKey 0 'Enter
            If Not .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]", False) Is Nothing Then '检测是否需要输入控制范围
                .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = 2688
                .findById("wnd[0]").sendVKey 0
            End If
            .findById("wnd[0]/usr/ctxtGRPDYNP-NAME_COALL").Text = v
            .findById("wnd[0]").sendVKey 0
            If Not .findById("wnd[1]/usr/btnBUTTON_2", False) Is Nothing Then '检测是否有成本中心组
                .findById("wnd[1]/usr/btnBUTTON_2").press
                MsgBox "失败!【" & v & "】还没创建!"
                Exit Sub
            End If
            i = 1 '记录屏幕上的输入框行数,跨页要重置
            j = 0 '计算点击“插入成本中心”的次数
            Do
                i = i + 1
                If .findById("wnd[0]/usr/lbl[4," & i & "]", False) Is Nothing Then Exit Do '没有查到的就退出
                If .findById("wnd[0]/usr/lbl[15," & i & "]", False) Is Nothing Then Exit Do '没有查到的就退出
                sr = .findById("wnd[0]/usr/lbl[4," & i & "]").Text
                If dic1(CStr(v)).exists(sr) Then
                    .findById("wnd[0]/usr/lbl[4," & i & "]").SetFocus
                    .findById("wnd[0]/tbar[1]/btn[9]").press
                    .findById("wnd[0]/tbar[1]/btn[5]").press
                    i = i - 1
                End If
                If i Mod 29 = 0 Then '测试DELL电脑最大显示的成本中心个数,到46时 i 会报错,要填45;测试华硕电脑是要写29
                    j = j + 1
                    .findById("wnd[0]/usr").verticalScrollbar.Position = i * j
                    i = 0
                End If
            Loop
            .findById("wnd[0]/tbar[0]/btn[11]").press '保存(慎用)
        Next v
    End With
    
    MsgBox "成功!"
End Sub

KSH3

KSH3显示成本中心组

Sub KSH3_显示成本中心组()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示成本中心组?" & Chr(10) & " " & Chr(10), vbYesNo, "KSH3")
    If iMg = 7 Then Exit Sub

    Dim x As Integer, sr As String, rg As Range, arr1(), arr2(), brr(), k As Integer, i As Integer, j As Integer, bl As Boolean
    ReDim arr2(1 To 100000, 1 To 5)
    ReDim brr(1 To 2)

    sr = "KSH3"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    bl = False
    With session
        For x = 2 To UBound(arr1)
            If arr1(x, 1) <> "" Then
                .findById("wnd[0]").maximize
                .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSH3" '显示成本中心组
                .findById("wnd[0]").sendVKey 0 'Enter
                If Not .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]", False) Is Nothing Then '检测是否需要输入控制范围
                    .findById("wnd[1]/usr/sub:SAPLSPO4:0300/ctxtSVALD-VALUE[0,21]").Text = 2688
                    .findById("wnd[0]").sendVKey 0
                End If
                .findById("wnd[0]/usr/ctxtGRPDYNP-NAME_COALL").Text = arr1(x, 1) '查询成本中心组
                .findById("wnd[0]").sendVKey 0 'Enter
                If Not .findById("wnd[1]/usr/btnBUTTON_2", False) Is Nothing Then '检测是否有成本中心组
                    .findById("wnd[1]/usr/btnBUTTON_2").press
                    bl = True
                Else
                    brr(1) = .findById("wnd[0]/usr/lbl[0,0]").Text   '成本中心组名称
                    brr(2) = .findById("wnd[0]/usr/lbl[16,0]").Text '成本中心组描述
                    i = 1 '记录屏幕上的输入框行数,跨页要重置
                    j = 0 '计算点击“插入成本中心”的次数
                    Do
                        i = i + 1
                        If .findById("wnd[0]/usr/lbl[4," & i & "]", False) Is Nothing Then Exit Do '没有查到的就退出
                        If .findById("wnd[0]/usr/lbl[15," & i & "]", False) Is Nothing Then Exit Do '没有查到的就退出
                        k = k + 1
                        arr2(k, 1) = brr(1)
                        arr2(k, 2) = brr(2)
                        arr2(k, 3) = .findById("wnd[0]/usr/lbl[4," & i & "]").Text
                        arr2(k, 4) = .findById("wnd[0]/usr/lbl[15," & i & "]").Text
                        If i Mod 29 = 0 Then '测试DELL电脑最大显示的成本中心个数,到46时 i 会报错,要填45;测试华硕电脑是要写29
                            j = j + 1
                            .findById("wnd[0]/usr").verticalScrollbar.Position = i * j
                            i = 0
                        End If
                    Loop
                End If
            End If
        Next x
        For x = 1 To k
            If IsNumeric(Right(arr2(x, 3), 1)) Then
                arr2(x, 5) = False
            Else
                arr2(x, 5) = True
            End If
        Next x
    End With
    
    With ThisWorkbook.Sheets("KSH3")
        .AutoFilterMode = False
        With .Cells(1, 2)
        .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
        .Resize(1, UBound(arr2, 2)) = Split("成本中心组;成本中心组名称;成本中心;成本中心名称;虚拟否", ";")
        If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr2, 2)) = arr2
        End With
    End With
    
    If bl Then
        MsgBox "有成本中心组未查到!"
    Else
        MsgBox "成功!"
    End If
End Sub

FS00

Sub FS00_整理()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("FS00获取科目!" & Chr(10) & " " & Chr(10), vbYesNo, "FSOO")
    If iMg = 7 Then Exit Sub
    
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim Table As Object, GetNodeK As Object, arr(), i As Integer, x
   
    '进入程式获取节点
    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/NFS00"
        .findById("wnd[0]").sendVKey 0 'Enter
        Set Table = .findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]")
        Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
    End With
    
    '打开所有节点
    For x = GetNodeK.Count - 1 To 0 Step -1
        Table.expandNode GetNodeK.Item(x)
    Next x

    '重新读取shell[1]
    Set Table = session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]")
    Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
    For x = 0 To GetNodeK.Count - 1
        i = i + 1
        ReDim Preserve arr(1 To i)
        arr(i) = GetNodeK.Item(x) '节点
        arr(i) = Table.getitemtext(arr(i), "&Hierarchy") '获得内容
    Next x

    'With ThisWorkbook.Sheets("FS00")
    '    .AutoFilterMode = False
    '    .UsedRange.ClearContents
    '    .Cells(1, 1).Resize(i) = Application.Transpose(arr)
    'End With

    Dim brr(), v, j As Integer, sr As String

    ReDim brr(1 To i, 1 To 4)
    For x = 1 To i
        If InStr(1, arr(x), "  ") = 0 Then
            sr = arr(x)
        Else
            j = j + 1
            brr(j, 1) = sr
            brr(j, 2) = arr(x)
            brr(j, 3) = Split(arr(x), "  ")(0)
            brr(j, 4) = Trim(Replace(arr(x), brr(j, 3), ""))
        End If
    Next x

    With ThisWorkbook.Sheets("FS00")
        .AutoFilterMode = False
        .UsedRange.ClearContents
        .Cells(1, 1).Resize(1, UBound(brr, 2)) = Split("科目组;科目与科目描述;科目;科目描述", ";")
        If j > 0 Then .Cells(2, 1).Resize(j, UBound(brr, 2)) = brr
    End With
End Sub

SM30

SM30中,ZTCO0011B用于配置进销存报表,此方法在正式区读取表后又可以再测试区导入进去。

Sub SM30_ZTCO0011B_显示()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示ZTCO0011B?" & Chr(10) & " " & Chr(10), vbYesNo, "SM30")
    If iMg = 7 Then Exit Sub

    Dim x As Integer, y As Integer, sr As String, rg As Range, arr(), k As Integer, i As Integer, j As Integer, bl As Boolean

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    With session
        .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B").verticalScrollbar.Position = 0
        sr = .findById("wnd[0]/usr/txtVIM_POSITION_INFO").Text
        j = CDbl(Split(sr, "/")(1))
        ReDim arr(0 To j, 1 To 6)
        i = -1
        For x = 0 To j
            i = i + 1
            arr(x, 1) = .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-BIZCODE[0," & i & "]").Text
            arr(x, 2) = .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-BWART[1," & i & "]").Text
            arr(x, 3) = .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-BIZTEXT[2," & i & "]").Text
            arr(x, 4) = .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/cmbZTCO0011B-BIZATTR[3," & i & "]").Text
            arr(x, 5) = .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/cmbZTCO0011B-SHKZG[4," & i & "]").Text
            arr(x, 6) = .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-SOBKZ[5," & i & "]").Text
            If i Mod 19 = 0 Then
                .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B").verticalScrollbar.Position = x
                i = 0
            End If
        Next x
    End With

    With ThisWorkbook.Sheets("SM30_ZTCO0011B")
        .AutoFilterMode = False
        .Cells.ClearContents
        .Cells(1, 1).Resize(1, UBound(arr, 2)) = Split("业务分类代码;MvT;业务分类描述;业务属性;借贷;特殊库存", ";")
        .Cells(2, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
    End With
End Sub



Sub SM30_ZTCO0011B_导入()
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object, Position
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    Dim d As Object, x As Integer, y As Integer, rg As Range, sr As String, v, u, i As Integer, j As Integer, k As Integer
    Set d = CreateObject("scripting.dictionary")

    sr = "SM30_ZTCO0011B"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    Dim arr()
        arr = rg.CurrentRegion.Value

    d.Add "出库", "2"
    d.Add "入库", "1"
    d.Add "借方", "S"
    d.Add "贷方", "H"
    
    With session
        i = -1
        For x = 2 To UBound(arr)
            i = i + 1
            .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-BIZCODE[0," & i & "]").Text = arr(x, 1)
            .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-BWART[1," & i & "]").Text = arr(x, 2)
            .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-BIZTEXT[2," & i & "]").Text = arr(x, 3)
            If arr(x, 4) <> "" Then .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/cmbZTCO0011B-BIZATTR[3," & i & "]").Key = d(arr(x, 4))
            If arr(x, 5) <> "" Then .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/cmbZTCO0011B-SHKZG[4," & i & "]").Key = d(arr(x, 5))
            .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B/txtZTCO0011B-SOBKZ[5," & i & "]").Text = arr(x, 6)
            If i Mod 19 = 0 Then
                .findById("wnd[0]/usr/tblSAPLZFG_ZTCO0011BTCTRL_ZTCO0011B").verticalScrollbar.Position = x - 2
                i = 0
            End If
        Next x
    End With
End Sub

Tcode

可以新建一个收藏夹,然后获取该收藏夹的节点,维护要插入的事务码,事务码和收藏夹要进行逆序排序

节点文件夹事物码事物文本
F00289PS_1.3_项目预算增加删减流程CJ37项目中的预算补充
F00289PS_1.3_项目预算增加删减流程CJ38项目中的预算返回
F00289PS_1.3_项目预算增加删减流程CJ32改变工程发放
F00289PS_1.3_项目预算增加删减流程CJ33显示项目发行
F00289PS_1.3_项目预算增加删减流程CJ3A改变预算凭证
F00289PS_1.3_项目预算增加删减流程CJ3B显示预算文档
F00289PS_1.2_项目预算编列流程CJ30改变工程项目源预算 
F00289PS_1.2_项目预算编列流程CJ31显示工程项目源预算 
F00289PS_1.2_项目预算编列流程CJ32改变工程发放
F00289PS_1.2_项目预算编列流程CJ33显示项目发行
F00289PS_1.2_项目预算编列流程CJ3A改变预算凭证
F00289PS_1.2_项目预算编列流程CJ3B显示预算文档
F00289PS_1.1_WBS主数据维护流程CJ01生成工作细分结构
F00289PS_1.1_WBS主数据维护流程CJ02更改工作细分结构
F00289PS_1.1_WBS主数据维护流程CJ03显示工作细分结构
F00289PS_1.1_WBS主数据维护流程CJ20N项目构建器 
Sub Tcode_获取节点()
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim Table As Object, GetNodeK As Object, arr(), i As Integer, x As Integer, sr As String
    ReDim Title(1 To 10)
   
    '进入程式获取节点
    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/N"
        .findById("wnd[0]").sendVKey 0 'Enter
        sr = "wnd[0]/usr/btnSTARTBUTTON"
        If Not session.findById(sr, False) Is Nothing Then
            .findById(sr).press
        End If
        Set Table = .findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell")
        Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
    End With

    For x = 0 To GetNodeK.Count - 1
        i = i + 1
        ReDim Preserve arr(1 To i)
        arr(i) = GetNodeK.Item(x) '节点
    Next x

    With ThisWorkbook.Sheets("获取节点")
        .AutoFilterMode = False
        .UsedRange.ClearContents
        .Cells(1, 1).Resize(i) = Application.Transpose(arr)
    End With
End Sub


Sub Tcode_插入事物码()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("插入事务码!" & Chr(10) & " " & Chr(10), vbYesNo, "SAP_快速插入事务码")
    If iMg = 7 Then Exit Sub
    
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim d As Object, x As Integer, rg As Range, k As Integer, s1 As String, s2 As String, v1, v2, v3
    Set d = CreateObject("scripting.dictionary")
    
    Dim Table As Object

    s1 = "插入事务码"
    Set rg = ThisWorkbook.Sheets(s1).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & s1 & "】中无数据!"
        Exit Sub
    End If
    Dim arr()
        arr = rg.CurrentRegion.Value

    For x = 2 To UBound(arr)
        s1 = arr(x, 1) '节点
        s2 = arr(x, 2) '文件夹名称
        If Not d.exists(s1) Then
            Set d(s1) = CreateObject("scripting.dictionary")
        End If
        If Not d(s1).exists(s2) Then
            Set d(s1)(s2) = CreateObject("scripting.dictionary")
        End If
        d(s1)(s2)(arr(x, 3)) = "" 'arr(x, 3) 是事务码
    Next x

    With session
        .findById("wnd[0]").maximize
        Set Table = .findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell")
        For Each v1 In d.keys
            For Each v2 In d(v1).keys
                Table.selectedNode = v1
                Table.nodeContextMenu v1
                Table.selectContextMenuItem "XXFOLD" '插入文件夹
                .findById("wnd[1]/usr/sub:SAPLSPO4:0300/txtSVALD-VALUE[0,21]").Text = v2
                .findById("wnd[1]/tbar[0]/btn[0]").press
                For Each v3 In d(v1)(v2).keys
                    .findById("wnd[0]").maximize
                    Table.nodeContextMenu NodeKeys(CStr(v1))
                    Table.selectContextMenuItem "XXADTC" '插入事务码
                    .findById("wnd[1]/usr/sub:SAPLSPO4:0300/txtSVALD-VALUE[0,21]").Text = v3
                    .findById("wnd[1]/tbar[0]/btn[0]").press
                Next v3
            Next v2
        Next v1
    End With
    Set d = Nothing
    
    MsgBox "结束!"
End Sub


Function NodeKeys(s1 As String) As String '例如 要把 F00289 改成 F00290
    Dim i As Integer, s2 As String
    
    i = Len(s1)
    s2 = CDbl(Right(s1, i - 1)) + 1
    NodeKeys = "F" & Application.Rept(0, i - Len(s2) - 1) & s2
End Function

CKM3N

批量查询料号的成本价明细

CKM3N维护查询的数据
工厂料号
202340510G1CMX085065A-Y
Sub CKM3N_显示物料价格_跨月_多料号()
    On Error Resume Next

    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否在正式区显示物料价格?" & Chr(10) & " " & Chr(10), vbYesNo, "CKM3N")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Long, y As Integer, z As Integer, sr As String, rg As Range, arr1(), bl As Boolean, db As Double, k As Long, v
    Dim Table As Object, Columns As Object, GetNodeK As Object

    ReDim arr2(1 To 100000, 1 To 29)

    sr = "CKM3N跨月"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    bl = False
    With session
        For x = 2 To UBound(arr1)
            If arr1(x, 1) = "" Then Exit For
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NCKM3N"
            .findById("wnd[0]").sendVKey 0 'Enter
            .findById("wnd[0]/usr/ctxtMLKEY-WERKS_ML_PRODUCTIVE").Text = arr1(x, 3) '查询工厂
            .findById("wnd[0]/usr/ctxtMLKEY-MATNR").Text = arr1(x, 4) '查询物料
            .findById("wnd[0]/usr/txtMLKEY-POPER").Text = arr1(x, 2) '月
            .findById("wnd[0]/usr/txtMLKEY-BDATJ").Text = arr1(x, 1)  '年
            .findById("wnd[0]/tbar[1]/btn[13]").press '刷新
            .findById("wnd[0]/usr/btn%#AUTOTEXT003").press '折叠选择字段 价格
            For Each v In Split("10;32", ";") '10" '公司层面 '"32"'利润中心层面 ';32
                .findById("wnd[0]/usr/cmbMLKEY-CURTP").Key = v '货币/评估
                sr = "wnd[0]/usr/ssubSUB:SAPLCKM8H:0300/cntlCONTAINER/shellcont/shell/shellcont[1]/shell[1]"
                If Not .findById(sr, False) Is Nothing Then
                   Set Table = .findById(sr)
                   Set Columns = Table.ColumnOrder()
                   Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
                   For z = 0 To GetNodeK.Count - 1
                       k = k + 1
                       For y = 1 To 4
                           arr2(k, y) = arr1(x, y)
                       Next y
                       arr2(k, 5) = .findById("wnd[0]/usr/cmbMLKEY-CURTP").Text '货币/评估
                       arr2(k, 6) = .findById("wnd[0]/usr/ctxtCKMLCR-VPRSV").Text '价格控制
                       arr2(k, 7) = .findById("wnd[0]/usr/txtCKMLCR-STPRS").Text '标准价格
                       arr2(k, 8) = .findById("wnd[0]/usr/txtCKMLCR-PVPRS").Text '定期价格 '正式区是  wnd[0]/usr/txtCKMLCR-PVPRS '测试区是 wnd[0]/usr/txtPVPRS_DYN
                       arr2(k, 9) = .findById("wnd[0]/usr/txtCKMLCR-PEINH").Text '价格单位
                       arr2(k, 12) = Table.getitemtext(GetNodeK.Item(z), "&Hierarchy")
                       For y = 1 To 17
                           arr2(k, y + 12) = Table.getitemtext(GetNodeK.Item(z), CStr(Columns(y)))
                       Next y
                   Next z
                End If
             Next v
        Next x
    End With
    For x = 1 To k
        db = arr2(x, 9) '价格单位
        If db <> 0 Then
            arr2(x, 10) = arr2(x, 7) / db '标准价=标准价格/价格单位
            arr2(x, 11) = arr2(x, 8) / db '实际价=定期价格/价格单位
        End If
        arr2(x, 13) = CDbl(arr2(x, 13)) '数量
        For y = 15 To 29
            arr2(x, y) = CDbl(arr2(x, y)) '初级评估等
        Next y
        arr2(x, 3) = "'" & arr2(x, 3) '工厂
    Next x

    With ThisWorkbook.Sheets("CKM3N跨月")
        .AutoFilterMode = False
        With .Cells(1, 5)
            .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
            .Resize(1, UBound(arr2, 2)) = Split("年;月;工厂;物料;货币评估;价格控制;标准价格;定期价格;价格单位;标准价;实际价;类别;数量;数量单位;初级评估;价格差异;汇率差异;实际值;价格;公司间利润;直接材料;直接人工;间接人员薪资及福利;模具及治工具;资产摊提及能源消耗;耗品及杂项消耗;其他费用;委外加工;成本构成总和", ";")
            If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr2, 2)) = arr2
        End With
    End With
End Sub

CKM3N自行输入料号查询,只能开一个屏,否则会报错,可以自己打开节点,看想要的内容

Sub CKM3N_显示物料价格_明细_单月单笔()
    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, y As Integer, z As Integer, sr As String, rg As Range, arr1(), k As Integer, brr(), bl As Boolean
    Dim Table As Object, Columns As Object, GetNodeK As Object
    ReDim arr2(1 To 100000, 1 To 18) '此处要提前知道列数,并且加了一列 'Table.ColumnCount()

    With session
        Set Table = .findById("wnd[0]/usr/ssubSUB:SAPLCKM8H:0300/cntlCONTAINER/shellcont/shell/shellcont[1]/shell[1]")
        Set Columns = Table.ColumnOrder()
        Set GetNodeK = Table.GetAllNodeKeys '得到所有的节点
        For x = 0 To GetNodeK.Count - 1
            k = k + 1
            arr2(k, 1) = Table.getitemtext(GetNodeK.Item(x), "&Hierarchy")
            For y = 1 To 17 'Table.ColumnCount() - 1
                arr2(k, y + 1) = Table.getitemtext(GetNodeK.Item(x), CStr(Columns(y)))
            Next y
        Next x
        For x = 1 To k
            For y = 2 To UBound(arr2, 2)
                If y <> 3 Then
                    If arr2(x, y) = "" Then
                        arr2(x, y) = 0
                    Else
                        arr2(x, y) = CDbl(arr2(x, y))
                    End If
                End If
            Next y
        Next x
    End With

    With ThisWorkbook.Sheets("CKM3N明细")
        .AutoFilterMode = False
        .UsedRange.ClearContents
        .Cells(1, 1).Resize(1, UBound(arr2, 2)) = Split("类别;数量;数量单位;初级评估;价格差异;汇率差异;实际值;价格;公司间利润;直接材料;直接人工;间接人员薪资及福利;模具及治工具;资产摊提及能源消耗;耗品及杂项消耗;其他费用;委外加工;成本构成总和", ";")
        If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr2, 2)) = arr2
    End With
End Sub

FB02

FB02批量修改凭证文本的摘要


Sub FB02_修改凭证文本栏位()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否修改凭证文本栏位?" & Chr(10) & " " & Chr(10), vbYesNo, "FB02")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)
    
    Dim Table As Object, Columns As Object
    Dim arr1(), x As Integer, y As Integer, z As Integer, sr As String, rg As Range
    
    sr = "FB02"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    With session
        For z = 2 To UBound(arr1)
            .findById("wnd[0]").maximize
            .findById("wnd[0]/tbar[0]/okcd").Text = "/NFB02" '修改凭证
            .findById("wnd[0]").sendVKey 0
            .findById("wnd[0]/usr/txtRF05L-BELNR").Text = arr1(z, 3) '凭证编号
            .findById("wnd[0]/usr/ctxtRF05L-BUKRS").Text = arr1(z, 2) '公司代码
            .findById("wnd[0]/usr/txtRF05L-GJAHR").Text = arr1(z, 1) '会计年度
            .findById("wnd[0]").sendVKey 0
            '.findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell").selectColumn "SGTXT" '选中“文本”栏位
            '.findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell").pressToolbarButton "&SORT_DSC" '排序
            '.findById("wnd[0]/tbar[1]/btn[25]").press '更改模式
            Set Table = .findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell")
            Set Columns = Table.ColumnOrder()
            For x = 0 To Table.RowCount() - 1
                If Table.getcellvalue(x, "SGTXT") = arr1(z, 4) Then '原文本
                    Table.SetCurrentCell x, "KTONR"
                    Table.doubleClickCurrentCell '双击
                    .findById("wnd[0]/usr/ctxtBSEG-SGTXT").Text = arr1(z, 5) '更改后文本
                    .findById("wnd[0]/tbar[0]/btn[3]").press '返回
                End If
                If x Mod 14 = 0 Then '屏幕上显示的最大行数,根据电脑的不同可能有变
                    Table.SetCurrentCell x, CStr(Columns(0))
                    Table.firstVisibleRow = x
                End If
            Next x
            .findById("wnd[0]/tbar[0]/btn[11]").press '保存
        Next z
    End With
End Sub

KSU1

可以创建分摊规则,这里主要还是用成本中心分摊,其他栏位情况没考虑

Sub KSU1_标题()
    Dim arr() As String
    arr = Split("循环名;循环名描述;开始时间;结束时间;段名;段名描述;发送者成本中心从;发送者成本中心至;发送者成本中心组;接收方成本中心从;接收方成本中心至;接收方成本中心组", ";")

    With ThisWorkbook.Sheets("KSU1")
        .AutoFilterMode = False
        .Cells(1, 1).Resize(1, UBound(arr) + 1) = arr
    End With
End Sub


Sub KSU1_创建实际分摊()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否创建实际分摊?" & Chr(10) & " " & Chr(10), vbYesNo, "KSU1")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, sr As String, rg As Range, arr1()

    sr = "KSU1"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value


    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSU1" '创建实际分摊
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtRKAL1-KSCYC").Text = arr1(2, 1) '循环名
        .findById("wnd[0]/usr/ctxtT811C-SDATE").Text = arr1(2, 3)  '开始时间
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtT811C-EDATE").Text = arr1(2, 4) '结束时间
        .findById("wnd[0]/usr/txtRKAL1-CTXT").Text = arr1(2, 2) '循环名描述

        For x = 2 To UBound(arr1)
            .findById("wnd[0]/tbar[1]/btn[20]").press '增加段
            .findById("wnd[0]/usr/txtKGALS-NAME").Text = arr1(x, 5) '段名
            .findById("wnd[0]/usr/txtKGALS-TXT").Text = arr1(x, 6) '段名描述
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0307/ctxtKGALS-ABSCH").Text = "Z3" '分配结构
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0307/cmbRKAL1-RCDATAFLG").Key = "7" '可变部分类型
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS").Select '发送方/接收方
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[4,67]").Text = "ZZ00" '成本要素组 '修改
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[1,17]").Text = arr1(x, 7)  '发送者成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[1,42]").Text = arr1(x, 8) '发送者成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[1,67]").Text = arr1(x, 9) '发送者成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[7,17]").Text = arr1(x, 10) '接收方成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[7,42]").Text = arr1(x, 11)  '接收方成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[7,67]").Text = arr1(x, 12)   '接收方成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND").Select '发送方值
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND/ssubSUB1:SAPMKAL1:0451/sub:SAPMKAL1:0451/ctxtKGALK-VALMIN[0,17]").Text = "0" '版本
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE").Select '接收方追踪因素
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMIN[0,17]").Text = "ZZ01" '活动类型:从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMAX[0,42]").Text = "ZZ06" '活动类型:到
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRWFC").Select '参考加权因素
        Next x
    End With

    MsgBox "运行成功!"
End Sub

KSU2

修改已经创建的分摊规则

Sub KSU2_标题()
    Dim arr() As String
    arr = Split("查询循环名;查询开始时间;修改结束时间;修改循环名描述;修改段名;修改段名描述;修改发送者成本中心从;修改发送者成本中心至;修改发送者成本中心组;修改接收方成本中心从;修改接收方成本中心至;修改接收方成本中心组", ";")

    With ThisWorkbook.Sheets("KSU2")
        .AutoFilterMode = False
        .Cells(1, 1).Resize(1, UBound(arr) + 1) = arr
    End With
End Sub


Sub KSU2_修改实际分摊()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否修改实际分摊?" & Chr(10) & " " & Chr(10), vbYesNo, "KSU2")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, sr As String, rg As Range, arr1(), arr2(), brr(), k As Long, iMax As Integer, i As Integer, j As Integer
    ReDim arr2(1 To 100000, 1 To 18)
    ReDim brr(1 To 3)

    sr = "KSU2"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSU2" '修改实际分配
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtRKAL1-KSCYC").Text = arr1(2, 1) '循环名
        .findById("wnd[0]/usr/ctxtT811C-SDATE").Text = arr1(2, 2) '开始日期
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtT811C-EDATE").Text = arr1(2, 3) '结束时间
        .findById("wnd[0]/usr/txtRKAL1-CTXT").Text = arr1(2, 4) '循环名描述
        .findById("wnd[0]/tbar[1]/btn[6]").press '第一个段
        .findById("wnd[0]/mbar/menu[2]/menu[1]").Select '转到>>概述段
        j = .findById("wnd[1]/usr/txtRCEVM-ENTRIES").Text '段号
        .findById("wnd[1]/tbar[0]/btn[12]").press '取消段概览
        For x = 1 To j '为了修改的时候不重名
            .findById("wnd[0]/usr/txtKGALS-NAME").Text = x
            If x <> j Then .findById("wnd[0]/tbar[1]/btn[19]").press '下一段
        Next x
        For x = 1 To j - 1 '回退到第一个段
            .findById("wnd[0]/tbar[1]/btn[18]").press '前一段
        Next x
        For x = 2 To UBound(arr1)
            i = i + 1
            .findById("wnd[0]/usr/txtKGALS-NAME").Text = arr1(x, 5) '段名 (不能大于十个字符)
            .findById("wnd[0]/usr/txtKGALS-TXT").Text = arr1(x, 6) '段名描述
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0307/ctxtKGALS-ABSCH").Text = "Z3" '分配结构
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0307/cmbRKAL1-RCDATAFLG").Key = "7" '可变部分类型
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS").Select '发送方/接收方
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[4,67]").Text = "ZZ00" '成本要素组
            .findById("wnd[0]/usr/chkKGALS-ACTIVE").Selected = False '锁定标识符
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[1,17]").Text = arr1(x, 7)  '发送者成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[1,42]").Text = arr1(x, 8) '发送者成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[1,67]").Text = arr1(x, 9) '发送者成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[7,17]").Text = arr1(x, 10) '接收方成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[7,42]").Text = arr1(x, 11)  '接收方成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[7,67]").Text = arr1(x, 12)   '接收方成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND").Select '发送方值
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND/ssubSUB1:SAPMKAL1:0451/sub:SAPMKAL1:0451/ctxtKGALK-VALMIN[0,17]").Text = "0" '版本
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE").Select '接收方追踪因素
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMIN[0,17]").Text = "ZZ01" '活动类型:从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMAX[0,42]").Text = "ZZ06" '活动类型:到
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRWFC").Select '参考加权因素
            If x = UBound(arr1) Then
            ElseIf i < j Then
                .findById("wnd[0]/tbar[1]/btn[19]").press
            Else
                .findById("wnd[0]/tbar[1]/btn[20]").press '增加段
            End If
        Next x

        Do While i < j '如果没有修改的必要则全部锁定掉
            i = i + 1
            .findById("wnd[0]/tbar[1]/btn[19]").press '下一个段
            .findById("wnd[0]/usr/chkKGALS-ACTIVE").Selected = "TRUE" '锁定标识符
        Loop
     End With

    MsgBox "请自行保存!"
End Sub

KSU3

显示分摊规则

查询循环名查询开始时间
C121012022.06.01
Sub KSU3_标题()
    Dim arr() As String
    arr = Split("查询循环名;查询开始时间;循环名;循环名描述;开始时间;结束时间;段名;段名描述;锁定标识符;分配结构;可变部分类型;成本要素组;发送者成本中心从;发送者成本中心至;发送者成本中心组;接收方成本中心从;接收方成本中心至;接收方成本中心组;版本;活动类型从;活动类型到", ";")

    With ThisWorkbook.Sheets("KSU3")
        .AutoFilterMode = False
        .Cells(1, 1).Resize(1, UBound(arr) + 1) = arr
    End With
End Sub


Sub KSU3_显示实际分摊()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示实际分摊?" & Chr(10) & " " & Chr(10), vbYesNo, "KSU3")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, sr As String, rg As Range, arr1(), arr2(), brr(), k As Long, iMax As Integer, i As Integer, j As Integer
    ReDim arr2(1 To 100000, 1 To 19)
    ReDim brr(1 To 3)

    sr = "KSU3"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value


    With session
        For x = 2 To UBound(arr1)
            If arr1(x, 1) <> "" Then
                .findById("wnd[0]").maximize
                .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSU3" '显示实际分摊
                .findById("wnd[0]").sendVKey 0 'Enter
                .findById("wnd[0]/usr/ctxtRKAL1-KSCYC").Text = arr1(x, 1) '循环名
                .findById("wnd[0]/usr/ctxtT811C-SDATE").Text = arr1(x, 2) '开始日期
                .findById("wnd[0]").sendVKey 0 'Enter
                brr(1) = .findById("wnd[0]/usr/txtRKAL1-CTXT").Text   '循环名描述
                brr(2) = .findById("wnd[0]/usr/ctxtT811C-SDATE").Text '开始时间
                brr(3) = .findById("wnd[0]/usr/ctxtT811C-EDATE").Text '结束时间
                .findById("wnd[0]/tbar[1]/btn[6]").press '第一个段
                .findById("wnd[0]/mbar/menu[2]/menu[1]").Select '转到>>概述段
                j = .findById("wnd[1]/usr/txtRCEVM-ENTRIES").Text '段号
                .findById("wnd[1]/tbar[0]/btn[12]").press '取消段概览
                i = 0
                Do
                    On Error Resume Next
                    k = k + 1
                    i = i + 1
                    arr2(k, 1) = arr1(x, 1)
                    arr2(k, 2) = brr(1)
                    arr2(k, 3) = brr(2)
                    arr2(k, 4) = brr(3)
                    arr2(k, 5) = .findById("wnd[0]/usr/txtKGALS-NAME").Text  '段名
                    arr2(k, 6) = .findById("wnd[0]/usr/txtKGALS-TXT").Text '段名描述
                    arr2(k, 7) = .findById("wnd[0]/usr/chkKGALS-ACTIVE").Selected '锁定标识符
                    arr2(k, 8) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0307/ctxtKGALS-ABSCH").Text '分配结构
                    arr2(k, 9) = Trim(.findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0307/cmbRKAL1-RCDATAFLG").Text) '可变部分类型
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS").Select '发送方/接收方
                    arr2(k, 10) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[4,67]").Text '成本要素组
                    arr2(k, 11) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[1,17]").Text '发送者成本中心从
                    arr2(k, 12) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[1,42]").Text '发送者成本中心至
                    arr2(k, 13) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[1,67]").Text '发送者成本中心组
                    arr2(k, 14) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[7,17]").Text  '接收方成本中心从
                    arr2(k, 15) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[7,42]").Text '接收方成本中心至
                    arr2(k, 16) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[7,67]").Text   '接收方成本中心组
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND").Select '发送方值
                    arr2(k, 17) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND/ssubSUB1:SAPMKAL1:0451/sub:SAPMKAL1:0451/ctxtKGALK-VALMIN[0,17]").Text '版本
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE").Select  '接收方追踪因素
                    arr2(k, 18) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMIN[0,17]").Text  '活动类型:从
                    arr2(k, 19) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMAX[0,42]").Text     '活动类型:到
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRWFC").Select        '参考加权因素
                    .findById("wnd[0]/tbar[1]/btn[19]").press
                 Loop Until i >= j
                .findById("wnd[1]/tbar[0]/btn[0]").press
            End If
        Next x
    End With

    With ThisWorkbook.Sheets("KSU3")
        .AutoFilterMode = False
        With .Cells(1, 3)
        .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
        .Resize(1, UBound(arr2, 2)) = Split("循环名;循环名描述;开始时间;结束时间;段名;段名描述;锁定标识符;分配结构;可变部分类型;成本要素组;发送者成本中心从;发送者成本中心至;发送者成本中心组;接收方成本中心从;接收方成本中心至;接收方成本中心组;版本;活动类型从;活动类型到", ";")
        If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr2, 2)) = arr2
        End With
    End With

    MsgBox "成功"
End Sub

KSV1、KSV2、KSV3

分配

Sub KSV1_创建实际分配()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否创建实际分配?" & Chr(10) & " " & Chr(10), vbYesNo, "KSV1")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, sr As String, rg As Range, arr1()

    sr = "KSV1"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSV1" '创建实际分摊
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtRKAL1-KSCYC").Text = arr1(2, 1) '循环名
        .findById("wnd[0]/usr/ctxtT811C-SDATE").Text = arr1(2, 3)  '开始时间
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtT811C-EDATE").Text = arr1(2, 4) '结束时间
        .findById("wnd[0]/usr/txtRKAL1-CTXT").Text = arr1(2, 2) '循环名描述

        For x = 2 To UBound(arr1)
            .findById("wnd[0]/tbar[1]/btn[20]").press '增加段
            .findById("wnd[0]/usr/txtKGALS-NAME").Text = arr1(x, 5) '段名
            .findById("wnd[0]/usr/txtKGALS-TXT").Text = arr1(x, 6) '段名描述
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0308/cmbRKAL1-RCDATAFLG").Key = "7" '可变部分类型
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS").Select '发送方/接收方
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[3,67]").Text = "ZZ00" '成本要素组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[1,17]").Text = arr1(x, 7)  '发送者成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[1,42]").Text = arr1(x, 8) '发送者成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[1,67]").Text = arr1(x, 9) '发送者成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[7,17]").Text = arr1(x, 10) '接收方成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[7,42]").Text = arr1(x, 11)  '接收方成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[7,67]").Text = arr1(x, 12)   '接收方成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND").Select '发送方值
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND/ssubSUB1:SAPMKAL1:0451/sub:SAPMKAL1:0451/ctxtKGALK-VALMIN[0,17]").Text = "0" '版本
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE").Select '接收方追踪因素
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMIN[0,17]").Text = "ZZ01" '活动类型:从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMAX[0,42]").Text = "ZZ06" '活动类型:到
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRWFC").Select '参考加权因素
        Next x
    End With

    MsgBox "运行成功!"
End Sub



Sub KSV3_显示实际分配()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否显示实际分配?" & Chr(10) & " " & Chr(10), vbYesNo, "KSV3")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, sr As String, rg As Range, arr1(), arr2(), brr(), k As Long, iMax As Integer, i As Integer, j As Integer
    ReDim arr2(1 To 100000, 1 To 18)
    ReDim brr(1 To 3)

    sr = "KSV3"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value


    With session
        For x = 2 To UBound(arr1)
            If arr1(x, 1) <> "" Then

                .findById("wnd[0]").maximize
                .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSV3" '显示实际分配
                .findById("wnd[0]").sendVKey 0 'Enter
                .findById("wnd[0]/usr/ctxtRKAL1-KSCYC").Text = arr1(x, 1) '循环名
                .findById("wnd[0]/usr/ctxtT811C-SDATE").Text = arr1(x, 2) '开始日期
                .findById("wnd[0]").sendVKey 0 'Enter
                brr(1) = .findById("wnd[0]/usr/txtRKAL1-CTXT").Text   '循环名描述
                brr(2) = .findById("wnd[0]/usr/ctxtT811C-SDATE").Text '开始时间
                brr(3) = .findById("wnd[0]/usr/ctxtT811C-EDATE").Text '结束时间
                .findById("wnd[0]/tbar[1]/btn[6]").press '第一个段
                .findById("wnd[0]/mbar/menu[2]/menu[1]").Select '转到>>概述段
                j = .findById("wnd[1]/usr/txtRCEVM-ENTRIES").Text '段号
                .findById("wnd[1]/tbar[0]/btn[12]").press '取消段概览
                i = 0
                Do
                    On Error Resume Next
                    k = k + 1
                    i = i + 1
                    arr2(k, 1) = arr1(x, 1)
                    arr2(k, 2) = brr(1)
                    arr2(k, 3) = brr(2)
                    arr2(k, 4) = brr(3)
                    arr2(k, 5) = .findById("wnd[0]/usr/txtKGALS-NAME").Text  '段名
                    arr2(k, 6) = .findById("wnd[0]/usr/txtKGALS-TXT").Text '段名描述
                    arr2(k, 7) = .findById("wnd[0]/usr/chkKGALS-ACTIVE").Selected '锁定标识符
                    arr2(k, 8) = Trim(.findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0308/cmbRKAL1-RCDATAFLG").Text) '可变部分类型
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS").Select '发送方/接收方
                    arr2(k, 9) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[3,67]").Text '成本要素组
                    arr2(k, 10) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[1,17]").Text '发送者成本中心从
                    arr2(k, 11) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[1,42]").Text '发送者成本中心至
                    arr2(k, 12) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[1,67]").Text '发送者成本中心组
                    arr2(k, 13) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[7,17]").Text  '接收方成本中心从
                    arr2(k, 14) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[7,42]").Text '接收方成本中心至
                    arr2(k, 15) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[7,67]").Text   '接收方成本中心组
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND").Select '发送方值
                    arr2(k, 16) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND/ssubSUB1:SAPMKAL1:0451/sub:SAPMKAL1:0451/ctxtKGALK-VALMIN[0,17]").Text '版本
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE").Select  '接收方追踪因素
                    arr2(k, 17) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMIN[0,17]").Text  '活动类型:从
                    arr2(k, 18) = .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMAX[0,42]").Text     '活动类型:到
                    .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRWFC").Select        '参考加权因素
                    .findById("wnd[0]/tbar[1]/btn[19]").press
                 Loop Until i >= j
                .findById("wnd[1]/tbar[0]/btn[0]").press
            End If
        Next x
    End With

    With ThisWorkbook.Sheets("KSV3")
        .AutoFilterMode = False
        With .Cells(1, 3)
        .Resize(1, UBound(arr2, 2)).EntireColumn.ClearContents
        .Resize(1, UBound(arr2, 2)) = Split("循环名;循环名描述;开始时间;结束时间;段名;段名描述;锁定标识符;可变部分类型;成本要素组;发送者成本中心从;发送者成本中心至;发送者成本中心组;接收方成本中心从;接收方成本中心至;接收方成本中心组;版本;活动类型从;活动类型到", ";")
        If k > 0 Then .Cells(2, 1).Resize(k, UBound(arr2, 2)) = arr2
        End With
    End With

    MsgBox "成功"
End Sub



Sub KSV2_修改实际分配()
    Dim iMg As VbMsgBoxStyle
    iMg = MsgBox("是否修改实际分配?" & Chr(10) & " " & Chr(10), vbYesNo, "KSV2")
    If iMg = 7 Then Exit Sub

    Dim SapGuiAuto As Object, AppSap As Object, Connection As Object, session As Object
    Set SapGuiAuto = GetObject("SAPGUI")
    Set AppSap = SapGuiAuto.GetScriptingEngine
    Set Connection = AppSap.Children(0)
    Set session = Connection.Children(0)

    Dim x As Integer, sr As String, rg As Range, arr1(), arr2(), brr(), k As Long, iMax As Integer, i As Integer, j As Integer
    ReDim arr2(1 To 100000, 1 To 18)
    ReDim brr(1 To 3)

    sr = "KSV2"
    Set rg = ThisWorkbook.Sheets(sr).UsedRange.Find("*")
    If rg Is Nothing Then
        MsgBox "错误!表【" & sr & "】中无数据!"
        Exit Sub
    End If
    arr1 = rg.CurrentRegion.Value

    With session
        .findById("wnd[0]").maximize
        .findById("wnd[0]/tbar[0]/okcd").Text = "/NKSV2" '修改实际分配
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtRKAL1-KSCYC").Text = arr1(2, 1) '循环名
        .findById("wnd[0]/usr/ctxtT811C-SDATE").Text = arr1(2, 2) '开始日期
        .findById("wnd[0]").sendVKey 0 'Enter
        .findById("wnd[0]/usr/ctxtT811C-EDATE").Text = arr1(2, 3) '结束时间
        .findById("wnd[0]/usr/txtRKAL1-CTXT").Text = arr1(2, 4) '循环名描述
        .findById("wnd[0]/tbar[1]/btn[6]").press '第一个段
        .findById("wnd[0]/mbar/menu[2]/menu[1]").Select '转到>>概述段
        j = .findById("wnd[1]/usr/txtRCEVM-ENTRIES").Text '段号
        .findById("wnd[1]/tbar[0]/btn[12]").press '取消段概览
        For x = 1 To j '为了修改的时候不重名
            .findById("wnd[0]/usr/txtKGALS-NAME").Text = x
            If x <> j Then .findById("wnd[0]/tbar[1]/btn[19]").press '下一段
        Next x
        For x = 1 To j - 1 '回退到第一个段
            .findById("wnd[0]/tbar[1]/btn[18]").press '前一段
        Next x
        For x = 2 To UBound(arr1)
            i = i + 1
            .findById("wnd[0]/usr/txtKGALS-NAME").Text = arr1(x, 5) '段名 (不能大于十个字符)
            .findById("wnd[0]/usr/txtKGALS-TXT").Text = arr1(x, 6) '段名描述
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSQHD/ssubSUB1:SAPMKAL1:0308/cmbRKAL1-RCDATAFLG").Key = "7" '可变部分类型
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS").Select '发送方/接收方
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[3,67]").Text = "ZZ00" '成本要素组
            .findById("wnd[0]/usr/chkKGALS-ACTIVE").Selected = arr1(x, 7) '锁定标识符
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[1,17]").Text = arr1(x, 8)  '发送者成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[1,42]").Text = arr1(x, 9) '发送者成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[1,67]").Text = arr1(x, 10) '发送者成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMIN[7,17]").Text = arr1(x, 11) '接收方成本中心从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-VALMAX[7,42]").Text = arr1(x, 12)  '接收方成本中心至
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpOBJS/ssubSUB1:SAPMKAL1:0306/sub:SAPMKAL1:0306/ctxtKGALK-SETID[7,67]").Text = arr1(x, 13)   '接收方成本中心组
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND").Select '发送方值
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpSEND/ssubSUB1:SAPMKAL1:0451/sub:SAPMKAL1:0451/ctxtKGALK-VALMIN[0,17]").Text = "0" '版本
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE").Select '接收方追踪因素
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMIN[0,17]").Text = "ZZ01" '活动类型:从
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0461/sub:SAPMKAL1:0461/ctxtKGALK-VALMAX[0,42]").Text = "ZZ06" '活动类型:到
            .findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRWFC").Select '参考加权因素
            If x = UBound(arr1) Then
            ElseIf i < j Then
                .findById("wnd[0]/tbar[1]/btn[19]").press
            Else
                .findById("wnd[0]/tbar[1]/btn[20]").press '增加段
            End If
        Next x

        Do While i < j '如果没有修改的必要则全部锁定掉
            i = i + 1
            .findById("wnd[0]/tbar[1]/btn[19]").press '下一个段
            .findById("wnd[0]/usr/chkKGALS-ACTIVE").Selected = "TRUE" '锁定标识符
        Loop
     End With

    MsgBox "成功"
End Sub

与其他方式对比

  1. RPA脚本运行时不能操作键盘鼠标,VBA运行时可以操作SAP的其他界面,操作键盘鼠标也没影响。
  2. RPA 比如勾选复选框后需要等待程式运行,VBA不用
  3. VBA是在简体版本的Excel运行,与繁体版的Excel不通用,中文会有乱码。
  4. RPA运用更广泛,可以在其他应用运行。
  5. 与Tricentis对比

  • 17
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: UiPath 是一种自动化流程机器人 (RPA) 软件,它可以帮助您自动化重复性任务。 当 UiPath 无法输入 SAP 帐号时,可能是因为 SAP GUI 脚本未启用。SAP GUI 脚本是一种用于控制 SAP 系统的脚本,可以在 SAP GUI 上执行各种操作。如果 SAP GUI 脚本未启用,UiPath 就无法与 SAP 系统进行交互,因此无法输入帐号。 如果要解决这个问题,可以在 SAP GUI 中启用脚本。具体方法可能因 SAP 系统版本和配置而异,请咨询 SAP 管理员或查阅 SAP 相关文档。 ### 回答2: Uipath未能输入SAP帐号可能是因为SAP GUI脚本未启用。SAP GUI脚本是一种自动化工具,可以将SAP的操作记录下来并回放,实现自动处理业务流程。要在Uipath中使用SAP GUI脚本,首先需要确保SAP GUI脚本已启用。 要启用SAP GUI脚本,可以按照以下步骤进行操作: 1. 打开SAP,在顶部菜单中选择"工具",然后选择"选项"。 2. 在弹出窗口中,选择"参数"选项卡,然后选择"保护"。 3. 在"启用脚本记录和回放"下方的复选框中,勾选"允许"选项。 4. 确认更改并关闭SAP。 在启用SAP GUI脚本后,确保Uipath的SAP插件已正确安装。然后,可以使用Uipath Studio中的"录制"功能,录制SAP操作的步骤,并生成相应的自动化流程。 如果在使用Uipath输入SAP账号时仍然遇到问题,还可以尝试以下解决办法: 1. 检查SAP账号的正确性,确保用户名和密码正确。 2. 检查Uipath Studio的版本与SAP GUI脚本兼容性,如果不兼容,可以尝试升级Uipath Studio或降级SAP GUI。 3. 检查Uipath Studio中的SAP插件配置是否正确,确保已正确设置SAP的连接信息。 4. 如果以上方法仍然无法解决问题,可以尝试重新安装Uipath Studio和SAP插件,或者联系Uipath官方技术支持进行进一步的帮助和支持。 总结一下,当Uipath无法输入SAP帐号时,首先要确保SAP GUI脚本已启用。如果问题仍然存在,可以检查账号正确性、版本兼容性、插件配置以及重装软件等方法。希望这些解决办法能够帮助您解决问题。 ### 回答3: UiPath未能输入SAP帐号的原因可能是SAP GUI脚本未启用。SAP GUI脚本是一种自动化工具,用于在SAP系统中执行各种操作,包括输入账号和密码等。若未启用SAP GUI脚本,则UiPath无法通过自动化方式进行账号的输入。 为解决这个问题,您可以按照以下步骤操作: 1. 确认SAP GUI脚本已正确安装并启用。请确保SAP GUI脚本的版本与UiPath的版本兼容,并按照UiPath和SAP GUI脚本的文档进行安装和配置。 2. 检查SAP GUI脚本的安全设置。在SAP系统的安全设置中,可能需要设置授权允许外部程序使用SAP GUI脚本进行自动化操作。请参考SAP系统的相关文档,了解如何设置授权。 3. 确保UiPath的活动正确配置。在UiPath中使用SAP GUI脚本时,确保已经正确配置了各个活动的属性,如选择器、目标应用程序等。可以通过重新检查和调整这些属性来解决输入SAP帐号的问题。 4. 检查SAP系统和网络连接。如果SAP系统出现故障或与网络连接不稳定,可能会导致UiPath无法执行账号输入操作。请与SAP系统管理员或网络管理员一起检查并修复问题。 总而言之,如果UiPath未能输入SAP帐号,很可能是由于未启用SAP GUI脚本导致的。通过确认相关软件和配置的正确性,以及检查SAP系统和网络连接,应该能够解决输入SAP帐号的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值