Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Outlook Funktionspostfach auslesen

Outlook Funktionspostfach auslesen
18.07.2020 23:47:54
Marko
Hallo liebe Community,
ich benötige eure Unterstützung!
Ich möchte mit Excel VBA ein Outlook Funktionspostfach (ungelesene E-Mails auslesen).
Problem: Bisher werden die E-Mails aus dem Ordner "Posteingang", jedoch nicht aus allen Unterordner (12 Stück) ausgelesen. Ich habe erstmal versucht einen weiteren Unterordner auszulesen, allerdings scheitere ich hier. Des Weiteren werden alle E-Mails und nicht nur die ungelesenen aufgelistet.
Der bisherige Code:
Option Explicit

Public Sub ReadMailItems()
Dim olapp        As Object
Dim olName       As Object
Dim olHFolder    As Object
Dim olHFolder2   As Object
Dim olUFolder    As Object
Dim olUFolder2    As Object
Dim strAttCount  As String
Dim olItemsCount As Long
Dim lngAttCount  As Long
Dim letzteZeile  As Long
On Error Resume Next
Set olapp = CreateObject("Outlook.Application")
Set olName = olapp.GetNamespace("MAPI")
Set olHFolder = olName.Session.Folders("POSTFACHNAME")
Set olUFolder = olHFolder.Folders("Posteingang")
Set olUFolder2 = olHFolder2.Folders("NAME DES UNTERORDNERS")
[A1].Value = "E-Mail-Ordner"
[B1].Value = "Datum//Uhrzeit"
[C1].Value = "Empfänger"
Rows(1).Font.Bold = True
For olItemsCount = 1 To olUFolder.Items.Count
With olUFolder.Items.Item(olItemsCount)
For lngAttCount = 1 To .Attachments.Count
If strAttCount = "" Then
strAttCount = .Attachments.Item(lngAttCount).Filename
Else
strAttCount = strAttCount & vbCrLf & .Attachments.Item(lngAttCount).  _
_
Filename
End If
Next lngAttCount
Sheets("Tabelle2").Range("A" & olItemsCount + letzteZeile).Value = olHFolder.  _
_
Name & "->" & olUFolder.Name
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = . _
ReceivedTime
Sheets("Tabelle2").Range("C" & olItemsCount + letzteZeile).Value = .To
strAttCount = ""
End With
Next olItemsCount
letzteZeile = Sheets("Tabelle2").Range("A" & Rows.Count).End(xlUp).Row
For olItemsCount = 1 To olUFolder2.Items.Count
With olUFolder2.Items.Item(olItemsCount)
For lngAttCount = 1 To .Attachments.Count
If strAttCount = "" Then
strAttCount = .Attachments.Item(lngAttCount).Filename
Else
strAttCount = strAttCount & vbCrLf & .Attachments.Item(lngAttCount).  _
_
Filename
End If
Next lngAttCount
Sheets("Tabelle2").Range("A" & olItemsCount + letzteZeile).Value = olHFolder2.  _
_
Name & "->" & olUFolder2.Name
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .SenderEmailAddress
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = . _
ReceivedTime
Sheets("Tabelle2").Range("C" & olItemsCount + letzteZeile).Value = .To
End With
Next olItemsCount
On Error GoTo 0
End Sub

Könnt Ihr mir bitte weiterhelfen? Für eure Unterstützung bedanke ich mich bereits im Voraus!
Vielen Dank und liebe Grüße
Marko
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Outlook Funktionspostfach auslesen
19.07.2020 08:15:44
Oberschlumpf
Hi Marko,
ich kann dir mit einem Code nicht helfen, da ich in Outlook nur 1 Konto eingerichtet habe.
Aber vielleicht hilft dir mein Tipp, per Upload eine Bsp-Datei zu zeigen, die deinen jetzigen Code enthält.
Denn, wie du ja selbst siehst, wird der Code hier im Forum nicht ganz so übersichtlcht angezeigt.
Und, zumindest weiß ich das besonders bei mir :-), es kann sein, dass auch andere keine so große Lust haben, erst mal eine Bsp-Datei erstellen zu müssen, damit man mit dem Testen beginnen kann.
Ciao
Thorsten
Anzeige
AW: Outlook Funktionspostfach auslesen
19.07.2020 08:52:02
Marko
Hallo Thorsten,
vielen Dank für deine Antwort!
Ich habe eine Beispieldatei hochgeladen: https://www.herber.de/bbs/user/139159.xlsm
Es war gestern/heute schon etwas spät und da ist mir gar nicht aufgefallen, dass der Code visuell nicht so gut dargestellt wird.
Für die Unterstützung bedanke ich mich bereits im Voraus.
Gruß
Marko
Anzeige
AW: Outlook Funktionspostfach auslesen
19.07.2020 14:48:05
mumpel
Hallo!
Das kannst Du indem Du die Ordner rekursiv durchläufst. Hier mal ein Beispielcode aus meinem Projekt.
Outlook-Ordner rekursiv einlesen
Gruß, René
AW: Outlook Funktionspostfach auslesen
19.07.2020 20:00:46
Marko
Hallo Rene,
vielen Dank für den Tipp! Ich habe es jetzt sehr lange probiert und komme leider nicht zum Ergebnis.
Gibt es weitere Unterstützung?
Gruß
Marko
Anzeige
AW: Outlook Funktionspostfach auslesen
19.07.2020 20:16:08
mumpel
Was hast Du probiert, und wie?
AW: Outlook Funktionspostfach auslesen
19.07.2020 20:20:03
Marko
Ich habe probiert die Ordner rekursiv durchlaufen zulassen (vgl. Code von René), allerdings schaffe ich dies nicht. Ich muss auch gestehen, dass ich noch nicht viele Kenntnisse in VBA habe.
AW: Outlook Funktionspostfach auslesen
19.07.2020 21:44:30
mumpel

