VBA调用打印对话框打印文本文件输出空白页,求助原因及解决办法
问题原因
你当前代码的核心问题是:调用Application.Dialogs(xlDialogPrint).Show触发的是Excel自身的打印对话框,而非记事本的打印功能。所以实际打印的是当前Excel工作簿的内容(若当前工作表为空,就会输出空白页),和记事本打开的TXT文件没有任何关联。
解决办法
提供两种可行方案,按需选择:
方案一:直接静默打印TXT文件(无需手动操作)
通过Windows API的ShellExecute函数,直接调用系统关联程序(默认是记事本)打印TXT文件,无需打开窗口,自动提交到默认打印机:
' 需在模块顶部声明API函数 Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Public Sub PrintLabelTextFile2(Optional strPathAndFilename As String) If strPathAndFilename = "" Then strPathAndFilename = LabelTextFile ' 提交打印任务到默认打印机 ShellExecute 0, "print", strPathAndFilename, vbNullString, vbNullString, 0 ' 等待打印任务完成(时间可根据实际情况调整) Application.Wait Now + TimeValue("00:00:05") ' 删除文件 Kill strPathAndFilename End Sub
方案二:保留打印机选择交互
利用记事本的/p命令行参数,打开文件的同时弹出原生打印对话框,用户选择打印机完成打印后,等待记事本关闭再删除文件:
Public Sub PrintLabelTextFile2(Optional strPathAndFilename As String) If strPathAndFilename = "" Then strPathAndFilename = LabelTextFile ' 打开记事本并弹出打印对话框 Dim notepadPID As Double notepadPID = Shell("Notepad.exe /p " & strPathAndFilename, vbNormalFocus) ' 循环等待记事本进程关闭(用户完成打印后关闭窗口) Dim objWMI As Object, objProcesses As Object Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Do Set objProcesses = objWMI.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = " & notepadPID) DoEvents Loop Until objProcesses.Count = 0 ' 删除文件 Kill strPathAndFilename End Sub
内容的提问来源于stack exchange,提问作者pynicole
相关产品推荐
相关产品推荐

