Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Print Outlook Attachment - AdobeReader ist zu langsam für Makro!

Frage Entwicklung VB for Applications

Mitglied: marco1234

marco1234 (Level 1) - Jetzt verbinden

25.02.2010 um 11:02 Uhr, 6643 Aufrufe, 15 Kommentare

Hallo zusammen

Die Logistikabteilung unserer Firma bekommt täglich vom Zoll Mails mit einem PDF im Anhang. Ich wurde angefragt, ob es eine Lösung gibt, um nur den Anhang automatisiert auszudrucken. Ich habe mich für ein Makro entschieden. (wir wollten keine kostenpflichtigen Tools anschaffen)

Dieses Makro läuft auch recht gut. Kürzlich ist aber das Problem entdeckt worden, dass, wenn zwei Mails zur gleichen Zeit ankommen, nur das erste Mail gedruckt wird und das zweite vom Programm "vergessen" wird. Ich habe darauf hin eine While-Schlaufe eingebaut, welche alle Mails im Posteingang nochmals durchgeht und die Anhänge der nicht gelesenen Mails ausdruckt.

Dies würde theoretisch auch funktionieren... nur, das Makro ist viel zu schnell für den AdobeReader. Der Reader bringt immer eine Meldung, dass er die Datei nicht finden kann. Und ich habe leider keine Ahnung wieso. Wenn ich das Makro Debugge (F8) erscheint vom AdobeReader keine Fehlermeldung.
Zuerst dachte ich, es sei, weil das Makro die Datei zu schnell wieder löscht. Dies habe ich aber rausgenommen, indem ich eine Funktion (AttachmentFolder()) erstellte, welche nur einmal, beim Eintreffen neuer eMails, aufgerufen wird. Meine zweite Überlegung war, dass vielleicht der zweite Druckauftrag zu schnell kommt. Darum habe ich nach dem Druck-Befehl eine Sleep-Funktion von 10 Sek. eingebaut. Aber auch dies brachte keinen Erfolg.

Ich bin langsam wirklich ratlos, wie ich das Problem lösen soll. Ist es überhaupt lösbar wenn das Problem beim AdobeReader liegt? Gibt es eine bessere Lösung (Code)?

Besten Dank für eure Hilfe!

Gruss
Marco

Hier der Code:

01.
Option Explicit 
02.
 
03.
 
04.
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
05.
Private Declare Function ShellExecute Lib "shell32.dll" Alias _ 
06.
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _ 
07.
ByVal lpFile As String, ByVal lpParameters As String, _ 
08.
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
09.
 
10.
Private WithEvents Items As Outlook.Items 
11.
 
12.
Private Sub Application_Startup() 
13.
    Dim Ns As Outlook.NameSpace 
14.
    Dim Folder As Outlook.MAPIFolder 
15.
    Set Ns = Application.GetNamespace("MAPI") 
16.
    Set Folder = Ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) 'Ordner definieren (hier Posteingang) 
17.
    Set Items = Folder.Items 
18.
End Sub 
19.
 
20.
 
21.
Private Sub Items_ItemAdd(ByVal Item As Object) 
22.
    
23.
    
24.
   Dim i As Integer 'Variable i wird als Integer definiert 
25.
 
26.
   AttachmentFolder 'Ordner Bereinigungs-Funktion aufrufen 
27.
    
28.
   'PrintAttachments Item 'Print-Funktion aufrufen 
29.
   Item.UnRead = False 'Mail als ungelesen markieren 
30.
   
31.
   'Anzahl Mails im Posteingang zählen und in die Variable i schreiben 
32.
   i = Items.count 
33.
    
34.
   'While-Schlaufe, die alle Mails durchgeht und die Anhänge der ungelesenen Mails ausdruckt 
35.
    Do While i <> 1 
36.
        'Falls Mail(x) = ungelesen... 
37.
        If Items.Item(i).UnRead = True Then 
38.
              ' PrintAttachments Items.Item(i)  'Print-Funktion aufrufen 
39.
               Items.Item(i).UnRead = False   'Mail als ungelesen markieren 
40.
        End If 
41.
        i = i - 1 'Variabel i verkleinern 
42.
    Loop 
43.
         
44.
End Sub 
45.
 
46.
Private Sub PrintAttachments(oMail As Outlook.MailItem) 
47.
    'Variabeln definieren 