Zitat:
Ich muss auch gestehen, dass ich noch nicht viele Kenntnisse in VBA habe.
____________________________
Quelle: Herber-Forum


Ungünstige Voraussetzungen. 😉
Zeig uns doch mal den Code den Du versucht hast.
BTW:
Zur besseren Codedarstellung kannst Du auch mein/unser Tool nutzen (dann musst Du nicht jedes Mal eine Datei hochladen)=>VBA-Code zur Darstellung in Browsern aufbereiten
Anzeige
AW: Outlook Funktionspostfach auslesen
19.07.2020 22:12:46
Marko
Richtig, ungünstige Voraussetzungen :-) Ich lerne gerade und habe Spaß dabei. Nachwuchs tut ja immer gut :-)
Ich bin sehr froh, dass man sich in diesem Forum austauschen kann und Hilfe bekommt! So macht lernen auch Spaß!
Der Code ist:
Public Sub ReadMailItems()
Dim olapp As Object
Dim olName As Object
Dim olHFolder As Object
Dim olHFolder2 As Object
Dim olUFolder As Object
Dim olUFolder2 As Object
Dim olOrdner As Outlook.MAPIFolder
Dim strAttCount As String
Dim strAttCount2 As String
Dim olItemsCount As Long
Dim olItemsCount2 As Long
Dim lngAttCount As Long
Dim lngAttCount2 As Long
Dim letzteZeile As Long
Dim AnzahlEmail As Integer, i As Integer, Email As Integer, a As Long
On Error Resume Next
Set olapp = CreateObject("Outlook.Application")
Set olName = olapp.GetNamespace("MAPI")
Set olHFolder = olName.Session.Folders("Postfachname")
Set olUFolder = olHFolder.Folders("Posteingang")
Set olUFolder2 = olHFolder.Folders("Unterordner")
Set olOrdner = GetObject("", "Outlook.Application").Session.Stores("Postfachname"). _
GetDefaultFolder(6).Folders("Posteingang").Folders("Unterordner").Folders
AnzahlEmail = olOrdner.Items.Count
[A1].Value = "E-Mail-Ordner"
[B1].Value = "Datum//Uhrzeit"
[C1].Value = "Empf䮧er"
Rows(1).Font.Bold = True
For olItemsCount = 1 To olUFolder.Items.Count
With olUFolder.Items.Item(olItemsCount)
For lngAttCount = 1 To .Attachments.Count
If strAttCount = "" Then
strAttCount = .Attachments.Item(lngAttCount).Filename
Else
strAttCount = strAttCount & vbCrLf & .Attachments.Item(lngAttCount).Filename
End If
Next lngAttCount
Sheets("Tabelle2").Range("A" & olItemsCount + letzteZeile).Value = olUFolder.Name
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .ReceivedTime
Sheets("Tabelle2").Range("C" & olItemsCount + letzteZeile).Value = .To
strAttCount = ""
End With
Next olItemsCount2
letzteZeile = Sheets("Tabelle2").Range("A" & Rows.Count).End(xlUp).Row
For olItemsCount2 = 1 To olUFolder2.Items.Count
With olUFolder2.Items.Item(olItemsCount)
For lngAttCount2 = 1 To .Attachments.Count
If strAttCount = "" Then
strAttCount = .Attachments.Item(lngAttCount).Filename
Else
strAttCount = strAttCount & vbCrLf & .Attachments.Item(lngAttCount).Filename
End If
Next lngAttCount
Sheets("Tabelle2").Range("A" & olItemsCount + letzteZeile).Value = olHFolder2.Name & "->" &  _
olUFolder2.Name
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .SenderEmailAddress
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .ReceivedTime
Sheets("Outlook-Auslese").Range("C" & olItemsCount + letzteZeile).Value = .To
End With
Next olItemsCount
On Error GoTo 0
Set olOrdner = Nothing
'Die Zelle 'A2' soll selektiert werden
[A2].Select
'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 fr alle Unterordner erneut auf
For Each subfolder In fldr.Folders
RecurseFolders subfolder
Next
End Sub
Das Problem ist, dass dieses Postfach 11 Unterordner hat. Ich habe es erstmal mit einem Unterordner probiert und dieser wird nicht erkannt. Lediglich der Posteingang wird erfasst.
Für die tolle Unterstützung bedanke ich mich bereits im Voraus!!!!
Anzeige
AW: Outlook Funktionspostfach auslesen
19.07.2020 22:16:44
Marko
Jetzt habe ich das Tool genutzt und der Code wird schon wieder so komisch dargestellt :-( Ich hoffe man kann damit etwas anfangen!
AW: Outlook Funktionspostfach auslesen
20.07.2020 11:14:40
mumpel
Dann hast Du das Tool nicht richtig genutzt. Wenn Du das Tool genutzt hast, darfst Du den Code nicht nochmal per Copy&Paste in die Zwischenablage befördern. Also Code markieren, "Auswahl in HTML" anklicken, und dann hier einfügen.
Anzeige
AW: Outlook Funktionspostfach auslesen
20.07.2020 20:55:40
Marko
Dann ist hier gleich der Code. Die direkte Referenzierung hat leider keine Besserung herbeigeführt.
Hier der Code:

Zitat:
Option Explicit


Public Sub ReadMailItems()
Dim olapp As Object
Dim olName As Object
Dim olHFolder As Object
Dim olHFolder2 As Object
Dim olUFolder As Object
Dim olUFolder2 As Object
Dim strAttCount As String
Dim olItemsCount As Long
Dim lngAttCount As Long
Dim letzteZeile As Long
On Error Resume Next
Set olapp = CreateObject("Outlook.Application")
Set olName = olapp.GetNamespace("MAPI")
Set olHFolder = olName.Session.Folders("Postfachname")
Set olUFolder = olHFolder.Folders("Posteingang")
Set olUFolder2 = olHFolder2.Folders("Name zweites Postfach")
[A1].Value = "E-Mail-Ordner"
[B1].Value = "Datum//Uhrzeit"
[C1].Value = "Empf䮧er"
Rows(1).Font.Bold = True
For olItemsCount = 1 To olUFolder.Items.Count
With olUFolder.Items.Item(olItemsCount)
For lngAttCount = 1 To .Attachments.Count
If strAttCount = "" Then
strAttCount = .Attachments.Item(lngAttCount).Filename
Else
strAttCount = strAttCount & vbCrLf & .Attachments.Item(lngAttCount).Filename
End If
Next lngAttCount
Sheets("Tabelle2").Range("A" & olItemsCount + letzteZeile).Value = olUFolder.Name
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .ReceivedTime
Sheets("Tabelle2").Range("C" & olItemsCount + letzteZeile).Value = .To
strAttCount = ""
End With
Next olItemsCount
letzteZeile = Sheets("Tabelle2").Range("A" & Rows.Count).End(xlUp).Row
For olItemsCount = 1 To olUFolder2.Items.Count
With olUFolder2.Items.Item(olItemsCount)
For lngAttCount = 1 To .Attachments.Count
If strAttCount = "" Then
strAttCount = .Attachments.Item(lngAttCount).Filename
Else
strAttCount = strAttCount & vbCrLf & .Attachments.Item(lngAttCount).Filename
End If
Next lngAttCount
Sheets("Tabelle2").Range("A" & olItemsCount + letzteZeile).Value = olUFolder2.Name
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .SenderEmailAddress
Sheets("Tabelle2").Range("B" & olItemsCount + letzteZeile).Value = .ReceivedTime
Sheets("Tabelle2").Range("C" & olItemsCount + letzteZeile).Value = .To
End With
Next olItemsCount
On Error GoTo 0
End Sub

____________________________
Quelle: Herber-Forum

Anzeige
AW: Outlook Funktionspostfach auslesen
20.07.2020 11:11:24
mumpel
Nur als Tipp:
Die "[A1]"-Methode solltest Du nicht nutzen. Nimm stattdessen die direkte Referenzierung Range("A1").Value
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Outlook Funktionspostfach auslesen mit VBA


Schritt-für-Schritt-Anleitung

Um ungelesene E-Mails aus einem Outlook Funktionspostfach auszulesen, kannst du den folgenden VBA-Code verwenden. Dieser Code wird so angepasst, dass er alle Unterordner durchläuft und nur die ungelesenen E-Mails erfasst.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeineDatei.xlsx)" > Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Option Explicit

