Excel VBA + GUI Script 批量更新SAP安全库存 - MM02

这篇博客介绍了如何使用Excel VBA编写脚本,通过连接到SAP系统并调用T-Code MM02来自动更新物料的安全库存。脚本首先获取SAP会话,然后遍历工作表中的数据,对状态为0的行进行处理,更新指定的物料和工厂的安全库存,并在处理过程中处理可能出现的错误。最后,脚本会在Excel中更新处理进度和状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前使用VBA写过几个GUI Script,这个是用来使用T-Code MM02自动更新SAP的安全库存,效率不高,但可以用来借鉴实现其它功能

下载链接:https://download.youkuaiyun.com/download/afterain/20260366

在Excel VBA新建模块后把以下代码复制进去



Option Explicit
Public SapGuiAuto, WScript, msgcol
Public objGui  As GuiApplication
Public objConn As GuiConnection
Public objSess As GuiSession
Public objSBar As GuiStatusbar
Public objSheet As Worksheet
Dim W_System
Dim iCtr As Integer
Const tcode = "MM02"


Function Attach_Session(iRow, Optional mysystem As String) As Boolean
Dim il, it
Dim W_conn, W_Sess

' Unless a system is provided (XXXYYY where XXX is SID and YYY client)
' get the system from the sheet (in this case it is in cell A8)
If mysystem = "" Then
    W_System = ActiveSheet.Cells(iRow, 1)
Else
    W_System = mysystem
End If

' If we are already connected to a session, exit do not try again
If W_System = "" Then
   Attach_Session = False
   Exit Function
End If

' If the session object is not nil, use that session (assume connected to the correct session)
If Not objSess Is Nothing Then
    If objSess.Info.SystemName & objSess.Info.Client = W_System Then
        Attach_Session = True
        Exit Function
    End If
End If

' If not connected to anything, set up the objects
If objGui Is Nothing Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set objGui = SapGuiAuto.GetScriptingEngine
End If

' Cycle through the open SAP GUI sessions and check which is in the same system running the matching transaction
For il = 0 To objGui.Children.Count - 1
    Set W_conn = objGui.Children(il + 0)
    For it = 0 To W_conn.Children.Count - 1
        Set W_Sess = W_conn.Children(it + 0)
        If W_Sess.Info.SystemName & W_Sess.Info.Client = W_System And W_Sess.Info.Transaction = tcode Then
            Set objConn = objGui.Children(il + 0)
            Set objSess = objConn.Children(it + 0)
            Exit For
        End If
    Next
Next

' If nothing is found, display and error message
If objSess Is Nothing Then
   MsgBox "No active session to system " + W_System + " with transaction " + tcode + ", or scripting is not enabled.", vbCritical + vbOKOnly
   Attach_Session = False
   Exit Function
End If

' Turn on scripting
If IsObject(WScript) Then
   WScript.ConnectObject objSess, "on"
   WScript.ConnectObject objGui, "on"
End If

' Maximize the window of the connected session
Set objSBar = objSess.FindById("wnd[0]/sbar")
objSess.FindById("wnd[0]").Maximize
Attach_Session = True


End Function

Public Sub StartProcessing()

Dim W_Obj1, W_Obj2, W_Obj3, W_Obj4, iRow
Dim W_Func
Dim W_Src_Ord
Dim W_Ret As Boolean
Dim itemcount As Integer
Dim itemmax As Integer
Const startrow As Integer = 11 'First row with actual data

Set objSheet = ActiveWorkbook.ActiveSheet
' Connect to a system stored in cell A8
W_Ret = Attach_Session(8)
If Not W_Ret Then
    MsgBox "Not connected to client"
    GoTo MyEnd
End If

itemcount = 0
itemmax = 0

' Determine the number of items to be processed: where the status is zero
For iRow = startrow To objSheet.UsedRange.Rows.Count
    If objSheet.Cells(iRow, 3) = "0" Then
        itemmax = itemmax + 1
    End If
Next
' Update the counter in cell A9
objSheet.Cells(9, 1) = itemcount & "/" & itemmax

' Cycle through the rows with status 0 and call the ProcessRow function to process them
For iRow = startrow To objSheet.UsedRange.Rows.Count
    If objSheet.Cells(iRow, 3) = "0" Then
        Call ProcessRow(iRow)
        itemcount = itemcount + 1
        objSheet.Cells(9, 1) = itemcount & "/" & itemmax
    End If
Next
           

MyEnd:
' destory the objects, free up memory
    Set objSess = Nothing
    Set objGui = Nothing
    Set SapGuiAuto = Nothing
    
    MsgBox "Script completed.", vbInformation + vbOKOnly
       
End Sub

Function ProcessRow(iRow)
Dim W_MaterialNO, W_SafetyStock
Dim lineitems As Long
Dim W_Plant As String
Dim iPage As Integer
Dim iChildrenCount As Integer
Dim iAbsoluteRow As Integer
Dim bl_Selected As Boolean

iAbsoluteRow = 0
bl_Selected = False

' Set the line status to "processing..."
objSheet.Cells(iRow, 3) = 1

'Plant
W_Plant = objSheet.Cells(9, 5)

'Material NO

W_MaterialNO = objSheet.Cells(iRow, 1)


