Digital-Inn
 
 

Go Back   Digital-Inn > Office-Welt > MS Outlook

MS Outlook Outlook . viel mehr als "nur" ein Mail-Programm.

Reply
 
Thread Tools Display Modes
Old 17-08-2006   #1
leon79
Registered User
Board-Frischling
 

Join Date: Aug 2006
Location: Bochum
Posts: 7
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
mail auf anlagen prüfen

Hallo zusammen,
Hallo, ich bin Student an Der Uni dortmund vielleicht könnte mir jemand weiterhelfen bitte bitte bin nämlich ein Anfänger in VBA.
ich habe das untenstehende Makro,mit dem die anlagen autom. gespeichert und ausgedrukt werden, ich habe dazu einen MsgBox geschrieben, vordem Ausdrucken fragen msgbox("Anlage Ausdrucken", vbYesNo) aber die Frage bekomme immer selbst wenn keine Anlage dabei ist,ich habe leider erfolglos versucht das Programm so zu verbessern dass die Email auf Anlagen geprüft wird..?
*2te Frage wenn 10 Email aufeinmal bekomme, werde ich nur einmal gefragt ob, die Anlage ausdrucken will oder nicht, denn manchmal muss ich nicht alle Anlagen ausdrucken sondern nur von 3 Emails aus 10, also es wäre besser wenn ich zu jeder Email gefragt werde "wollen ausdrucken oder nit??"
Code:
Option Explicit
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

' Verzeichnis, in dem die Anlagen gespeichert werden
Private Const ATT_PATH As String = "D:\anlagen\"

Private Sub Application_Startup()
' Verweis auf die Elemente des zu überwachenden Ordners.
Set Items = Application.GetNamespace("MAPI") _
.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)

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

Private Sub PrintAttachments(oMail As Outlook.MailItem)
On Error Resume Next
Dim colAtts As Outlook.Attachments
Dim oAtt As Outlook.Attachment
Dim sFile As String

Set colAtts = oMail.Attachments
If colAtts.Count Then
For Each oAtt In colAtts
' Nur ausgewählte Dateitypen drucken
Select Case LCase$(Right$(oAtt.FileName, 4))
Case ".xls", ".doc"
sFile = ATT_PATH & oAtt.FileName
oAtt.SaveAsFile sFile
ShellExecute 0, "print", sFile, vbNullString, vbNullString, 0
End Select
Next
End If
End Sub
leon79 is offline   Reply With Quote
Sponsored Links
Old 18-08-2006   #2
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Hallo leon79,

hilft Dir sowas weiter ? Kaum getestet.

cu, Bernd
--
Code:
Option Explicit

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

' Verzeichnis, in dem die Anlagen gespeichert werden
Private Const ATT_PATH As String = "D:\anlagen\"

Private Sub Application_Startup()
   
   ' Verweis auf die Elemente des zu überwachenden Ordners.
   Set Items = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items

End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
   Dim mItem As Outlook.MailItem
    
   If TypeOf Item Is Outlook.MailItem Then
      Set mItem = Item
      If mItem.Attachments.Count > 0 Then PrintAttachments mItem
   End If
End Sub

Private Sub PrintAttachments(oMail As Outlook.MailItem)
   Dim oAtt As Outlook.Attachment
   Dim sfile As String

   On Error Resume Next
   For Each oAtt In oMail.Attachments
      ' Nur ausgewählte Dateitypen speichern
      Select Case LCase$(Right$(oAtt.Filename, 4))
         Case ".xls", ".doc"
            If MsgBox("Datei speichern ?", vbYesNo, "HuHu") = vbYes Then
               sfile = ATT_PATH & oAtt.Filename
               oAtt.SaveAsFile sfile
               ShellExecute 0, "print", sfile, vbNullString, vbNullString, 0
            End If
      End Select
   Next
End Sub

Last edited by bst on 25-09-2006 at 17:30 Reason: HTML-Code
bst is offline   Reply With Quote
Old 19-08-2006   #3
leon79
Registered User
Board-Frischling
 

