![]() |
|
|||||||
| MS Outlook Outlook . viel mehr als "nur" ein Mail-Programm. |
![]() |
|
|
Thread Tools | Display Modes |
|
|
#1 |
|
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 |
|
|
|
| Sponsored Links | |
|
|
#2 |
|
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 |
|
|
|
|
|
#3 |
|
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ß |
|
|
|
|
|
#4 |
|
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 |
|
|
|
|
|
#5 |
|
CO-*****
![]() Senior Member (Board-Inventar)
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 |
|
|
|
|
|
#6 |
|
CO-*****
![]() Senior Member (Board-Inventar)
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:
__________________
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! **** |
|
|
|
|
|
#7 |
|
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 |
|
|
|
|
|
#8 | |||
|
CO-*****
![]() Senior Member (Board-Inventar)
Join Date: Aug 2001
Location: In Deutschland
Posts: 2.658
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
|
Quote:
Quote:
Quote:
__________________
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! **** |
|||
|
|
|
|
|
#9 | ||
|
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:
Quote:
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 |
||
|
|
|
|
|
#10 |
|
CO-*****
![]() Senior Member (Board-Inventar)
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:
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! **** |
|
|
|
|
|
#11 |
|
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 |
|
|
|
|
|
#12 |
|
CO-*****
![]() Senior Member (Board-Inventar)
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! **** |
|
|
|
|
|
#13 |
|
CO-*****
![]() Senior Member (Board-Inventar)
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! **** |
|
|
|
|
|
#14 |
|
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 |
|
|
|
|
|
#15 |
|
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
|
Hi Pitter,
dem schließe ich mich gerne an :-) Prost. cu, Bernd |
|
|
|
| Sponsored Links | |
![]() |
| Thread Tools | |
| Display Modes | |
|
|