Top-Themen

Aktuelle Themen (A bis Z)

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!

Mitglied: marco1234

marco1234 (Level 1) - Jetzt verbinden

25.02.2010 um 11:02 Uhr, 7053 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 ..
Ähnliche Inhalte
Outlook & Mail
Outlook 2016 - Makro
gelöst Frage von apex.predator24Outlook & Mail7 Kommentare

Hallo Zusammen Da es im Outlook keine Funktion oder Möglichkeit existiert, die An- und Rückfahrt von einem Termin separat ...

Outlook & Mail

Microsoft Outlook Calendar Print Assistant

gelöst Frage von christopher.kernOutlook & Mail1 Kommentar

Hallo Community, ich habe folgende Ausgangssituation: Wir haben einen Outlook Kalender in den alle Veranstaltungen bei uns im Geschäft ...

Outlook & Mail

Outlook 2013 Attachment in Kalendereintrag nicht sichtbar

Frage von xbast1xOutlook & Mail5 Kommentare

Hallo zusammen, kurioses Verhalten. Ein Mitarbeiter erstellt einen Termin und zieht eine E-Mail in den Termin. Gewöhnlich ist das ...

Windows Server

Print server

gelöst Frage von EverestWindows Server9 Kommentare

Hallo zusammen, hat jemand eine Idee was es sein kann wenn die Drucker ab und zu wirre Zeichen drucken? ...

Neue Wissensbeiträge
Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 1 TagInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 2 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 4 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Sicherheit

Wikileaks-Gründer Julian Assange wurde festgenommen

Information von Frank vor 7 TagenSicherheit3 Kommentare

Wikileaks-Gründer Julian Assange wurde heute in London festgenommen. Die Botschaft Ecuadors, in der er seit sieben Jahren lebte, hat ...

Heiß diskutierte Inhalte
Tipps & Tricks
Verdammt voll erwischt
Frage von AlchimedesTipps & Tricks23 Kommentare

Folgende Mail habe ich auf meinem Freenet Account erhalten: Nun folgendes Problem: 1) Ich besuche Porno Seiten yep hat ...

Drucker und Scanner
Xerox 7328 muss jeden Tag neu installert werden
Frage von PN-SchrauberDrucker und Scanner20 Kommentare

hallo, ich habe in Problem mit einem unserer Drucker. Vorweg, die meisten unserer Netzwerkdrucker laufen über einen Druckserver, dieser ...

HTML
Google maps
Frage von jensgebkenHTML20 Kommentare

Hallo Gemeinschaft, hab mal ne Frage zu Maps - habe es hinbekommen, dass ich einen iframe link erstellen kann ...

Switche und Hubs
PC Verursach Probleme im Netzwerk
gelöst Frage von spoboeSwitche und Hubs16 Kommentare

Hallo zusammen, folgene Situation macht mich inzwischen ratlos: In unserem Betrieb ist ein Rechner über die Hausverkabelung an einem ...