fiasco
Goto Top

Probleme bei Makro in Outlook zum kopieren von Daten aus Mail in Excel

Servus beinander

Ich habe eine Frage bzw möchte folgendes haben/machen.

Ich würde gern ein Makro in Outlook haben, welches bei Bedarf aufgerufen werden kann und welches dann den Posteingang Mails mit bestimmten Betreffzeilen durchsucht. Der Betreff ist zwar jedes mal anders, beginnt aber immer mit "Data-2000-".

Die Emails sollen dann in einen bestimmten Ordner in Outlook kopiert werden.
Der Inhalt der Mails ist immer ein Einzeiler, als Beispiel:

Data-2000-002-000013 [192.168.73.110]: RUNNING

Dieser Einzeiler soll dann Excel zerlegt werden und einzelne Fragmente sollen in Excel in einzelne Spalten geschrieben werden.

Als Beispiel:
Spalte A: 000013
Spalte B: 192.168.73.110
Spalte C: RUNNING

Wie stelle ich sowas an?

Ich habe bereits einen ähnlichen Beitrag gefunden, EMail auslesen, verschieben und mit Excel ausgelesene Daten weiterverarbeiten
Allerdings bin ich in Sachen VBA ein DAU also ich wäre wirklich um jede Hilfestellung dankbar.

MfG
fiASco

Content-Key: 273117

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

Printed on: April 18, 2024 at 12:04 o'clock

Member: colinardo
colinardo May 28, 2015 updated at 16:44:26 (UTC)
Goto Top
Hallo fiASco, Willkommen auf Administrator.de!
Schau mal in deine persönlichen Nachrichten.

Grüße Uwe
Member: colinardo
Solution colinardo May 29, 2015, updated at Jun 08, 2015 at 20:17:27 (UTC)
Goto Top
Sub Extract_EMails_Fiasco()
    'Pfad zur Excel-Datei  
    Const EXCELFILE = "D:\Daten.xlsx"  
    'Variablen  
    Dim fMails As Folder, ferledigt as Folder, mail As MailItem, txtContent As String, objExcel As Object, wb As Object, rngCurrent As Object, regex As Object, _
    ws As Object, items As items, col As New Collection

    'Ordner in Outlook referenzieren in dem die Mails liegen  
    Set fMails = Application.Session.Stores("Persönlicher Ordner").GetRootFolder.Folders("Posteingang")  
    'Ordner in dem die verarbeiteten Mails verschoben werden, hier ein Unterorder des Posteingangs mit dem Namen 'Ablage'  
    Set ferledigt = fMails.Folders("Ablage")  
    
    'Mails auf einen Satz mit bestimmtem Subject begrenzen  
    Set items = fMails.items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001E"" like 'Data-2000-%'")  
    
    If items.count > 0 Then
        'collection nach Datum sortieren  
        items.Sort "[ReceivedTime]"  
        
        'Regex Objekt für die Suche nach E-Mail-Adressen  
        Set regex = CreateObject("vbscript.regexp")  
        regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = False
        
        'Regex-Such-Pattern für die Mails  
        regex.pattern = "-(\d+)\s+\[([\d\.]+)\]:\s*([^\r\n]*)"  
        
        'Excel Objekt erzeugen  
        Set objExcel = CreateObject("Excel.Application")  
        objExcel.DisplayAlerts = False

        Set fso = CreateObject("Scripting.FileSystemObject")  
        If fso.FileExists(EXCELFILE) Then
            'Excel-Workbook öffnen  
            Set wb = objExcel.Workbooks.Open(EXCELFILE)
            Set ws = wb.sheets(1)
        Else
           'Wenn Excel-Datei nicht existiert erzeuge neue Excel-Datei  
            Set wb = objExcel.Workbooks.add
            'Überschriften erzeugen  
            Set ws = wb.sheets(1)
            With ws.Range("A1:C1")  
                .Value = Array("Nummer", "IP", "Status")  
                .Font.Bold = True
            End With
            'Spalten auf Textformat schalten  
            ws.Range("A:C").NumberFormat = "@"  
        End If
        Set rngCurrent = ws.Cells(ws.Rows.count, "A").End(-4162).Offset(1, 0)  
        
        For Each mail In items
            'Regex-Suche ausführen  
            Set matches = regex.Execute(mail.Body)
            ' Bei einem Treffer  
            If matches.count > 0 Then
                'die extrahierten Teile ins das Excel-Sheet übertragen  
                rngCurrent.Resize(1, 3).Value = Array(matches(0).submatches(0), matches(0).submatches(1), matches(0).submatches(2))
                ' Für den nächsten Datensatz den Zeiger eine Zeile weiter nach unten verschieben  
                Set rngCurrent = rngCurrent.Offset(1, 0)
            End If
            'die Mail einer Collection hinzufügen  
            col.add mail
        Next
        'Alle Mails die verarbeitet wurden in den Zielordner verschieben  
        For Each mail In col
            mail.Move ferledigt
        Next
        
        'Breiten der Spalten anpassen  
        ws.Range("A:C").EntireColumn.AutoFit  
        'Workbook speichern  
        wb.SaveAs EXCELFILE
        'Info anzeigen  
        MsgBox "Verarbeitung abgeschlossen! Excel wird nun angezeigt.", vbInformation  
        'Excel anzeigen  
        objExcel.DisplayAlerts = True
        objExcel.Visible = True
        
        'Objekte freigeben  
        Set objExcel = Nothing
        Set wb = Nothing
        Set ws = Nothing
        Set matches = Nothing
        Set mail = Nothing
        Set regex = Nothing
        Set fso = Nothing
    Else
        MsgBox "Keine Mails zum Bearbeiten im Ordner", vbExclamation  
    End If
