VBATools

Drukowanie zaznaczonych wiadomości oraz plików PDF, jako załączników tych wiadomości

by on Oct.12, 2010, under Outlook, Porady

Jak wydrukować wiadomość z załącznikiem PDF?

Coraz częściej spotykamy się z wiadomościami, które zawierają faktury czy dokumenty eksportowane do pliku PDF. W większości przedsiębiorstwach jest wymóg, aby dokumenty takie zostały przedrukowane i dołączone w formie papierowej w tradycyjnym archiwum (np. w księgowości).

MS Outlook po wciśnięciu opcji drukowania ogranicza nasz wydruk jedynie do treści wiadomości. Co z załącznikami? W tym przypadku standardowo należy otworzyć załącznik i jeszcze raz wykonać tą samą czynność. Dobrze by było to zautomatyzować i to bez otwierania emaili (np. dla zaznaczonych w folderze widoku wiadomości).

Poniżej przestawiony kod realizuje opisane założenie:

Option Explicit
Dim oMail As MailItem, item As Object
Dim oAtmt As Attachment, FileName$

Sub drukuj()
'Dla wszystkich plików PDF
Call PrintPDFAttachments4SelectionEmail()
'Dla tylko tych które w nazwie zawierają słowo "faktura"
'Call PrintPDFAttachments4SelectionEmail("faktura")

For Each oMail In Application.ActiveExplorer.Selection
 oMail.PrintOut 'Można zwielokrotnić drukowanie powielając tą linię
Next
End Sub

Private Sub PrintPDFAttachments4SelectionEmail(Optional AttName$)
'MVP OShon from VBATools.pl
Dim oMail As MailItem, item As Object
Dim oAtmt As Attachment, FileName$, x&

 If FileExists("C:\Temp") = False Then MkDir "C:\Temp"
 On Error GoTo blad

 For Each item In Application.ActiveExplorer.Selection
 If item.Class = 43 Then
 Set oMail = item
 If oMail.Attachments.Count > 0 Then
 For Each oAtmt In oMail.Attachments
 If Len(AttName) = 0 Then
