使用 VBA 打印 PDF 文件

Printing PDF files with VBA

我是 VBA 编码的新手。这是我未完成的代码,用于在包含具有 3 个不同 headers、"DN" "INV" 和 "PO" 的文档的文件夹中打印文档。我一直在寻找 code/method 来打印 PDF 文档。我尝试使用 invokeverb "&print" 函数,但它似乎不起作用。有人可以教我如何打印出来吗?非常感谢:)

P.S。 "DN"需要打印一次,“INV”需要打印6次,"PO"需要打印2次。

'' To set the path to the current folder

set shApp = CreateObject("shell.application")

currentPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".") 

set shFolder = shApp.NameSpace( currentPath )

'' To set the items in the current folder as "files"

set files = shFolder.Items()

''Start of code''

'msgbox("Starting Script")

for each files in files

        ' If name contains "DN" '
        if inStr(files, "DN") then
            'print out 1 time'
        end if
        ' if name contains "INV" '
        if inStr(files, "INV") then
            'print out 6 times'
        end if
        ' if name contains "PO" '
        if inStr(files, "PO") then
            'print out 2 times'
        end if
next
MsgBox("completed")

哟,

我发现了这个:https://www.ozgrid.com/forum/forum/help-forums/excel-general/90407-printing-a-file-using-vba-code

Option Explicit

Declare Function apiShellExecute 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 PrintFile(ByVal strPathAndFilename As String)

   Call apiShellExecute(Application.hwnd, "print", strPathAndFilename, vbNullString, vbNullString, 0)

End Sub

Sub Test()

   PrintFile ("C:\Test.pdf")

End Sub

但这只能让您在默认打印机上打印。

我测试过了。有效:

Declare Function apiShellExecute 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 PrintFile(ByVal strPathAndFilename As String)

   Call apiShellExecute(Application.hwnd, "print", strPathAndFilename, vbNullString, vbNullString, 0)

End Sub

Sub PrintPDF()

'' To set the path to the current folder

Set shApp = CreateObject("shell.application")

'currentPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".")
currentPath = Application.ActiveWorkbook.Path

Set shFolder = shApp.Namespace(currentPath)

'' To set the items in the current folder as "files"

Set Files = shFolder.Items()

''Start of code''

'msgbox("Starting Script")

For Each file In Files
   If InStr(file, ".pdf") Then
       ' If name contains "DN" '
       If InStr(file, "DN") Then
           PrintFile (currentPath + "\" + file)
       End If
       ' if name contains "INV" '
       If InStr(file, "INV") Then
           For i = 1 To 6
               PrintFile (currentPath + "\" + file)
           Next i
       End If
       ' if name contains "PO" '
       If InStr(file, "PO") Then
               PrintFile (currentPath + "\" + file)
               PrintFile (currentPath + "\" + file)
       End If
   End If
Next
MsgBox ("completed")

End Sub

所以,在更正错误后,它是 VBS 而不是 VBA 我建议这个代码:

Set shApp = CreateObject("shell.application")

Set shFolder = shApp.Namespace(currentPath)

'' To set the items in the current folder as "files"

Set Files = shFolder.Items()

''Start of code''

For Each file In Files
If InStr(file, ".pdf") Then
   ' If name contains "DN" '
   If InStr(file, "DN") Then
       file.InvokeVerbEx("Print")
       WScript.Sleep 1000 'wait 1 sec
   End If
   ' if name contains "INV" '
   If InStr(file, "INV") Then
       Filename = currentPath + "\" + file
       Do
           i = i+1
           file.InvokeVerbEx("Print") 
           WScript.Sleep 1000 'wait 1 sec
       Loop until i >=6
       i = 0
   End If
   ' if name contains "PO" '
   If InStr(file, "PO") Then
       Filename = currentPath + "\" + file
           file.InvokeVerbEx("Print") 
           WScript.Sleep 1000 'wait 1 sec
           file.InvokeVerbEx("Print") 
           WScript.Sleep 1000 'wait 1 sec
    End If
End If
Next
MsgBox ("completed")

来自 Kajkrow 的 VBA 代码运行良好。我需要打印到特定的打印机,所以,如果有人在看这个,我找到了一个适合我的解决方案,简单地使用“printto”而不是“print”作为 ShellExecute 的动词,并提供特定打印机的名称在文件名之后的第四个参数中命名。

Call apiShellExecute(Application.hwnd, "printto", strPathAndFilename, "my printer name", vbNullString, 0)