End Sub
Grüße Uwe
Member: fiASco
fiASco Jun 08, 2015 at 17:10:08 (UTC)
Goto Top
Vielen Dank für die Antwort Uwe

Ich hab mir den Code nochmal angeschaut. Bisher hat er nicht funktioniert, wieso auch immer. Habe jetzt den Teil verändert, bei dem der Betreff der E-Mail untersucht wird.

Set items = fMails.items.Restrict("@SQL=" & Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x0037001E" _
& Chr(34) & " ci_phrasematch " & "'Data-2000")

damit funktioniert es.
Member: colinardo
Solution colinardo Jun 08, 2015 updated at 20:08:18 (UTC)
Goto Top
Hallo fiAsCo,
dann hast du sehr wahrscheinlich ein älteres Outlook face-wink Hier läuft es in der Variante auf einem OL2010 einwandfrei.
Die Filter sind halt eine schöne Sache da sie das ganze Prozedere stark beschleunigen und man nicht jede Mail mit einer Schleife anfassen muss.
Auf unterschiedlichen OL Versionen gibt es jedoch ab und zu Ungereimtheiten so das nicht jeder Filter auf jedem System gleichermaßen funktioniert, auch je nach Patchlevel und Sprachversion.

Aber wenn's jetzt damit bei dir läuft ist doch schön. Auch das du es dir selbst erarbeitet hast finde ich gut, ist hier eine seltene Ausnahme, Respekt.

Bitte den Beitrag dann noch als gelöst markieren. Danke.

Grüße Uwe
Member: fiASco
fiASco Jun 08, 2015 at 20:16:45 (UTC)
Goto Top
Ich hab Outlook 2013
Naja selber mitsuchen nach einer Lösung sollte ja in einem Forum nicht verboten sein :D

Was ich jetzt noch machen wollte ist die Uhrzeit und das Datum mit in die Excel Datei zu packen. Habe des ganz so versucht, allerdings sagt er mir
Objekt erforderlich und markiert mir "set mailtime"


Was ich gemacht habe ist folgendes:

Dim mailtime As Date - natürlich an den Anfang

Dann weiter unten im For loop

For Each mail In items
'Regex-Suche ausführen
Set mailtime = mail.ReceivedTime -Hier markiert er mir das Set mailtime
Set matches = regex.Execute(mail.Body)
'Bei einem Treffer...

Laut https://msdn.microsoft.com/de-de/library/office/ff867228.aspx ist .ReceivedTime vom Typ Date, sollte also passen.

Damit die Uhrzeit und Datum dann auch in die vierte Spalte daneben geschrieben wird, hätte ich gedacht das folgendes funktioniert. Ob es klappt weiß ich allerdings nicht da er ja davor bereits den Fehler bringt.

If matches.Count > 0 Then
'die extrahierten Teile ins das Excel-Sheet übertragen
rngCurrent.Resize(1, 4).Value = Array(matches(0).submatches(0), matches(0).submatches(1), matches(0).submatches(2), mailtime)
' Für den nächsten Datensatz den Zeiger eine Zeile weiter nach unten verschieben
.....

Aber vielen Dank für deine Hilfe, ohne die wäre ich noch am Haare raufen
Member: colinardo
colinardo Jun 08, 2015 updated at 22:59:02 (UTC)
Goto Top
Set mailtime = mail.ReceivedTime -Hier markiert er mir das Set mailtime
Laut https://msdn.microsoft.com/de-de/library/office/ff867228.aspx ist .ReceivedTime vom Typ Date, sollte also passen.
Das set weglassen face-wink Date ist in dem Sinne kein Objekt sondern ein Typ wie String und bei denen verwendet man kein set.

Den Rest kannst du so machen.

Grüße Uwe