Join Date: Aug 2006
Location: Bochum
Posts: 7
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Hallo bst,
das habe ich nicht versucht aber ich denke das könnte klappen, denn das Problem mit der Email auf email auf anlagen prüfen habe ich jetzt beseitgt, ich danke dir ich werde es trotzdem mit deinem Vorschlag versuchen, aber ich denke dir, es bleibt nur jetzt die Sache mit der Frage zu jeder Email ob ich die anlage ausdrucken soll oder nicht, d.h zu den neu 10 eingehenden Emails will ich 10 msgbox haben und nicht einen einzigen für alle, ich muss anscheinand eine For-schleife einsetzen bis jetzt klappt das nicht....
Gruß
Attached Files
File Type: doc vbt.doc (22,0 KB, 10 views)
leon79 is offline   Reply With Quote
Old 19-08-2006   #4
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Abend leon79,

die Messagebox wird bereits innerhalb der for-Schleife aufgerufen, d.h. sie wird für jeden einzelnen Anhang gestartet.

cu, Bernd
bst is offline   Reply With Quote
Old 20-08-2006   #5
Pitter
CO-*****
Senior Member (Board-Inventar)
 
Pitter's Avatar
 

Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
...Mal ne Frage dazu...

Wie baue ich das in Outlook ein, damit das funktioniert?
Das wäre nämlich eine Funktion, die mir bei ca. 70-80 Anhängen täglich das Leben erleichtern würde. Ausserdem würde ich das gerne auf Mails beschränken, die als Anhang eine PDF-Datei enthalten. (Auftragsbestätigungen)
__________________
Gruss
Pitter
______________________________________________________________________________

Ich bin nicht die Signatur.... ich putz hier nur...
Link in eigener Sache: Glasperlenkunst






**** Kein Support per Mail/PN, nur über das Forum! ****

Last edited by Pitter on 20-08-2006 at 11:46
Pitter is offline   Reply With Quote
Old 20-08-2006   #6
Pitter
CO-*****
Senior Member (Board-Inventar)
 
Pitter's Avatar
 

Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
Ich habe da was gefunden, was mir einleuchtend erscheint, habe aber keine Ahnung, wie ich Outlook beibringen soll, dass dies nach dem Start von Outlook abgearbeitet wird.
PHP Code:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As LongByVal lpOperation As StringByVal lpFile As StringByVal lpParameters As StringByVal lpDirectory As StringByVal nShowCmd As Long) As Long 
Private Sub Application_NewMail() 
Dim strNewFolder As String 
Dim objPosteingang 
As MAPIFolder 
Dim objNewMail 
As MailItem 
    On Error Resume Next 
    strNewFolder 
"D:\PDF\" & Format(Date, "ddmmyyhhmm") 
    MkDir strNewFolder 
    Set objPosteingang = Application.GetNamespace("
MAPI").GetDefaultFolder(olFolderInbox) 
       For Each objNewMail In objPosteingang.Items 
        With objNewMail 
            If .UnRead = True Then 
                intAnlagen = .Attachments.Count 
                 If LCase(Left(.Attachments(i).FileName, 4))="
.pdf" Then 
                 If intAnlagen > 0 Then 
                  For i = 1 To intAnlagen 
                   .Attachments.Item(i).SaveAsFile strNewFolder & "" & .Attachments.Item(i).FileName 
                 Product = "
D:PDF" & Format(Date, "ddmmyyhhmm") & ".pdf
                    ShellExecute 0, "
open", Product, "", "", SHOWMAXIMIZED 
                    ShellExecute 0, "
print", Product, "", "", SHOWMAXIMIZED 
                    ShellExecute 0, "
exit", Product, "", "", SHOWMAXIMIZED 
                  Next i 
                 End If 
             End If 
        End With 
    Next objNewMail 
End Sub 
Kann mir damit jemand helfen?
__________________
Gruss
Pitter
______________________________________________________________________________

Ich bin nicht die Signatur.... ich putz hier nur...
Link in eigener Sache: Glasperlenkunst






**** Kein Support per Mail/PN, nur über das Forum! ****
Pitter is offline   Reply With Quote
Old 21-08-2006   #7
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Morgen Pitter,

Du mußt den Code in das Klassenmodul von DieseOutlookSitzung tun, nicht in ein normales Modul. Application_Startup bzw. auch Application_NewMail sind Ereignisse von Application, die dann vom Outlook automatisch gestartet werden.

Und, oben gehört M.E. das: 'If LCase(Left(.Attachments(i).FileName, 4))=".pdf" Then' in die 'For i = 1 To intAnlagen' Schleife, nicht darüber.

Shellexexute startet einen eigenen Prozess, die 3 Aufrufe hintereinander bringen M.E. nichts, einer mit Print sollte reichen.

cu, Bernd
bst is offline   Reply With Quote
Old 21-08-2006   #8
Pitter
CO-*****
Senior Member (Board-Inventar)
 
Pitter's Avatar
 

Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
Quote:
Originally Posted by bst
Du mußt den Code in das Klassenmodul von DieseOutlookSitzung tun, nicht in ein normales Modul. Application_Startup bzw. auch Application_NewMail sind Ereignisse von Application, die dann vom Outlook automatisch gestartet werden.
Ja ok... hatte ich auch. Möglicherweise klappt das bei mir nicht, weil ich hier zuhause an OFFICE 2007 arbeite. Im Betrieb habe ich OFF 2003 Prof. Ich werde das mogen mal dort testen...
Quote:
Originally Posted by bst
Und, oben gehört M.E. das: 'If LCase(Left(.Attachments(i).FileName, 4))=".pdf" Then' in die 'For i = 1 To intAnlagen' Schleife, nicht darüber.
Mein Fehler... Denkfehler

Quote:
Originally Posted by bst
Shellexexute startet einen eigenen Prozess, die 3 Aufrufe hintereinander bringen M.E. nichts, einer mit Print sollte reichen.
mhhh... meines Erachtens bleiben dann aber alle Obkjekte geöffnet und müssen dann manuell geschlossen werden, oder mache ich hier wieder einen Denkfehler?!
__________________
Gruss
Pitter
______________________________________________________________________________

Ich bin nicht die Signatur.... ich putz hier nur...
Link in eigener Sache: Glasperlenkunst






**** Kein Support per Mail/PN, nur über das Forum! ****
Pitter is offline   Reply With Quote
Old 22-08-2006   #9
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Abend Pitter,

Quote:
Möglicherweise klappt das bei mir nicht, weil ich hier zuhause an OFFICE 2007 arbeite.
Das weiß ich nicht. Habe nur 2000 @home und 2003 @work. 2007 kenne ich noch überhaupt nicht.

Quote:
meines Erachtens bleiben dann aber alle Obkjekte geöffnet und müssen dann manuell geschlossen werden
Nein. Wenn Du "print" angibst sollte das Dokument von der zugehörigen Applikation geöffnet und ausgedruckt werden. Dann sollte sich das Programm eigentlich selbstständig wieder beenden.

Bei mir hier @Home mit ol2000 funktioniert sowas wie unten.

Habe allerdings nicht mit 'echten' neuen Mails getestet, sondern bin das nur im Einzelschrittmodus durchgegangen.

Habe noch SHOWMAXIMIZED definiert, sowie den LEFT in einen RIGHT geändert!, das mit den intAnlagen optimiert und zum Testen hier die Pfad/Dateinamen angepasst. Letzteres mußt Du natürlich wieder rückgängig machen.

HTH, Bernd
--
Code:
Option Explicit
Private Const SHOWMAXIMIZED = 3&

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 Sub Application_NewMail()
   Dim objPosteingang As MAPIFolder
   Dim objNewMail As MailItem
   Dim i As Integer 
   Dim Product As String

   Set objPosteingang = Application.GetNamespace( "MAPI").GetDefaultFolder(olFolderInbox)
   For Each objNewMail In objPosteingang.Items 
      With objNewMail
         If .UnRead = True Then 
            For  i = 1 To .Attachments.Count
                If LCase(Right(.Attachments(i).Filename, 4)) = ".xls" Then 
                   Product = "D:\TEST\" & .Attachments.Item(i).Filename
                   .Attachments.Item(i).SaveAsFile Product
                   ShellExecute 0, "print" , Product, "", "", SHOWMAXIMIZED
                End If
            Next i
         End If
      End With
   Next objNewMail
End Sub

Last edited by bst on 25-09-2006 at 17:37 Reason: HTML-Code
bst is offline   Reply With Quote
Old 22-08-2006   #10
Pitter
CO-*****
Senior Member (Board-Inventar)
 
Pitter's Avatar
 

Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
winkewinke bst...

muchas gracias für deinen Einsatz.
Habs hinbekommen

Aber wie im richtigen Leben... da kommt immer was hinterher.

So sieht das jetzt aus:
PHP Code:
Option Explicit

' Makro zum automatischen Drucken von Dokumenten aus Mail-Anlagen


Aufruf der Prozedur
Private Declare Function ShellExecute Lib "shell32.dll" Alias _
    
"ShellExecuteA" (ByVal hwnd As LongByVal lpOperation As String_
    ByVal lpFile 
As StringByVal lpParameters As String_
    ByVal lpDirectory 
As StringByVal nShowCmd As Long) As Long _
   

Private WithEvents Items As Outlook.Items

' Verzeichnis, in dem die Anlagen gespeichert werden sollen

Private Const ATT_PATH As String = "C:\Windows\Temp\"



Private Sub Application_Startup()

    ' 
Verweis auf den zu überwachenden Mail-Ordner.
    
    
Set Items Application.GetNamespace("MAPI"_
        
.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
    
Dim mItem As Outlook.MailItem
    
    
If TypeOf Item Is Outlook.MailItem Then
        Set mItem 
Item
        
If mItem.Attachments.Count 0 Then PrintAttachments mItem
    End 
If
End Sub

Private Sub PrintAttachments(oMail As Outlook.MailItem)
    
Dim oAtt As Outlook.Attachment
    Dim sFile 
As String
    
    On Error Resume Next
    
    
For Each oAtt In oMail.Attachments
        
' Nur ausgewählte Dateitypen speichern
        Select Case LCase$(Right$(oAtt.FileName, 4))
            Case ".pdf"
            
            ' 
Hier kommt eine auskommentierte Message-Boxmit Speicherabfrage Ja-Nein
            
                
' If MsgBox("Datei speichern ?", vbYesNo, "Speichern") = vbYes Then
                
                    sFile = ATT_PATH & oAtt.FileName
                    oAtt.SaveAsFile sFile
                    ShellExecute 0, "print", sFile, vbNullString, vbNullString, 0
                                                    
            ' 
End If
        
End Select
    Next
End Sub 
Schön wäre es jetzt noch, wenn er mir nach dem Druck dann diese temporäre Datei dann wieder killt.

Ich hatte das mit: Kill sFile versucht, aber ohne Erfolg... Die Datei bleibt im Temp-Ordner erhalten... Any hints?
__________________
Gruss
Pitter
______________________________________________________________________________

Ich bin nicht die Signatur.... ich putz hier nur...
Link in eigener Sache: Glasperlenkunst






**** Kein Support per Mail/PN, nur über das Forum! ****
Pitter is offline   Reply With Quote
Old 22-08-2006   #11
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Hallo Pitter,

das ist vermutlich nicht so einfach. ShellExecute startet die 'Druckapplikation' asynchron, d.h. wartet nicht auf deren Ende. Du müßtest wohl den Returnwert von ShellExecute - das sollte ein Handle auf die gestartete Applikation sein - nehmen und dann auf das Ende dieses Prozesses warten ehe Du die Datei löschen kannst.

Viel einfacher wäre es M.E. Dein TEMP-Verzeichnis beim Systemstart zu löschen.

cu, Bernd
bst is offline   Reply With Quote
Old 22-08-2006   #12
Pitter
CO-*****
Senior Member (Board-Inventar)
 
Pitter's Avatar
 

Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
Hallo bst,

die Vermutung hatte ich auch...
Werde es wohl so machen, dass ich die Temp beim Systemstart löschen lasse.

Eigentlich sollte es kein Problem sein, die Dateien zu behalten, wenn...ja wenn einer unserer Hersteller wenigstens die Auftragsnummer als PDF-Namen senden würde...leider heisst die immer gleich.
Ausserdem will unser System-Admin nicht, dass die Anhänge aus dem Mailordner gelöscht werden.
Das Löschen ist also nur dazu da, nicht doppelten Speicherplatz zu belegen.

Aber Danke für Deine Hilfe
__________________
Gruss
Pitter
______________________________________________________________________________

Ich bin nicht die Signatur.... ich putz hier nur...
Link in eigener Sache: Glasperlenkunst






**** Kein Support per Mail/PN, nur über das Forum! ****
Pitter is offline   Reply With Quote
Old 23-08-2006   #13
Pitter
CO-*****
Senior Member (Board-Inventar)
 
Pitter's Avatar
 

Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
oh Mann... habe gerade festgestellt, dass die App bei mehreren gleichnamigen Anhängen z,B. "pitter.pdf " natürlich nur einmal abspeichert und deswegen nur einmal druckt.

Problem ist dabei, dass es sich um unterschiedliche Dateien mit unterschiedlicem Inhalt handelt und ich BEIDE gedruckt haben muss...

Ih müsste also in meine App eine Schleife einfügen, die alle eingehenden Anhänge umbenennt, bevor sie gespeichert werden und die shellExecute den Druckbefehl gibt.

Dazu brauche ich eure Hilfe... PLEEEEEAZZZZZZZZZE

Ich stricke da schon den halben Tag dran rum, finde aber keine Lösung
__________________
Gruss
Pitter
______________________________________________________________________________

Ich bin nicht die Signatur.... ich putz hier nur...
Link in eigener Sache: Glasperlenkunst






**** Kein Support per Mail/PN, nur über das Forum! ****
Pitter is offline   Reply With Quote
Old 23-08-2006   #14
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Abend Pitter,

Du könntest die Win-API-Funktion GetTempFileName benutzen um einen eindeutigen Dateinamen zu bestimmen. Oder das selber zusammenbauen.

Hier mal eine Eigenproduktion.

Ersetze die Zeile:

sFile = ATT_PATH & oAtt.FileName

durch sowas:

sfile = GetUniqueName(ATT_PATH & oAtt.FileName)

und unten stehende Funktion. TestIt brauchst Du nicht, damit habe ich probiert ob's denn auch funktioniert.

HTH, Bernd
--
Code:
Option Explicit

Function GetUniqueName(strFileName As String) As String
   Dim strName As String, strExt As String, strNewName As String, i%, ipos%
    
   GetUniqueName = strFileName
   If Dir(strFileName) = "" Then Exit Function

   ipos = InStrRev(strFileName, ".")
   If ipos > 0 Then
      strName = Left(strFileName, ipos - 1)
      strExt = Mid(strFileName, ipos)
    Else
      strName = strFileName
      strExt = ""
   End If

   Do
      i = i + 1
      strNewName = strName & "_" & Format(i, "0000") & strExt
   Loop Until Dir(strNewName) = ""
   
   GetUniqueName = strNewName
End Function

Sub TestIt()
   Dim sfile As String, i%, ff%

   For i = 1 To 10
      sfile = "d:\test\hallo.pdf"
      'sfile = "d:\test\hallo"
      'sfile = "d:\test\hallo."
      
      sfile = GetUniqueName(sfile)
      Debug.Print sfile
      
      ' nur hier zum testen, sfile erzeugen
      ff = FreeFile
      Open sfile For Output As #ff
      Write #ff, sfile
      Close #ff
   Next
End Sub

Last edited by bst on 25-09-2006 at 17:18 Reason: HTML Code geht nicht mehr
bst is offline   Reply With Quote
Old 24-08-2006   #15
bst
Excel Moderator
Senior Member (Board-Inventar)
 

Join Date: Oct 2004
Location: Ilsfeld
Posts: 2.468
Abgegebene Danke: 10
Erhielt 147 Danke für 145 Beiträge
Red face

Hi Pitter,

dem schließe ich mich gerne an :-)

Prost.

cu, Bernd
bst is offline   Reply With Quote
Sponsored Links
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT +2. The time now is 05:20.


Powered by vBulletin® Version 3.7.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
SEO by vBSEO 2.4.0
Template-Modifikationen durch TMS
Advertisement System V2.5 By   Branden
Copyright by NightwoLF & Jesse69