ones:
 FileName = "C:\Temp" & oAtmt.FileName
 If FileExists(FileName) = True Then Kill FileName 'lub odpytanie komendą MSGBOX z parametrem.
 oAtmt.SaveAsFile FileName
 If Right$(UCase(oAtmt.FileName), 3) = "PDF" Then
 Shell """c:\Program Files (x86)\Adobe\Reader 11.0\Reader\acrord32.exe"" /h /p """ + FileName + """", vbHide
 End If
 Else
 If InStr(1, UCase(oAtmt.FileName), UCase(AttName)) > 0 Then GoTo ones
 End If
 Next oAtmt
 End If
 End If
 Next item
Exit Sub
blad:
MsgBox Err.Number & vbCr & Err.Description, vbExclamation, "O'Shon from VBATools.pl"
End Sub
Private Function FileExists(FilePath As String) As Boolean
On Error GoTo blad
 FileExists = Len(Dir(FilePath, vbDirectory Or vbHidden Or vbSystem)) > 0
Exit Function
blad:
FileExists = False
End Function

Ze względu na możliwość instalacji AcrobatReadera w różnych konfiguracjach należy w kodzie podać poprawną ścieżkę do pliku „acrord32.exe”.

W przypadku problemów z samym wydrukiem PDFa (krzaki), należy pamiętać, iż w konfiguracji drukarki dobrze jest zaznaczyć, aby w Acrobacie Drukowanie/Zaawansowane ustawić “Drukować jako obraz”.

Aby zautomatyzować pracę można też przypisać makro „drukuj” do przycisku w pasku menu lub skorzystać z automatu, tworząc nową regułę w Kreatorze reguł „Menu/Reguły i alerty”. Dla plików osadzonych już na dysku polecam mechanizm drukujący pod Excela, którym bez podglądu wyślesz pobrane nazwy plików, przesortujesz wg swoich potrzeb i zaznaczone hiperlinki do plików PDF wyślesz na drukarkę.

(c) Shon Oskar – www.VBATools.pl

Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.

:, , , ,

8 Comments for this entry

  • Lukasz

    Witam,
    skrypt rewelacyjny. Jednak mam pytanie co trzeba zmienić, aby drukować wyłącznie załączniki PDF?

    pozdr, Lukasz

    • vbatools

      Procedura drukuj() specjalnie powstała aby rozdzielić zadania a wiec posiada 2 polecenia.
      Pierwszy to wywołanie podprocedury, którą mona parametryzować po nazwie załącznika PDF), drugi to pętla wydruku treści maila:
      For Each oMail In Application.ActiveExplorer.Selection
      oMail.PrintOut 'Można zwielokrotnić drukowanie powielając tą linię
      Next

      można te linijki usunąć, a w tedy będą brane pod uwagę tylko załączniki.

  • RoPsi

    Witam
    Mam pytanie odnośnie drukowania dwustronnego. Czy dorzucamy jakiś parametr w wywołaniu “shell”, nie mogę znaleźć jakichś specyfikacji tej funkcji, czy musimy ustawić w parametrach drukarki drukowanie domyślnie jako dwustronnie? (wolałbym dodatkowy parametr – domyślnie częściej korzystam z drukowania jednostronnego).
    Sam skrypt rewelacja

    Pozdrawiam
    RoPsi

  • Rafal

    Witam, chcialbym aby outlook (1)zapisywal zalacznik PDF do okreslonej lokalizacji i (2)drukowal ten zalacznik na domyslnej drukarce. Oba warunki sa uruchamiane z reguly (po nadejciu maila ze slowem “faktura 504” w temacie maila).

    Punkt pierwszy juz zrealizowalem, w module 2 umiescilem kod:

    Sub TylkoZapisNaDysk(item As MailItem)
    If item.Class = olMail Then
    If item.Attachments.Count > 0 Then
    Dim objAtt As Outlook.Attachments
    Set objAtt = item.Attachments
    For Each objAttach In objAtt

    objAttach.SaveAsFile “C:\testy\” & _
    objAttach.FileName ‘wprowadzenie daty określi że nie będą nadpisywane (jeśli nie potrzebne pow. linijkę można usnąć)
    Next
    Set objAtt = Nothing
    End If
    End If
    End Sub

    … i jest on widoczny w regule. Wszystko dziala. Probowalem natomiast polaczaczyc go z drukowaniem zalacznika, jednak tutaj mam problem. Prosze o pomoc.

    • vbatools

      Proszę sobie sprawdzić ścieżkę do acrobata a potem wywołać z CMD.exe komendę
      c:\Program Files (x86)\Adobe\Reader 11.0\Reader\acrord32.exe /h /p nazwa_pliku.pdf
      Powinien zostać wywołany wydruk na domyślna drukarkę.

  • Rafal

    Panie Oskarze, Acrobat znajduje sie w lokalizacji C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe

    Moze Pan wskazac jakie linijki i w ktorym miejscu nalezy umiescic w istniejacym makrze “TylkoZapisNaDysk”, aby makro zapisywalo i drukowalo, tak jak oczekuje. Bede bardzo wdzieczny za pomoc. Ewentualnie prosze o podeslanie na maila ohiorafal@wp.pl

Leave a Reply

Recently Active Members

Profile picture of vbatools
Profile picture of Karol Stilger
Profile picture of Anorak
Profile picture of marcinmachalowski
Profile picture of Joanna Subik
Profile picture of programistaaccess
Profile picture of piotrpawlik
Profile picture of Emil Wasilewski
Profile picture of kicekpicek
Profile picture of coldfusion
Profile picture of Gosia Borzęcka
Profile picture of lukaszch
Profile picture of itadministracja
Profile picture of farbenia
Profile picture of Łukasz Kałużny
Profile picture of kabzinski
Profile picture of rtynski
Profile picture of leszekbetlinski
Profile picture of Iv
Profile picture of Justyna Spychała