iso-96
Goto Top

Outlook 2007 - Automatisch PDF-Anhänge ausdrucken bei mehreren Emails gleichzeitig

Hallo Administrator-Community,

und zwar brauchen wir ein VBA-Script, dass alle Rechnungen, die als PDF im Anhang einer Mail kommen, automatisch ausgedruckt werden. Also nur die PDF ohne der Mail.

Soweit sind wir bisjetzt gekommen:

Per Regel werden alle Mails mit einem Anhang und dem Wort "Rechnung" im Betreff in den Unterordner "Auto_Rechnungsdruck" vom Posteingang verschoben.
Dort wird dann folgendes Script aktiviert.
Private 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

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
Dim Ns As Outlook.NameSpace
Dim Folder As Outlook.MAPIFolder

Set Ns = Application.GetNamespace("MAPI")  
Set Folder = Ns.GetDefaultFolder(olFolderInbox).Folders("Auto_Rechnungsdruck") 'Kontrollordner in Outlook  
Set Items = Folder.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)

If TypeOf Item Is Outlook.MailItem Then
    PrintAttachments Item
End If
End Sub

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer = 0 Then
            'Crossing midnight  
            PauseTime = PauseTime - Elapsed
            Start = 0
            Elapsed = 0
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function

Private Sub PrintAttachments(oMail As Outlook.MailItem)
On Error Resume Next
Dim colAtts As Outlook.Attachments
Dim oAtt As Outlook.Attachment
Dim bla As Boolean
bla = True
Dim sFile As String
Dim sDirectory As String
Dim sFileType As String
sDirectory = "C:\tmp\Attachment\" 'Temporärer Speicherort PDF-Anhang  
Set colAtts = oMail.Attachments
If colAtts.count Then
    For Each oAtt In colAtts
        sFileType = LCase$(Right$(oAtt.FileName, 4))
        Select Case sFileType
            Case ".pdf"  
            sFile = sDirectory & oAtt.FileName
            oAtt.SaveAsFile sFile
            ShellExecute 0, "print", sFile, vbNullString, vbNullString, 0  
            Pause (45) 'Zeit in Sekunden nach löschen der PDF  
            Kill "C:\tmp\Attachment\" & oAtt.FileName  
        End Select
    Next
End If
End Sub
Grobe Erklärung des Codes:
Sobald eine E-Mail in den Ordner "Auto_Rechnungsdruck" kommt, wird dieser Script aktiviert.
Der Speichert nur die PDF, die im Anhang ist, in das Verzeichnis "C:\tmp\Attachment\" gespeichert, anschließend gedruckt. Danach wird die PDF wieder gelöscht, damit die Festplatte nicht unnötig voll läuft.

Da der Druckvorgang übers Netzwerk seine Zeit braucht, startet vor dem Löschvorgang ein Timer der hier 45 Sekunden geht. Ansonsten wird die PDF, bevor sie gedruckt werden kann gelöscht und der Adobe Reader bringt dementsprechend eine Fehlermeldung.

Das funktioniert eigentlich alles einwandfrei. Zumindest wenn die Emails frühestens alle 45 Sekunden eintreffen, also nachdem das Script beendet ist.
Denn nun kommen wir zu den Problemen..

Sobald mehrere Rechnungen gleichzeitig kommen, wird nur die erste PDF ausgedruckt. Alle anderen nicht.

Das ist besonders hinderlich, wenn vorallem auch Rechnungen über Nacht kommen und Rechner aus geschaltet ist, also das Script garnicht laufen kann.


Am Ende sollte es so aussehen, dass alle PDF-Anhänge automatisiert ausgedruckt werden sollen. Selbst wenn zum Beispiel 50 Rechnungen aufeinmal kommen.
Ob die PDFs alle aufeinmal bearbeitet werden oder das Script 50mal aufgerufen wird ist eigentlich egal. Dann dauert es eben 50 * 45 Sekunden.


Hätte da jemand einen Tipp oder Lösung wie bzw. ob das möglich währe?
Denn ansonsten werden wir nach einer anderen Lösung leider suchen müssen.
Mit einem externen Programm vllt..

Oder gibt es vllt einen anderen Lösungsweg?

Ich bedanke mich schonmal über jede hilfreiche Antwort.

