Drukowanie zaznaczonych wiadomości oraz plików PDF, jako załączników tych wiadomości
by vbatools 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.
October 3rd, 2013 on 11:34
Witam,
skrypt rewelacyjny. Jednak mam pytanie co trzeba zmienić, aby drukować wyłącznie załączniki PDF?
pozdr, Lukasz
October 4th, 2013 on 10:08
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.
January 22nd, 2014 on 12:19
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
January 22nd, 2014 on 16:40
Drukowanie 2-stronne to parametr ustawień sterownika drukarki. Można go włączyć w ustawieniach.
January 23rd, 2014 on 12:34
Witam ponownie
A czy z poziomu VBA jesteśmy to w stanie zrobić ?
Chodzi o włączenie duplexu przed zadaniem drukowania i wyłączenie po wydrukowaniu.
Pozdrawiam
May 6th, 2016 on 09:20
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.
May 6th, 2016 on 15:45
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ę.
May 17th, 2016 on 14:21
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