kaiuwe28
Goto Top

VBA Excel - Outlook Mails auslesen inkl. Unterordner eines Funktionspostfaches - Script anpassen

Hallo zusammen,

ich finde leider mal wieder nicht die Lösung und würde mich freuen, wenn mir einer auf die Sprünge hilft.

Es soll per Excel VBA eine Outlook Funktionspostfach ausgelesen werden. Es sollen alle Ordner ausgelesen werden, also teilweise bis zu 5 Unterordner.
Das vorhandene Script macht aktuell 2 Punkte nicht:

1. Unterordner automatisch auslesen
2. den Ordner wiedergeben inkl. Unterordner, wo die Mail liegt in Spalte C - beginnend ab C2

Bitte helft mir face-smile

Danke Jens

Sub Outlook_Mail_auslesen()

'Globale Fehlerbehandlung  -> Excel soll automatisch weitermachen, egal welcher Fehler  
On Error Resume Next

'Variablendeklaration  
Dim olOrdner As Outlook.MAPIFolder
Dim AnzahlEmail As Integer, i As Integer, Email As Integer, a As Long
Dim VonDatum As Date, BisDatum As Date

Sheets("Maileingang").Select  
Cells.Select
Selection.ClearContents

Set olOrdner = GetObject("", "Outlook.Application").GetNamespace("MAPI").Folders("funktionspostfach@arbeit.com").Folders("Inbox").Folders("AAA").Folders("erledigt").Folders("CCC") '.Folders("EEE")  

'Setzen der Variable -> es sollen alle Nachrichten im Ordner 'Posteingang (olFolderInbox) gezählt werden  
AnzahlEmail = olOrdner.Items.Count

' Überschriften im neuen Blatt  -> die erste Zeile von A1 - C1  
[A1].Value = "Betreff"  
[B1].Value = "Datum Uhrzeit"  
[C1].Value = "Ordner"  

'Erste Zeile soll Fett formatiert werden  
Rows(1).Font.Bold = True

VonDatum = InputBox("Bitte Datum des ersten zu betrachtenden Tages eingeben:", "Datumseingabe", Format(Now - 1, "DD.MM.YYYY"))  
BisDatum = InputBox("Bitte Datum des letzten zu betrachtenden Tages eingeben:", "Datumseingabe", Format(Now, "DD.MM.YYYY  23:59:59"))  


'Beginn Schleifendurchlauf (Schleife 1)  -> die Variable 'i' läuft solange, wie Anzahl der EMails vorhanden sind  
While i < AnzahlEmail
    i = i + 1
'  
    'Anzeigen einer Nachricht in der Statuszeile  
    Application.StatusBar = "Lese Posteingang " & _  
        Format(i / AnzahlEmail, "0%")  
        'Was soll mit den Nachrichten geschehen?  (Schleife 2)  
    
        With olOrdner.Items(i)
            'If .ReceivedTime >= VonDatum And .ReceivedTime <= BisDatum Then  
                Email = Email + 1
                'Zelle 1 mit dem Wert Betreff in der EMail  
                Cells(Email + 1, 1).Value = .Subject
                'Zelle 2 mit dem Wert 'Empfangen am' in der EMail  
                Cells(Email + 1, 2).Value = .ReceivedTime
            'End If  
        'Ende der Schleife 2  
        Debug.Print Email
        End With

    
'Ende der Schleife 1  
Wend
 
'Die Objekt-Variable muss wieder geleert werden  
Set olOrdner = Nothing

'Die Zelle 'A2' soll selektiert werden  
[A2].Select

'Die Exceldatei wird gespeichert  
ActiveWorkbook.Saved = True

'Die Statuszeile wird wieder ausgeschaltet  
Application.StatusBar = False

End Sub

Content-Key: 376827

Url: https://administrator.de/contentid/376827

Printed on: April 19, 2024 at 15:04 o'clock

Mitglied: 136166
136166 Jun 13, 2018 updated at 11:15:20 (UTC)
Goto Top
Unterordner automatisch auslesen
Mach dir eine Rekursive Funktion die sich selbst für jeden Unterordner aufruft.

Beispiel:
Sub RecurseFolders(ByVal fldr As Folder)
     For Each itm In fldr.items
         ' Mach was mit der Mail  
         msgbox itm.Subject
     Next
    'Prozedur ruft sich selbst für alle Unterordner erneut auf  
    For Each subfolder In fldr.Folders
        RecurseFolders subfolder
    Next
End Sub
Member: kaiuwe28
kaiuwe28 Jun 13, 2018 at 12:11:26 (UTC)
Goto Top
Hi decathon,

vielen Dank für deine schnelle Antwort, aber ich bin ganz ehrlich, ich komme mit den Code nicht klar.

1. ich weiß einfach nicht wie ich den einbauen soll z.B. wo kommt mein Funktionspostfach hin
2. wird das Makro nicht angezeigt, erst wenn ich "ByVal fldr As Folder" entferne
3. fehlt in Zeile 8 nicht irgendwas, da hatte VBA auch gemeckert