'Safety Stock
If objSheet.Cells(iRow, 2) <> "" Then
    W_SafetyStock = objSheet.Cells(iRow, 2)
Else
    W_SafetyStock = ""
End If

' Set error handling to the below code where we can capture if a line had failed in the GUI script
On Error GoTo myerr

' SAP GUI Script starts here


objSess.FindById("wnd[0]").Maximize
objSess.FindById("wnd[0]/tbar[0]/okcd").Text = "/nmm02"
objSess.FindById("wnd[0]/tbar[0]/btn[0]").press
objSess.FindById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = W_MaterialNO
objSess.FindById("wnd[0]/tbar[1]/btn[5]").press
objSess.FindById("wnd[1]/tbar[0]/btn[19]").press

'In order to search the target View, need find if need scroll down page
For iPage = 0 To objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").VerticalScrollbar.Maximum Step objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").VerticalScrollbar.PageSize
    
    'Search the view
    For iChildrenCount = 0 To objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").Children.Count - 1

        'Choose target view if it's been found
        If objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").GetAbsoluteRow(iAbsoluteRow).Item(0).Text = "MRP 2" Then
            Debug.Print "iAbsoluteRow=" & iAbsoluteRow
            Debug.Print objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").GetAbsoluteRow(iAbsoluteRow).Item(0).Text
            objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").GetAbsoluteRow(iAbsoluteRow).Selected = True
            bl_Selected = True
            Exit For
        End If
        'Calculate the absolute row
        iAbsoluteRow = iAbsoluteRow + 1
    Next iChildrenCount
    If bl_Selected = True Then
        Exit For
    End If
    objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").VerticalScrollbar.Position = objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").VerticalScrollbar.Position + objSess.FindById("wnd[1]/usr/tblSAPLMGMMTC_VIEW").VerticalScrollbar.PageSize
Next iPage

objSess.FindById("wnd[1]/tbar[0]/btn[0]").press
objSess.FindById("wnd[1]/usr/ctxtRMMG1-WERKS").Text = W_Plant
objSess.FindById("wnd[1]/usr/ctxtRMMG1-LGORT").Text = ""
objSess.FindById("wnd[1]/tbar[0]/btn[0]").press

'Set target value: safety stock
objSess.FindById("wnd[0]/usr/tabsTABSPR1/tabpSP16/ssubTABFRA1:SAPLMGMM:2000/subSUB4:SAPLMGD1:2486/txtMARC-EISBE").Text = W_SafetyStock

'Press save button
objSess.FindById("wnd[0]/tbar[0]/btn[11]").press

'In case warning message, send "Enter" key until no warning message
Do While objSBar.MessageType = "W"
    objSess.FindById("wnd[0]").sendVKey 0
Loop

' Gets the message from the status bar and save it in column B
objSheet.Cells(iRow, 5) = objSBar.Text

' Update the Status to "Completed" and exit
objSheet.Cells(iRow, 3) = 2
Exit Function

myerr:
' Update the status to "Error"
objSheet.Cells(iRow, 3) = 3
End Function

在Excel增加按钮并将StartProcessing放入其中

Private Sub CommandButton1_Click()
StartProcessing
End Sub

### 如何在 SAP LSMW 中录制 MM02 事务代码时处理复选框 在 SAP LSMW (Legacy Systems Migration Workbench) 录制过程中,对于像 MM02 这样的事务代码涉及的复选框操作,可以按照如下方法进行: #### 准备工作 确保已安装并配置好必要的 Collective(RSM13005)[^1] 程序用于支持后续可能的数据传输需求。 #### 创建和维护对象类型定义 进入 LSMW 工具,在创建新的转换项目前先定义好所需的对象类型。这一步骤不直接关联到复选框的操作,但对于整体流程至关重要。 #### 开始录制过程 当准备就绪后启动 MM02 的录制会话: - 打开 LSMW 并选择 `Tools` -> `ABAP Development` -> `LSMW`. - 输入相应的业务场景名称以及描述. - 接下来点击 `Execute Transaction Code Directly`,输入要记录的交易码即 "MM02". #### 处理复选框的具体步骤 针对具体含有复选框界面的情况,比如修改物料主数据中的某些选项卡下的勾选项: - **定位至目标字段**: 使用鼠标导航到包含复选框的目标屏幕区域。 - **模拟用户交互行为**: - 对于单个复选框的选择,可以通过双击该控件来激活它; 或者通过键盘快捷键实现(如果适用). - **保存更改** - 完成所有必填项填写之后按下 Enter 键提交当前页面上的变更. 为了更直观理解上述文字说明,下面给出一段简单的 ABAP 脚本片段作为辅助解释如何编程控制这些动作(注意实际应用中应依据具体情况调整): ```abap CALL TRANSACTION 'MM02' USING it_mm02 OPTIONS FROM wa_options. SET PFSTATUS 'ZPFSTAT_MM02'. SET TITLEBAR 'MATERIAL_MAINTENANCE'. * 假设有一个名为 CHKBOX_01 的复选框需要被选中 PERFORM select_checkbox FIELDNAME = 'CHKBOX_01' VALUE = 'X'. " X 表示选中状态 ``` 以上脚本展示了调用 MM02 事务并将特定复选框设置为选定状态的过程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP乞丐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值