Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1800to1804
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Outlook alle Konten durchsuchen

Outlook alle Konten durchsuchen
06.01.2021 14:34:09
Oisse
Hallo Zusammen,
folgende Problem stellt sich mir:
Ich möchte gern per VBA alle Outlook-Konten durchsuchen und zwar die jeweils die gesendeten Ordner.
In einem dieser "Gesendet"-Ordner befinden sich Rechnungen als Anhang im PDF-Format.
Kann man dann den Namen des Anhangs auslesen? Wenn ja wie?
(Dateiname ist wie folgt aufgebaut: Rechnung Nr Firmenname Erstellungsdatum.Pdf)
Momentan schaffe ich es lediglich das Default-Konto zu durchsuchen und testweise das Sendedatum _ und den Betreff auszugeben (Code habe ich aus dem Netz)

Dim objApp   As Object   ' Outlook.Application
Dim objItem  As Object   ' Outlook.MailItem
Dim objFolder As Object
Dim item As Object
Dim i As Long
Dim x As String
Set objApp = CreateObject("Outlook.Application")
' Set objFolder = objApp.GetNameSpace("MAPI").GetDefaultFolder(6) ' 6 = olFolderInbox
Set objFolder = objApp.GetNameSpace("MAPI").GetDefaultfolder(5). ' 5 = olFolderSentMail
i = 1
For Each item In objFolder.Items
If TypeName(item) = "MailItem" Then
i = i + 1
x = item.CreationTime
x = x & ", " & item.Subject
Debug.Print  x
End If
Next