48.
    'On Error Resume Next    'Fehlermeldungen ignorieren 
49.
    Dim colAtts As Outlook.Attachments 
50.
    Dim oAtt As Outlook.Attachment 
51.
    Dim sFile As String 
52.
    Dim sDirectory As String 
53.
    Dim sFileType As String 
54.
    
55.
    Dim txt As String 
56.
     
57.
    Dim filename_count As Integer 
58.
    filename_count = 1 
59.
     
60.
    sDirectory = "C:\tmp\Attachment\" 'Dahin werden Anhänge temporär abgespeichert 
61.
         
62.
    Set colAtts = oMail.Attachments   'Mailanhang 
63.
 
64.
        If colAtts.count Then 
65.
         
66.
            'Anzahl Anhnänge = Anzahl Durchläufe 
67.
            For Each oAtt In colAtts 
68.
     
69.
                'die letzten 4 Zeichen = Dateiendung 
70.
                sFileType = LCase$(Right$(oAtt.FileName, 4)) 
71.
     
72.
                Select Case sFileType 
73.
                    Case ".xls", ".doc", ".pdf" 'Hier alle gewünschten Dateiendungen dazupacken 
74.
                        sFile = sDirectory & filename_count & oAtt.FileName 'Pfad erstellen 
75.
                        oAtt.SaveAsFile sFile 'Angang abspeichern... 
76.
                        ShellExecute 0, "print", sFile, vbNullString, vbNullString, 0 'ausdrucken 
77.
                        'MsgBox ("Print" + sFile) 
78.
                         
79.
                        '10 Sek. warten bevor Datei gelöscht wird 
80.
                        Sleep 10000 
81.
                             
82.
                            'Logdatei schreiben (Datum, Zeit: Dateiname) 
83.
                                txt = (Date & ", " & Time & ": " & filename_count & oAtt.FileName) 
84.
                                  
85.
                                Open "C:\PrintAttLogfile.txt" For Append As #1 
86.
                                Print #1, txt 
87.
                                Close #1 
88.
                                 
89.
                              '!Kill File ausgeschaltet, da die Datei so gelöscht wird, bevor der AdobeReader die Datei drucken kann 
90.
                             'Kill sFile 
91.
                     
92.
                        'filename_count + 1 
93.
                        filename_count = filename_count + 1 
94.
 
95.
                    End Select 
96.
                Next 
97.
        End If 
98.
         
99.
End Sub 
100.
 
101.
Private Sub AttachmentFolder() 
102.
 
103.
'[gespeicherte Anhänge müssen gelöscht werden damit die Festplatte nicht vollläuft]. 
104.
 
105.
    Dim fso As Object 
106.
    Dim count As Integer 
107.
 
108.
   'Falls der Ordner "Attachment" existiert... 
109.
   If Dir("C:\tmp\Attachment", vbDirectory) <> "" Then 
110.
   
111.
           'Anzahl Dateien in Ordner zählen 
112.
           Set fso = CreateObject("Scripting.FileSystemObject") 
113.
           count = fso.GetFolder("C:\tmp\Attachment").Files.count 'zählen 
114.
            
115.
                'Wenn Ordner Dateien enthält, alle Dateien löschen. 
116.
                If count <> 0 Then 
117.
                 Kill "C:\tmp\Attachment\*.*" 'Alle Dateien im Ordner Attachment löschen 
118.
                End If 
119.
         
120.
          RmDir ("C:\tmp\Attachment")  'Temp Ordner löschen 
121.
   End If 
122.
         
123.
   
124.
    MkDir ("C:\tmp\Attachment") 'Temp Ordner für Anhänge erstellen 
125.
     
126.
 
127.
End Sub 
128.
 
Mitglied: maretz
25.02.2010 um 11:46 Uhr
Moin,

vorab: VBS ist für mich ne Sprache der Hölle... Ich bleib lieber bei richtigen Programmiersprachen ;)

Aber: Wenn du das Script eh genau für EINE Abteilung angepasst hast dann gibt es ja ggf. die Möglichkeit das du den Drucker missbrauchst. Viele Netzwerk-Drucker haben die Option das du denen auch ne PDF in nen bestimmtes Folder (per ftp) legst und die das dann ausdrucken. D.h. dich kümmert der Acrobat dann gar nicht mehr - du machst nen FTP-Upload und löscht danach die Datei... Wäre das ne Alternative?
Bitte warten ..
Mitglied: marco1234
25.02.2010 um 14:57 Uhr
Hallo maretz

Vielen Dank für deine rasche Antwort!

Oja, bin ich deiner Meinung! Ist auch nicht meine Lieblingssprache. Aber es schien mir am einfachsten für dieses Projekt. Wie hättest du es gelöst?

Deine Idee mit dem FTP find’ ich super! Wollte dies heute Nachmittag ausprobieren. Jedoch war meine Freude schnell verflogen..... unsere super Xerox Multifunktionsgeräte (Xerox WorkCentre 5230 PS) haben keinen FTP! -.-

Ich kann nur folgendes auswählen:

TCP/IP
Microsoft-Netzwerk
LPD
Port 9100
http

Ich glaube FTP kann ich vergessen -.-


Gruss
Marco
Bitte warten ..
Mitglied: 76109
25.02.2010 um 15:39 Uhr
Hallo marco1234!

Also, ich habe mal diese Funktion bei mir getestet:
01.
Option Explicit 
02.
 
03.
Private Declare Function ShellExecute Lib "shell32.dll" Alias _ 
04.
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _ 
05.
ByVal lpFile As String, ByVal lpParameters As String, _ 
06.
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 
07.
 
08.
Const Path1 = "C:\Test1.Pdf" 
09.
Const Path2 = "C:\Test2.Pdf" 
10.
Const Path3 = "C:\Test3.Pdf" 
11.
Const Path4 = "C:\Test4.Pdf" 
12.
Const Path5 = "C:\Test5.Pdf" 
13.
 
14.
Sub Test() 
15.
    Dim Files As Variant, i As Integer 
16.
     
17.
    Files = Array(Path1, Path2, Path3, Path4, Path5) 
18.
     
19.
    For i = 0 To UBound(Files) 
20.
        ShellExecute 0, "print", Files(i), vbNullString, vbNullString, 0 
21.
    Next 
22.
End Sub 
23.
 
Mit dem Resultat, dass es bei mir einwandfrei funktioniert hat. D.h. Code schneller durchlaufen, als das Auge sehen kann und dann in aller seelenruhe die Druckaufträge nacheinander am virtuellen PDF-Drucker gedruckt, wobei der AcrobatReader minimiert auf der Taskleiste verblieb. Das gleiche hat auch mit einem normalen Drucker funktioniert bzw. wurden in der Druckerwarteschlange angezeigt und von mir gelöscht. Die PDF-Dateien hatten dabei eine Größe zwischen 5MB und 6MB.

Möglichlicherweise, werden bei dir keine Druckaufträge in die Warteschlange gespoolt.

Gruß Dieter
Bitte warten ..
Mitglied: marco1234
25.02.2010 um 16:12 Uhr
Hallo didi1954

Habe dein Script bei mir auch ausprobiert. Läuft einwandfrei. PDFs werden ohne Reklamationen gedruckt.

Ist denn mein Code das Problem? Aber wieso läuft alles rund, wenn ich Debugge? :-S

Gruss
Marco
Bitte warten ..
Mitglied: 76109
25.02.2010 um 16:28 Uhr
Hallo marco1234!

Mhm, dass kann ich Dir leider nicht sagen.

Ich habe Outlook nur im XP-Mode Virtual PC ohne EMail-Konten etc. installiert. Von daher funktioniert kein vollständiger Test mit Deinem Code.

Es könnte aber durchaus sein, dass ein anderer Fehler die Ursache Deine Problems ist, zumal bei einem Fehler nix passiert, wenn z.B. eine Datei garnicht existiert.

Gruß Dieter
Bitte warten ..
Mitglied: 76109
26.02.2010 um 12:33 Uhr
Hallo marco1234!

Falls Du das Problem noch nicht gelöst hast, so ist mir nach nochmaligem Durchlesen aufgefallen, dass Die Anhänge ja erst gespeichert und dann gedruckt werden. Dann hast Du vermutlich doch ein Zeitproblem, weil das Speichern zu lange dauert und beim Druckauftrag kein Fehler bei noch nicht existierender Datei ausgegeben wird. Insofern würde ich erst den Druckbefehl mit aktuellem Pfad absetzen und danach speichern.

Gruß Dieter
Bitte warten ..
Mitglied: marco1234
01.03.2010 um 08:06 Uhr
Hallo Dieter