Hoffe ich habe euch nicht zuarg verwirrt. sonst einfach fragen wenn was unverständlich ist


Mit freundlichen Grüßen Iso

Content-Key: 255929

Url: https://administrator.de/contentid/255929

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: 114757
114757 26.11.2014 aktualisiert um 12:47:00 Uhr
Goto Top
Moin,
und zwar brauchen wir ein VBA-Script
yup wir alle brauchen was ....das ist aber kein Selbstbedienungsladen hier.

mach es doch so:
1. erstelle einen weiteren Unterordner in dem Rechnungsordner für bereits gedruckte Rechnungen
2. Du bindest das Drucken der Rechnungen einmal an das NewMailEx-Event von Outlook das jedes mal auftritt, wenn eine neue Mail eintrifft.
3. Bei jedem eintreffen einer Mail überprüfst du den Rechnungs-Ordner auf neue Mails, druckst sie und verschiebst die Rechnung in den Unterordner.
4. Für den Fall das der Rechner eben nicht nachts läuft, lässt du die Prozedur ebenfalls beim Startup-Event von Outlook einmal anlaufen.

Gruß jodel32
Mitglied: ISO-96
ISO-96 27.11.2014 aktualisiert um 08:14:15 Uhr
Goto Top
Hallo jodel32,

vielen Dank für deine Antwort.

leider habe ich wenig Ahnung von VBA..

Sofern ich das richtig verfolgen kann, klingt dass schonmal nach einem richtigen Lösungsweg.

Nur habe ich kein Plan wie ich das umsetzen könnte..

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
 MsgBox "Neue E-Mail ist eingetroffen"  
End Sub

Meinst du sowas in der Art?


Gruss Iso
Mitglied: 114757
114757 27.11.2014 aktualisiert um 11:19:00 Uhr
Goto Top
leider habe ich wenig Ahnung von VBA
Klar, dat haben sie alle nich, oh man, dann beleg erst mal einen Kurs und komm dann zurück, tsss .......
Mitglied: ISO-96
ISO-96 27.11.2014 um 11:21:24 Uhr
Goto Top
Sehr freundlich..

Bin bereits seit einigen Tagen am suchen und stöbern in anderen Foren und konnte so einigermaßen den obigen Code zusammen stellen und VBA zu lernen. Bin halt noch ein Einfänger in VBA. Nur komme ich momentan nicht weiter..

Nun wollte hier nur fragen ob jemand einen Tipp oder Lösungsbeispiel hat die das Problem was ich noch habe.

Zitat von @114757:
1. erstelle einen weiteren Unterordner in dem Rechnungsordner für bereits gedruckte Rechnungen
2. Du bindest das Drucken der Rechnungen einmal an das NewMailEx-Event von Outlook das jedes mal auftritt, wenn eine neue Mail
eintrifft.
3. Bei jedem eintreffen einer Mail überprüfst du den Rechnungs-Ordner auf neue Mails, druckst sie und verschiebst die
Rechnung in den Unterordner.
4. Für den Fall das der Rechner eben nicht nachts läuft, lässt du die Prozedur ebenfalls beim Startup-Event
von Outlook einmal anlaufen.

Das hast du ja. Danke!

Hatte dazu dann was gefragt und von dir kam wieder son [...] Kommentar..

Daher.. wenn du noch auf meine Fragen beantworten würdest.. Sehr gerne!

Ansonsten spar die einfach solche Kommentare und ignoriere meinen Beitrag bitte. Das hilft uns beiden nicht weiter.

Ich verlange/will nicht das du mir grad den fertigen Code auf dem Silbertablett servierst, ich faul in meinen Sessel hocke und die Arbeit anderen machen lasse.. NEIN! Tut mir leid wenn es evtl. so rüber kam..
Ich suche währenddessen ja noch nach einer Lösung im Inet..

Gruß Iso
Mitglied: ISO-96
ISO-96 08.12.2014 aktualisiert um 08:20:50 Uhr
Goto Top
Schade.


Hab den Code nun verändert und er funktioniert nun um einiges besser.
Danke nochmal jodel für deinen Tipp. Hat geholfen mit den Ordner.

Aber denke es ist zwecklos eine weitere Frage zu stellen darüber.

[/CLOSEREQUEST]