copy & paste und ein paar kleine Sache schaffe ich ja meistens noch, aber irgendwie fehlt mir hier wieder das nötige Verständnis um das korrekt zu verwenden.

Evtl. hast du ja noch Tipps, wie ich das ggf. einbauen kann.
Mitglied: 136166
136166 Jun 13, 2018 updated at 21:37:51 (UTC)
Goto Top
War ja wieder klar ...
Sub Outlook_Mail_auslesen()

'Globale Fehlerbehandlung  -> Excel soll automatisch weitermachen, egal welcher Fehler  
On Error Resume Next

'Variablendeklaration  
Dim olOrdner As Outlook.MAPIFolder
Dim AnzahlEmail As Integer, i As Integer, Email As Integer, a As Long
Dim VonDatum As Date, BisDatum As Date

Sheets("Maileingang").Select  
Cells.Select
Selection.ClearContents

Set olOrdner = GetObject("", "Outlook.Application").Session.Stores("funktionspostfach@arbeit.com").GetDefaultFolder(6).Folders("AAA").Folders("erledigt").Folders("CCC") '.Folders("EEE")  

'Setzen der Variable -> es sollen alle Nachrichten im Ordner 'Posteingang (olFolderInbox) gezählt werden  
AnzahlEmail = olOrdner.Items.Count

' Überschriften im neuen Blatt  -> die erste Zeile von A1 - C1  
[A1].Value = "Betreff"  
[B1].Value = "Datum Uhrzeit"  
[C1].Value = "Ordner"  

'Erste Zeile soll Fett formatiert werden  
Rows(1).Font.Bold = True

RecurseFolders olOrdner
 
'Die Objekt-Variable muss wieder geleert werden  
Set olOrdner = Nothing

'Die Zelle 'A2' soll selektiert werden  
[A2].Select

'Die Exceldatei wird gespeichert  
ActiveWorkbook.Save

'Die Statuszeile wird wieder ausgeschaltet  
Application.StatusBar = False

End Sub

Sub RecurseFolders(ByVal fldr As Object)
     For Each itm In fldr.items
        set n = Cells(Rows.Count,"A").End(xlUp).Offset(1)  
        With itm
                n.Resize(1,3).Value = Array(.Subject,.ReceivedTime,fldr.FolderPath)
        End With
     Next
    'Prozedur ruft sich selbst für alle Unterordner erneut auf  
    For Each subfolder In fldr.Folders
        RecurseFolders subfolder
    Next
End Sub
Viel Spaß beim lernen ...i'm out
Member: kaiuwe28
kaiuwe28 Jun 13, 2018 at 13:24:43 (UTC)
Goto Top
Auf jeden Fall schon mal vielen Dank.

Ich versuche es ja auch, aber ich bleibe immer wieder hängen und finde die Fehler nicht.
Ist wie mit Fremdsprachen, der eine bekommt es auf anhieb hin, der andere brauch viel Hilfe.

Hatte vorhin z.B. eine gute Stunde gesucht, aber nicht "FolderPath" gefunden. Hatte es mit nur "Folder" und noch ein paar andere Varianten probiert. Leider ohne Erfolg. Jetzt sehe ich es bei dir und denke mir, ja vollkommen logisch. Vielleicht bin ich auch zum Nutzen von Google nicht geeignet ;)

Was ich noch nicht verstehe ist, wo durch dein Sub weiß, welches Funktionspostfach es abfragen soll. Mir ist der Zusammenhang nicht klar.

Ich nutze VBA nicht oft und wenn du in meine Beträge guckst, dann hat sich das schon etwas gebessert. Ich bereite schon mal was vor, da ich es ja verstehen will. Aber jetzt Schluss mit den Rechtfertigen.

Danke nochmal. Ich probiere das mal und gebe noch mal Feedback.
Mitglied: 136166
136166 Jun 13, 2018 updated at 14:39:49 (UTC)
Goto Top
Was ich noch nicht verstehe ist, wo durch dein Sub weiß, welches Funktionspostfach es abfragen soll. Mir ist der Zusammenhang nicht klar.
s.o.
Set olOrdner = GetObject("", "Outlook.Application").Session.Stores("funktionspostfach@arbeit.com").GetDefaultFolder(6).Folders("AAA").Folders("erledigt").Folders("CCC") '.Folders("EEE")   
Zum Verständnis der 6 siehe
OlDefaultFolders Enumeration
Member: kaiuwe28
kaiuwe28 Jun 13, 2018 at 20:56:27 (UTC)
Goto Top
Ich habe es mal probiert, aber es werden nur die Überschriften geschrieben.
Wahrscheinlich habe ich beim Anpassen ein Fehler face-sad