Vielen Dank schon mal für die Hilfe
Gruß Oisse

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Outlook alle Konten durchsuchen
07.01.2021 15:04:09
Yal
Hallo Oisse,
mache eine Early Binding (Extras >> Verweise... Microsoft Outlook 16.0 Object Library) anstatt Late Binding (CreateObject(..) Damit hast Du Zugriff auf IntelliSense (Strg+Leertaste) und auf das Objektkatalog (F2). Öffne auch das lokale Fenster und lass den Code in Schritt-Modus laufen.
So würdest Du schnell auf die Auflistungsobjekt "Accounts" kommen:
Sub OutlookAccounts_auflisten()
Set O = Outlook.Session
Debug.Print String(40, "-")
Debug.Print "Anzahl accounts: " & O.Accounts.Count
For Each A In O.Accounts
Debug.Print A.DisplayName, A.CurrentUser.Name
Next
Debug.Print String(40, "-")
End Sub
Im Objekt Outlook.Session gibt es eine Auflistung "Folders" dessen jeweiligen "Path" in Verbindung mit dem Account zu sehen ist.
Account = "ich@meinfirma.de"
Forders(1).Path = "\\ich@meinfirma.de"
unter jedem Folder gibt es "Folders", die diesmal Posteingang, Postausgang, usw darstellen.
Viel Erfolg
Yal
Anzeige
AW: Outlook alle Konten durchsuchen
07.01.2021 17:53:11
Oisse
Hallo Yal,
und zunächst vielen Dank für Deine Hilfe. Scheint ein schwieriges Thema zu sein. Also den Verweis auf die Objektbibliothek habe ich gesetzt. Dein Code läuft durch, nachdem ich "O" als Objekt dimensioniert habe.
Allerdings ist das mit der IntelliSense so eine Sache. Wenn ich das nachbaue: Set O = Outlook.Session wird mir beim Punkt die IntelliSens angezeigt. Beim Rest des Codes aber nicht. :(
Auch nicht wenn ich Strg + Leertaste drücke.
Irgendwie verstehe ich auch den Rest nicht, den Du mir geschrieben hast:
Im Objekt Outlook.Session gibt es eine Auflistung "Folders" dessen jeweiligen "Path" in  _
Verbindung mit dem Account zu sehen ist.
Account = "ich@meinfirma.de"
Forders(1).Path = "\\ich@meinfirma.de"
unter jedem Folder gibt es "Folders", die diesmal Posteingang, Postausgang, usw darstellen.

Wenn ich schreibe:
x = O.Folders(1).Path kommt: "Objekt unterstützt diese Eigenschaft oder Methode nicht"
Kannst Du nochmal helfen?
Anzeige
AW: Outlook alle Konten durchsuchen
07.01.2021 19:50:39
Yal
Hallo Oisse,
ja, sorry, schlampiges Code:
"Die Session -Eigenschaft und die GetNamespace -Methode können synonym verwendet werden, um das NameSpace -Objekt für die aktuelle Sitzung abzurufen" (aus https://docs.microsoft.com/de-de/office/vba/api/outlook.application.session )
Das gesamt ist ziemlich verzwickt, da Mails eigentlich nach MAPI-Modell funktionieren, aber Micorsoft nur sein OLE-Modell haben möchte. Und deswegen schweigsam, wie MAPI funktioniert.
Folgendes funktioniert inzwischen:
Sub OutlookFolders_auflisten()
Dim N As Namespace
Dim A As Account
Dim S As Store
Dim F
Dim SF
Set N = GetNamespace("MAPI")
Debug.Print String(40, "-")
Debug.Print "Anzahl accounts: " & N.Accounts.Count
For Each A In N.Accounts
Debug.Print A.DisplayName, A.CurrentUser.Name
Next
For Each F In N.Folders
For Each SF In F.Folders
Debug.Print SF.Name, SF.FolderPath
Next
Next
End Sub
VG Yal
Anzeige
Funktioniert super
08.01.2021 10:32:13
Oisse
Hallo Yal,
bin echt total begeistert von Deiner Hilfe. Viiielen herzlichen Dank. Damit kann ich jetzt super weiter machen.
Hättest Du noch was in Petto, wie man den Dateinamen des Anhangs (eine pdf) per VBA auslesen kann?
Hintergrund ist:
Leider ist es passiert, dass eine Rechnung zweimal verschickt wurde. Wenn man das vorher abfängt, indem man die Outlook-Ordner nach der Rechnung durchsucht, kann man sich halt Unannehmlichkeiten ersparen. Der Rechnungsname ist immer gleich aufgebaut, sodass bei der zweiten Erstellung die Rechnung (bis auf das Erstellungsdatum) den gleichen Namen hat. Somit könnte man vergleichen.
Oder hättest Du einen anderen Lösungsansatz?
Herzliche Grüße
Oisse
Anzeige
AW: Funktioniert super
08.01.2021 14:55:45
Yal
Hallo Oisse,
habe ich leider nicht parat, müsste zusammenbasteln.
Schwierig ist die Verschachtelung von Folders. Da muss Du rekursiv arbeiten. Vielleicht hast Du schon Programmier-Kenntnisse in andere Sprache, dann bekommst Du es in VBA hin. Ansonsten schwierig.
Du muss die Items in jedem Folder durchgehen, prüfen, dass MessageClass = "IPM.Note" und Attachments.Count > 0 ist, dann durch die Attachement durchgehen.
Schau in dem Objektkatalog welche Methode/Eigenschaften zur Verfügung stehen.
Userbild
Viel Erfolg
Yal
Anzeige
AW: Funktioniert super
08.01.2021 15:11:06
Yal
Es müsste ungefähr so aussehen (beim mir extrem langsam. Liegt wahrscheinlich am VPN)
Idealerweise hast Du zuerst eine Liste der Verzeichnisse, die Du durchforstern möchtest (Rekursivität nur für Unterverzeichnisse).
Sub OutlookFolders_auflisten()
Dim N As Namespace
Set N = GetNamespace("MAPI")
MailItem_lesen N.GetDefaultFolder(olFolderInbox)
End Sub
Private Sub MailItem_lesen(F As Outlook.Folder)
Dim I As Outlook.MailItem
Dim A As Outlook.Attachment
Dim SF As Outlook.Folder
For Each I In F.Items
If I.MessageClass = "IPM.Note" Then
If I.Attachments.Count Then
Debug.Print I.Subject
For Each A In I.Attachments
Debug.Print A.Filename
Next
End If
End If
Next
'Achtung rekurivität!
'    For Each SF In F.Folders
'        MailItem_lesen SF
'    Next
End Sub

Anzeige
AW: Funktioniert super
08.01.2021 16:58:27
Oisse
Hallo Yal
und nochmal herzlichen Dank, dass Du Dir mit meinem Problem solche Mühe gibst. Aber Du hast mir echt sehr weitergeholfen.
Mein Code sieht mittlerweile so aus:

Function OutlookDurchsuchen(ByVal PdfName As String, _
ByVal ReNr As String)
Dim N As Namespace
Dim A As Account
Dim S As Store
Dim F
Dim SF
Dim item
Dim v, x, y, z As String
Set N = GetNamespace("MAPI")
For Each F In N.Folders
For Each SF In F.Folders
I = 1
For Each item In SF.Items
On Error GoTo Fehler
If item.Attachments.Count > 0 Then
v = item.Attachments.item(1).FileName
If Len(v) > 30 Then
v = Mid(v, 1, Len(v) - 18)
'Debug.Print SF.FolderPath, SF.Name, item
If PdfName = v Then
I = I + 1
x = item.CreationTime
y = item.Subject
z = item.To
If MsgBox("Diese Rechnung mit der Rechnungsnummer:" & Chr(13) & _
ReNr & Chr(13) & "wurde bereits am:" & Chr(13) & x & Chr(13) & "an: " & Chr(13) & z & Chr(13) & "versendet." & _
Chr(13) & "Möchtest Du sie nochmal versenden?", vbYesNo, " _
Rechnung bereits versendet") = vbNo Then
End
Else
Exit Function
End If
End If
End If
End If
Next
Fehler:
Next
Next
End Function

Allerdings braucht es ca 2,5 Minuten, bis alle Ordner durchlaufen sind, bzw. bis er die entsprechende Rechnung findet.
Und - es funktioniert zwar bei mir, aber bei meinem Freund, für den es eigentlich gedacht ist, findet er die Rechnung nicht, obwohl es nur ein Account ist mit nur 7 Ordnern.
Und es dauert bei ihm trotzdem noch gefühlt ca 45 Sec.
Bei dem Code, den Du mir zuletzt geschickt hast, durchsucht er nur den Standardaccount. Oder?
Denkst Du man könnte meinen Code noch optimieren, sodass er schneller durchläuft?
VG
Oisse
Anzeige
AW: Funktioniert super
08.01.2021 18:24:59
Yal
Hallo Oisse,
Vielen Dank für die Rückmeldung.
"durchsucht er nur den Standardaccount. Oder?" --> ja.
Wie gesagt, alle Folders durchlaufen, Name extrahieren, daraus eine Liste der "übliche Verdächtigen" herstellen und nur auf diesen laufen lassen.
Sollte ein starkte Hierarchisierung (Konstellation RootVerz\SubVerz), nur den entsprechenden RootVerz auflisten und rekursiv durchgehen: siehe Coding von vorher, im auskommentierte Teil: die Sub MailItem_lesen ruf sich selbst mit je einen Subfolder.
"On Error Goto Fehler gehört nicht innerhalb der Sub sondern ganz am Anfang. Es gilt bis "On Error Goto 0" vorkommt oder bis Ende der Sub. Hier könnte/sollte man separate Sub bauen.
Springmarke innerhalb eines For-Schleife ist von unschön bis potentiell gefährlich.
VG
Yal
Anzeige

14 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige