You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Excel的SAP GUI脚本打印时自动点击确定按钮的方法

解决SAP脚本自动点击打印确定按钮的问题

我又碰到了个棘手的老问题:怎么自动点击打印时的确定按钮。我录了一段SAP打印文档的脚本,但弹出新的打印机对话框时,必须手动点确定,脚本识别不了这个窗口和按钮。以下是脚本代码和对话框说明:

Sub SAP_PrntLgBestListe_Conv()

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

With SAPSession
 .StartTransaction "MB52"
 .findById("wnd[0]/tbar[1]/btn[17]").press
 .findById("wnd[1]/usr/txtENAME-LOW").Text = "DARASIC"
 .findById("wnd[1]/tbar[0]/btn[8]").press
 .findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 1
 .findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "1"
 .findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell
 .findById("wnd[0]/tbar[1]/btn[8]").press
 .findById("wnd[0]/tbar[0]/btn[86]").press
 .findById("wnd[1]/tbar[0]/btn[13]").press       'Spool-Order sent to SAP-Printer LOCL - Printer window appears

' Here needs to click OK on printer window

End With

End Sub 

弹出的是系统默认打印对话框(包含打印机选择、打印范围等选项,需点击「确定」按钮完成打印)


方法1:通过SAP参数跳过打印对话框

在触发打印前直接配置SAP打印参数,无需弹出系统对话框:
替换原脚本中.findById("wnd[1]/tbar[0]/btn[13]").press相关代码为以下内容:

' 配置打印参数,指定打印机并自动执行
.findById("wnd[1]/usr/ctxtPRI_PARAMS-PRINTER").Text = "LOCL" ' 目标打印机
.findById("wnd[1]/usr/chkPRI_PARAMS-IMMED").Selected = True ' 立即打印
.findById("wnd[1]/usr/chkPRI_PARAMS-NEW_PAGE").Selected = True ' 起始新页
.findById("wnd[1]/tbar[0]/btn[11]").press ' 直接提交打印,跳过系统对话框

方法2:用Windows API识别并点击对话框

如果必须处理系统级打印窗口,可通过API定位按钮并模拟点击:

  1. 在VBA模块顶部添加API声明(需确保模块是标准模块):
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Const BM_CLICK = &HF5
  1. 在脚本注释位置插入以下代码:
' 等待对话框加载(根据实际情况调整等待时长)
Application.Wait Now + TimeValue("00:00:02")

' 定位打印对话框(窗口标题为「打印」,需匹配系统语言)
Dim printWnd As LongPtr
printWnd = FindWindow(vbNullString, "打印")

' 定位「确定」按钮
Dim okBtn As LongPtr
okBtn = FindWindowEx(printWnd, 0, "Button", "确定")

' 发送点击指令
If okBtn <> 0 Then
    SendMessage okBtn, BM_CLICK, 0, 0
End If

注意:若系统为非中文,需修改窗口标题和按钮文本为对应语言内容。

方法3:SendKeys模拟按键(临时方案)

如果上述方法无法实现,可尝试模拟Enter键(前提是确定按钮为默认选中状态):

' 等待对话框弹出
Application.Wait Now + TimeValue("00:00:01")
' 模拟按下Enter键
SendKeys "{ENTER}", True

此方法依赖窗口焦点,易受其他窗口干扰,仅作应急使用。


内容的提问来源于stack exchange,提问作者I Forte Si Daja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:24:05