Set olOrdner = GetObject("", "Outlook.Application").Session.Stores("funktionspostfach@arbeit.com").GetDefaultFolder(6)  

Muss ich hier noch den ersten Ordner benennen?

Des Weiteren hatte ich eine Fehlermeldung bei:

 Set next = Cells(Rows.Count, "A").End(xlUp).Offset(1)  

Das next habe ich dann in ein hh geändert, da ich mir dachte, dass VBA dies nicht versteht zwecks for each next Schleife.

Beim Suchen im Internet habe ich noch eine andere Variante gefunden, welche auch super funktioniert, aber hier bekomme ich leider nicht die zeitliche Abgrenzung hinein:

Sub Outlook_Ordnerliste_Count()
   Dim Ol, mf, Mf1, mf2, Ns, mf3, mf4, mf5, mf6, mf7, i&
   Dim Tb As Worksheet
   Dim VonDatum As Date, BisDatum As Date
   
   On Error Resume Next
   i = Range("A1").Row  

    VonDatum = InputBox("Bitte Datum des ersten zu betrachtenden Tages eingeben:", "Datumseingabe", Format(Now - 1, "DD.MM.YYYY"))  
    BisDatum = InputBox("Bitte Datum des letzten zu betrachtenden Tages eingeben:", "Datumseingabe", Format(Now, "DD.MM.YYYY  23:59:59"))  

   Set Ol = CreateObject("Outlook.Application")  
   Set Ns = Ol.GetNamespace("MAPI") 'Konto einschränken  
   Set Tb = Sheets("Maileingang"): Tb.Cells.ClearContents  
   
    
    For Each mf In Ns.Folders
        Tb.Cells(i, 1).Value = mf.Name: i = i + 1
        Tb.Cells(i - 1, 9) = mf.Items.Count
    
        For Each Mf1 In mf.Folders
        If Mf1.Items.ReceivedTime >= VonDatum And Mf1.Items.ReceivedTime <= BisDatum Then
            Tb.Cells(i, 2).Value = Mf1.Name: i = i + 1
            Tb.Cells(i - 1, 9) = Mf1.Items.Count
        End If
        
            For Each mf2 In Mf1.Folders
            If mf2.Items.ReceivedTime >= VonDatum And mf2.Items.ReceivedTime <= BisDatum Then
                Tb.Cells(i, 3).Value = mf2.Name: i = i + 1
                Tb.Cells(i - 1, 9) = mf2.Items.Count
            End If
            
                For Each mf3 In mf2.Folders
                If mf3.Items.ReceivedTime >= VonDatum And mf3.Items.ReceivedTime <= BisDatum Then
                    Tb.Cells(i, 4).Value = mf3.Name: i = i + 1
                    Tb.Cells(i - 1, 9) = mf3.Items.Count
                End If
                
                    For Each mf4 In mf3.Folders
                    If mf4.Items.ReceivedTime >= VonDatum And mf4.Items.ReceivedTime <= BisDatum Then
                        Tb.Cells(i, 5).Value = mf4.Name: i = i + 1
                        Tb.Cells(i - 1, 9) = mf4.Items.Count
                    End If
                    
                        For Each mf5 In mf4.Folders
                        If mf5.Items.ReceivedTime >= VonDatum And mf5.Items.ReceivedTime <= BisDatum Then
                            Tb.Cells(i, 6).Value = mf5.Name: i = i + 1
                            Tb.Cells(i - 1, 9) = mf5.Items.Count
                        End If
                        
                            For Each mf6 In mf5.Folders
                            If mf6.Items.ReceivedTime >= VonDatum And mf6.Items.ReceivedTime <= BisDatum Then
                                Tb.Cells(i, 7).Value = mf6.Name: i = i + 1
                                Tb.Cells(i - 1, 9) = mf6.Items.Count
                            End If
                            
                                For Each mf7 In mf6.Folders
                                If mf7.Items.ReceivedTime >= VonDatum And mf7.Items.ReceivedTime <= BisDatum Then
                                    Tb.Cells(i, 8).Value = mf7.Name: i = i + 1
                                    Tb.Cells(i - 1, 9) = mf7.Items.Count
                                End If
                            Next
                        Next
                    Next
                Next
            Next
         Next
      Next
    Next
    
   Set Ns = Nothing: Set Mf1 = Nothing: Set mf = Nothing: Set Ol = Nothing: Set Tb = Nothing
   Set mf2 = Nothing: Set mf3 = Nothing

End Sub

Leider wird meine If Abfrage nicht berücksichtigt und immer der gesamte Count angegeben. Habe ich da einen Denkfehler oder ist der Count pro Ordner ein fester Wert, den ich gar nicht so abfragen kann?

Vielleicht kannst du mir oder ein anderer noch einen Tip geben.

Das Grundgerüst des Codes habe ich in einem anderen Forum gefunden und wenn es gewünscht ist, dann füge ich auch gern den Link hinzu.

Danke!