Public Sub ReadMailItems()
    Dim olapp As Object
    Dim olName As Object
    Dim olHFolder As Object
    Dim olUFolder As Object
    Dim olItemsCount As Long
    Dim letzteZeile As Long
    Dim strAttCount As String
    Dim olItem As Object

    On Error Resume Next
    Set olapp = CreateObject("Outlook.Application")
    Set olName = olapp.GetNamespace("MAPI")
    Set olHFolder = olName.Session.Folders("Funktionspostfach") ' Ersetze "Funktionspostfach" mit dem tatsächlichen Namen
    Set olUFolder = olHFolder.Folders("Posteingang") ' Der Hauptordner, hier als Beispiel

    [A1].Value = "E-Mail-Ordner"
    [B1].Value = "Datum//Uhrzeit"
    [C1].Value = "Empfänger"
    Rows(1).Font.Bold = True

    letzteZeile = 1
    For Each olItem In olUFolder.Items
        If olItem.UnRead Then ' Überprüfen, ob die E-Mail ungelesen ist
            letzteZeile = letzteZeile + 1
            Sheets("Tabelle1").Range("A" & letzteZeile).Value = olItem.Subject
            Sheets("Tabelle1").Range("B" & letzteZeile).Value = olItem.ReceivedTime
            Sheets("Tabelle1").Range("C" & letzteZeile).Value = olItem.To
        End If
    Next olItem

    On Error GoTo 0
End Sub
  1. Schließe den VBA-Editor und starte das Makro über ALT + F8.

Häufige Fehler und Lösungen

  • Fehler: "Objekt nicht gefunden"
    Lösung: Stelle sicher, dass der Name des Funktionspostfachs korrekt in den Code eingefügt wurde.

  • Fehler: Es werden alle E-Mails aufgelistet, nicht nur die ungelesenen.
    Lösung: Überprüfe, ob die Bedingung If olItem.UnRead Then korrekt implementiert ist.

  • Fehler: Unterordner werden nicht erkannt.
    Lösung: Stelle sicher, dass du den richtigen Ordnerpfad angibst und alle Unterordner in einer Schleife durchläufst.


Alternative Methoden

Eine alternative Methode zum Auslesen von E-Mails ist die Verwendung von rekursiven Funktionen, um alle Unterordner zu durchlaufen. Hier ein Beispiel:

Sub RecurseFolders(ByVal fldr As Object)
    Dim itm As Object
    For Each itm In fldr.Items
        If itm.UnRead Then
            ' Hier kannst du den Code hinzufügen, um die E-Mail-Daten zu speichern
        End If
    Next itm

    Dim subfolder As Object
    For Each subfolder In fldr.Folders
        RecurseFolders subfolder
    Next subfolder
End Sub

Diese Methode ermöglicht es dir, alle Unterordner des Outlook Funktionspostfachs zu durchsuchen.


Praktische Beispiele

Wenn du das Funktionspostfach Outlook mit mehreren Unterordnern hast, kannst du den gesamten Code wie folgt erweitern:

Sub ReadAllMailItems()
    Dim olHFolder As Object
    Set olHFolder = olName.Session.Folders("Funktionspostfach")
    Call RecurseFolders(olHFolder)
End Sub

Nutze diese Struktur, um die E-Mails aus jedem Unterordner des Funktionspostfachs auszulesen.


Tipps für Profis

  • Verwende Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was die Fehlersuche erleichtert.
  • Nutze die Range-Methode: Anstelle von [A1] solltest du Range("A1") verwenden, um den Code lesbarer zu machen.
  • Debugging: Verwende Debug.Print, um Werte während der Ausführung des Codes zu überprüfen.

FAQ: Häufige Fragen

1. Wie kann ich ein Outlook Funktionspostfach hinzufügen?
Du kannst ein Funktionspostfach hinzufügen, indem du die Kontoeinstellungen in Outlook aufrufst und dort das Funktionspostfach als zusätzliches Konto einrichtest.

2. Wie kann ich nur ungelesene E-Mails in meinem VBA-Code erfassen?
Verwende die Bedingung If olItem.UnRead Then, um nur ungelesene E-Mails zu erfassen.

3. Welche Excel-Version benötige ich für diesen Code?
Der Code sollte in Excel 2010 und höher funktionieren, solange VBA unterstützt wird.

4. Gibt es Einschränkungen beim Auslesen von E-Mails?
Ja, dies hängt von den Berechtigungen ab, die dir für das Funktionspostfach zugewiesen sind. Stelle sicher, dass du die notwendigen Berechtigungen hast.

5. Wie kann ich den Code optimieren?
Vermeide unnötige Schleifen und versuche, so viele Daten wie möglich in einem Durchgang zu verarbeiten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige