通过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定位按钮并模拟点击:
- 在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
- 在脚本注释位置插入以下代码:
' 等待对话框加载(根据实际情况调整等待时长) 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
相关产品推荐
相关产品推荐