Ja, die Anhänge werden lokal abgespeichert, dann gedruckt und lokal wieder gelöscht.

Aha, du meinst also, dass der Druckauftrag kommt, bevor das File vollständig abgespeichert wurde? Könnte sein...

Ich baue 'mal eine Sleep-Funktion vor dem Druck ein. Mal schauen, ob’s was bringt.

Vielen Dank für den Tipp!

Gruss
Marco
Bitte warten ..
Mitglied: 76109
01.03.2010 um 09:36 Uhr
Hallo Marco!

Zitat von marco1234:
Aha, du meinst also, dass der Druckauftrag kommt, bevor das File vollständig abgespeichert wurde? Könnte sein...
Ist sogar sehr wahrscheinlich
Ich baue 'mal eine Sleep-Funktion vor dem Druck ein. Mal schauen, ob’s was bringt.
Dann sollte es gehen. Versuchs mal ab 100ms.

Das erklärt ja auch, warum's beim debuggen funktioniert

Gruß Dieter
Bitte warten ..
Mitglied: marco1234
01.03.2010 um 15:38 Uhr
Genial! Es funktioniert! Die Lösung ist manchmal so einfach =P

Thanks for your help!

Gruss
Marco
Bitte warten ..
Mitglied: marco1234
01.03.2010 um 16:13 Uhr
OK, zu früh gefreut Zwei Mal ist das Problem bereits wieder aufgetreten

Die genaue Fehlermeldung von AdobeReader lautet: "Beim Öffnen dieses Dokuments ist ein Fehler aufgetreten. Diese Datei kann nicht gefunden werden"

Wenn ich auf OK klicke, wird das Dokument korrekt gedruckt. Jedoch zweimal.

Die Sleep-Funktion nach dem Speichern habe ich auf 5 Sekunden eingestellt. Die PDF-Files, welche ich zum Testen verwendet habe, sind um die 40KB gross.

….ich verstehe es nicht :-S


Gruss
Marco
Bitte warten ..
Mitglied: 76109
01.03.2010 um 16:42 Uhr
Hallo Marco!

So ein Mist

Also, wenn 5 Sekunden nicht ausreichen, dann weiß ich auch nicht, wo's da klemmt?

Und ein Drucken per "oAtt.FilePath" oder "oAtt.Path", sowas in der Art, geht das nicht?


Gruß Dieter
Bitte warten ..
Mitglied: marco1234
14.04.2010 um 16:27 Uhr
Wie meinst du das?

Gruss
Marco
Bitte warten ..
Mitglied: 76109
14.04.2010 um 17:11 Uhr
Hallo Marco!

Falls Du das mit dem Direkt-Drucken meinst, dann vergiss meinen blödsinnigen Kommentar. Mein Gedanke war, dass die PDF-Datei ja schon real vorhanden sein müsste, aber tatsächlich befindet sich die Datei nur base64-codiert in der InBox und muss zum drucken also doch erst gespeichert werden.

Gruß Dieter
Bitte warten ..
Mitglied: marco1234
15.04.2010 um 07:56 Uhr
OK, schon vergessen. face-wink

Aber wie soll ich mein Problem jetzt lösen? Ich sollte an diesem Script schon längst weitermachen aber ich habe keine Idee, wo ich beginnen soll bzw. was ich ändern soll *ratlos bin* face-sad

Gruss
Marco
Bitte warten ..
Mitglied: marco1234
26.04.2010 um 16:45 Uhr
Hätte jemand eine Idee, wie ich Outlook beibringen können, dass das Eintreffen von mehreren Mails mit Anhang erkannt wird?
Also wenn zwei Mails ankommen, dass ich von Outlook die Information bekomme: hey, hier sind zwei neue Mails! Momentan funktioniert das ja nur mit dem ersten Mail, welches ankommt.

Ich habe mir überlegt, ob es nicht besser ist, wenn zuerst alle Anhänge gespeichert werden und anschliessend dann alle Dateien im Ordner Attachment gedruckt werden. Eine Option?

Danke und Gruss
Marco
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Outlook & Mail
Outlook 2013 Attachment in Kalendereintrag nicht sichtbar (5)

Frage von xbast1x zum Thema Outlook & Mail ...

Outlook & Mail
Outlook Ablage - habt ihr eine Idee? (2)

Frage von MegaGiga zum Thema Outlook & Mail ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...