Printing PDF files with VBA

前端 未结 2 936
鱼传尺愫
鱼传尺愫 2020-12-21 05:41

I am new to coding with VBA. This is my unfinished code to print documents in a folder containing documents with 3 distinct headers, \"DN\" \"INV\" and \"PO\". I\'ve been se

相关标签:
2条回答
  • 2020-12-21 06:12

    The VBA code from Kajkrow works well. I needed to print to specific printer, so, if someone is looking at this, I found a solution that worked for me, simple use "printto" instead of "print" as the verb of SheelExecute, and provide the name of the specific printer name in the fourth parameter just after the filename.

    Call apiShellExecute(Application.hwnd, "printto", strPathAndFilename, "my printer name", vbNullString, 0)
    
    0 讨论(0)
  • 2020-12-21 06:23

    Yo,

    I found this: 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
    

    But this only let's you print on your default printer.

    I tested it. It works:

    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
    

    So, after correcting a mistake, that it is VBS and not VBA i suggest this code:

    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")
    
    0 讨论(0)
提交回复
热议问题