Erledigt Office VBA-Projekt zum Speichern von OL-Mails auf HDD --> 64bit Office

SkAvEnGeR

Master of Tools
Script zum Speichern von Outlook-Emails auf der Festplatte

Unter folgender Adresse gibt es eine Anleitung und ein vorgefertigtes Script, um Mails aus Outlook gezielt zu Archivieren, Dabei wird der Name der Mails aus Informationen wie Sender Empfänger Betreff und Datum generiert. So abgespeichert hat man die Mails dann ausserhalb von Outlook auf der Platte und kann sie projektbezogen einsortieren.
http://sw-guide.de/microsoft-outlook/script-zum-speichern-von-outlook-emails-auf-der-festplatte/

Ich nutze dieses Script in etwas angepasster Form schon einige Jahre und es hat bisher immer wunderbar funktioniert.
Nun habe ich leider ein Office in 64bit auf einem PC und da funktioniert dieses VBA-Script nicht mehr.
Es muss der Quellcode des VBA-Projektes an 64bit angepasst werden.
Leider kenne ich mich mit VBA rein gar nicht aus.

Daher die Frage: Könnte jemand das von mir angehänte Script nach 64bit umschreiben?

Danke im Voraus!
 

Anhänge

  • ExportEmail.bas.TXT
    14,1 KB · Aufrufe: 231

chaospir8

★★★★★-Oldie
Leichte off-topic-Frage @SkAvEnGeR:
Gibt es einen trifitgen Grund, warum auf diesem Rechner die 64bit-Version von Office Anwendung findet? Du kannst ja nichts dafür, aber es würde mich einfach interessieren.
 

SkAvEnGeR

Master of Tools
DANKE @vlintstoun + @RichyZuHause : Dort findet sich ja genau das Script, das ich suche. SUPER :yo - Nun muss ich das Script nur wieder ein bisschen an meine Bedürfnisse anpassen und dann sollte es laufen.

@chaospir8 : Der blöde quasi-Admin hat beim Download des Installers von der Office-Website offensichtlich nicht aufgepasst und wohl "versehentlich" die 64-Variante geladen und installiert. Ich konnte das Problem dort erstmal so lösen, dass ich die bestehende Office 64bit deinstalliert und direkt nach dem obligatorischen Neustart die gleiche Office in 32bit installiert habe. Hat einwandfrei funktioniert und die Outlook-Profile und Einstellungen wurden direkt übernommen. UND das "alte" ExportMailtoDisk" funktioniert dort nun auch wieder. Ich hatte aber trotzdem hier nach einer 64bit-Variante des Scripts gefragt, falls mir dieser Fall mal wieder unter kommt.
 

SkAvEnGeR

Master of Tools
Für Alle, die ein ähnliches Script suchen - hier das fertige Script für ein 64bit Office.
 

Anhänge

  • ExportEmailtoDisk-x64.txt
    18,2 KB · Aufrufe: 385

Zwiesel88#

Mitglied
Hallo zusammen,
ich bin neu hier und hätte direkt mal eine Frage zum obengenannten Script. Ich hatte das Tool immer genutzt bis das neue Office 2013 kam.
Nun bekomme ich es zwar eingebunden, allerdings geschieht bei der Betätigung der Schaltfläche nichts.

Habt Ihr da eine Idee wie ich dieses Tool wieder nutzen kann?
Vielen Dank vorab und allen einen schönen Tag.
 

dr_tommi

alter Oldie
Hallo Zwiesel.
Was heißt bei Dir "eingebunden"?
Das Skript oben bietet ja von sich aus keinen Button an.
Von sich aus nicht.
Aber Outlook kann Makros direkt einbinden.
Optionen->Menüband anpassen-> Neue Gruppe->Makro der Gruppe zuweisen

Allerdings passiert trotzdem tatsächlich nichts, weil mindestens ein Syntaxfehler angezeigt wird.
Zumindest mein Outlook konnte mit der ersten Zeile des Scriptes nichts anfangen.
Und danach kommt noch die Auswahl des Verzeichnisses und dann verabschiedet sich mein Outlook.
Wenn man umkonfiguriert auf festes Verzeichnis, dann wird korrekt abgespeichert.
 
Zuletzt bearbeitet:

Zwiesel88#

Mitglied
Hallo RichyZuHause es ist genau so wie dr_tommi geschrieben hat. Man muss das Makro im Menüband zuweisen.
Hmm leider habe ich nicht wirklich Ahnung von der Makro Codierung. Ich sehe da nur lauter ????…
Bei mir tut sich gar nichts wenn ich auf den Button klicke.
Kann das ggf. jemand mit wenigen Handgriffen anpassen das es beim Outlook 2013 wieder funktioniert?

Vielen Dank schon mal an alle
 

RichyZuHause

Alter mit Ego
Allerdings passiert trotzdem tatsächlich nichts, weil mindestens ein Syntaxfehler angezeigt wird.
Zumindest mein Outlook konnte mit der ersten Zeile des Scriptes nichts anfangen.
Und danach kommt noch die Auswahl des Verzeichnisses und dann verabschiedet sich mein Outlook.
Wenn man umkonfiguriert auf festes Verzeichnis, dann wird korrekt abgespeichert.
Ich vermute den Syntax-Fehler, wenn Du manuell im VBA-Projekt ein Modul anlegst und dann den Code von oben reinkopierst.
Dann steht da
Code:
Attribute VB_Name = "ExportEmail"
Wenn Du dagegen die Quelle importierst, gibt es den Syntaxfehler nicht, dann führt die erste Zeile nur dazu, dass das Modul "ExportEmail" heißt.
Und wird nicht dargestellt.

Der Absturz danach kommt auf jeden Fall. 😵

Wenn man diese Stelle im Makro
Code:
With udtBI
        .lpszTitle = lstrcpyA(EXM_016, "")
        .ulFlags = BFFM_INITIALIZED
End With
so ändert:
Code:
With udtBI
        .lpszTitle = EXM_016
        .ulFlags = BFFM_INITIALIZED
End With
funktioniert es.

Ich würde allerdings wie DrTommi umstellen von der freien Ordnerauswahl mit Dialog auf die feste Einstellung eines Ablagepfades.
Also dies hier:
Code:
Private Const EXM_OPT_USEBROWSER As Boolean = True
Private Const EXM_OPT_TARGETFOLDER As String = "D:\"
ändern in:
Code:
Private Const EXM_OPT_USEBROWSER As Boolean = False
Private Const EXM_OPT_TARGETFOLDER As String = "D:\BackupOutlookMails"

Läuft.
 

RichyZuHause

Alter mit Ego
Bei mir tut sich gar nichts wenn ich auf den Button klicke.
Kann das ggf. jemand mit wenigen Handgriffen anpassen das es beim Outlook 2013 wieder funktioniert?
Kann es sein, dass Dein Outlook so eingestellt ist, dass es keine Makros ausführen darf?
Datei -> Optionen -> Sicherheitscenter -> Einstellungen für das Sicherheitscenter -> Einstellungen für Makros -> passende Option wählen.
 

dr_tommi

alter Oldie
ich habe gerade mal ein paar Mails gespeichert.
Dabei ist mir aufgefallen, dass wenn am gleichen Tag mehrere Mails mit gleichem Betreff vom gleichen Absender kommen, diese nicht gespeichert werden.
Um das zu umgehen sollte man eventuell das Datum zu Beginn des Dateinamens um die Uhrzeit erweitern.
Denn dass diese Mails auch noch in der gleichen Sekunde ankommen ist eher selten. ( Von z.B. automatisch verschickten Meldungen einer Serverüberwachung mal abgesehen)
Also
Code:
'Date format of filename
Private Const EXM_OPT_FILENAME_DATEFORMAT As String = "yymmdd"
ändern in:
Code:
'Date format of filename
Private Const EXM_OPT_FILENAME_DATEFORMAT As String = "yymmddhhnnss"
 

Zwiesel88#

Mitglied
Guten Morgen zusammen,
erstmal muss ich sagen Ihr sei ja super Motiviert. Danke dafür. Leider bekomme ich das Tool einfach nicht Ausgeführt.
Eingebungen habe ich es, es ist auch im Menüband ersichtlich aber Ausführen lässt es sich nicht.
Makros werden auch zugelassen.
Ich weiß nicht vielleicht habe ich auch was im Code versaut?! könnt Ihr mir nochmal den kompletten überarbeiteten Quelltext zur Verfügung stellen?
Vielen Dank vorab.
 

dr_tommi

alter Oldie
@Zwiesel88#
Wenn du mindestens eine Mail markierst und dann das Makro ausführen lässt müsste doch zumindest eine Fehlermeldung kommen.
Ich habe dir mal meine Version angehängt, die aktuell so läuft.
Änderungen bei mir:
  • Dateiname am Anfang "yymmddhhnn", also Datum mit Uhrzeit
  • Speicherung der Mails im Ordner "d:\ol-files" ohne Abfrage des Verzeichnisses
 

Anhänge

  • exportmails.txt
    18,1 KB · Aufrufe: 116

SkAvEnGeR

Master of Tools
'Ich freue mich, dass ihr die 64bit-Bersion des Scriptes lauffähig habt....
Aber mit festem Speicherort.
Gerade DAS ist mit der wichtigste Bestandteil - für mich!
Ich muss Mails projektbezogen in passende Ordner exportieren können.
Somit ist der Auswahldialog für mich unerlässlich.

Könnte man das Script nicht auch noch so "reparieren", dass der Auswahldialiog wieder funktioniert?
 

dr_tommi

alter Oldie
Könnte man das Script nicht auch noch so "reparieren", dass der Auswahldialiog wieder funktioniert?
Natürlich kann man das versuchen, aber nicht mal eben so in 2 Minuten. ;)

Edit:
Ich hab das jetzt soweit dass zumindest der Ordner gewählt werden kann und auch gespeichert wird.
Nur leider weiß ich im Moment noch nicht wo gespeichert wird. Im gewählten Ordner zumindest nicht. ;)
 
Zuletzt bearbeitet:

dr_tommi

alter Oldie
Könnte man das Script nicht auch noch so "reparieren", dass der Auswahldialiog wieder funktioniert?
Man kann und man hat. ;)
Im Anhang das angepasste Script.
Getestet mit der 64Bit-Version vom Outlook aus dem M365-Abo
Aktuelle Einstellungen (können natürlich geändert werden)
  • Dateiformat TXT
  • Dateiname setzt sich aus Datum, Betreff und Empfänger zusammen
  • Datum für Dateiname yy-mm-dd_hhmm also etwa 20-07-14_1906
  • Auswahl des Speicherortes über Dialog
Rückmeldungen erwünscht
 

Anhänge

  • eportmails2drive.txt
    12,8 KB · Aufrufe: 177
Zuletzt bearbeitet:

Zwiesel88#

Mitglied
Hallo zusammen, ich habe nochmal eine Frage das Tool funktioniert bei mir jetzt perfekt! Nochmal danke dafür!
Jetzt haben manche E-Mails einen zu langen Betreff welches zu Problemen beim Export führt da ja jetzt noch das Datum usw. davor gesetzt wird. Welches ich aber auch benötige.
Anbei ein Screenshot der Fehlermeldung (es liegt definitiv an der länge des betreffs ich habe es getestet) ....evtl. kann man dieses Problem durch eine Umschreibung im Quelltext lösen!?

Vielen Dank vorab
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    15 KB · Aufrufe: 95

dr_tommi

alter Oldie
Hallo zusammen, ich habe nochmal eine Frage das Tool funktioniert bei mir jetzt perfekt! Nochmal danke dafür!
Jetzt haben manche E-Mails einen zu langen Betreff welches zu Problemen beim Export führt da ja jetzt noch das Datum usw. davor gesetzt wird. Welches ich aber auch benötige.
Anbei ein Screenshot der Fehlermeldung (es liegt definitiv an der länge des betreffs ich habe es getestet) ....evtl. kann man dieses Problem durch eine Umschreibung im Quelltext lösen!?
Natürlich kann man den Dateinamen bzw. den Betreff begrenzen.
Wie lang soll/darf er denn sein?
 

SkAvEnGeR

Master of Tools
Vielen Dank @dr_tommi für die schnelle Umsetzung. :icon_prost:
Hier in der Firma haben wir aktuell überall "nur" die 32bit Version von Office installiert. Daher kann ich es nicht mal so eben testen.

Das werde ich dann @home machen, nachdem ich mein Testsystem neu aufgesetzt habe 🙄
 

dr_tommi

alter Oldie
Jetzt haben manche E-Mails einen zu langen Betreff welches zu Problemen beim Export führt da ja jetzt noch das Datum usw. davor gesetzt wird. Welches ich aber auch benötige.
Anbei ein Screenshot der Fehlermeldung (es liegt definitiv an der länge des betreffs ich habe es getestet) ....evtl. kann man dieses Problem durch eine Umschreibung im Quelltext lösen!?
Das Script prüft schon von sich aus ob der Dateiname größer als 251 Zeichen wird. Wenn ja, wird auf 251 gekürzt.

Code:
strFinalFileName = IIf(Len(strFinalFileName) > 251, Left(strFinalFileName, 251), strFinalFileName)
    strFullPath = strBackupPath & "\" & strFinalFileName
Dazu kommt aber noch das Verzeichnis.

Wenn das jetzt insgesamt zu lang werden sollte, kann man an dieser Stelle die 251 ersetzen gegen eine kleinere Zahl, z.B. 240.
 

DrWaldfee

Mitglied
Hi Leute!

Richtig gut, dass ihr das zum Laufen gebracht habt. Hut ab und danke für eure Arbeit!
Ich hätte noch eine Anregung dazu. Könnte man auch einen Dateiauswahldialog einbinden, in den man einen Ordnerpfad in ein Textfeld kopieren kann, wie auf folgendem Bild und den letztgenutzen Ordner dort dann als "Standardordner" festlegen?

picker-multifile-600px.png



Mir ist gerade noch eine Kleinigkeit aufgefallen.
Und zwar scheint das Script nicht mit kleinen "s" im Emailtitel klarzukommen. Das heißt, wo im Titel ein kleines s vorkommt, entsteht im Dateinamen der gespeicherten Email eine Lücke. Ist das bei euch auch der Fall?
 
Zuletzt bearbeitet:

dr_tommi

alter Oldie
Hi Leute!

Richtig gut, dass ihr das zum Laufen gebracht habt. Hut ab und danke für eure Arbeit!
Ich hätte noch eine Anregung dazu. Könnte man auch einen Dateiauswahldialog einbinden, in den man einen Ordnerpfad in ein Textfeld kopieren kann, wie auf folgendem Bild und den letztgenutzen Ordner dort dann als "Standardordner" festlegen?
Der Dialog aus dem Bild ist der Dialog für die Dateiauswahl. Im Script wird aber nur die Verzeichnisauswahl genutzt. Da gibt es kein Feld wo man einen Pfad reinkopieren kann.
Natürlich könnte man das umbauen.
Den letzten Pfad speichern und dann wieder benutzen würde auch gehen. Dann allerdings entweder in Registry oder on einer Ini-Datei.

Mir ist gerade noch eine Kleinigkeit aufgefallen.
Und zwar scheint das Script nicht mit kleinen "s" im Emailtitel klarzukommen. Das heißt, wo im Titel ein kleines s vorkommt, entsteht im Dateinamen der gespeicherten Email eine Lücke. Ist das bei euch auch der Fall?
Das ist komisch, das war damals nicht der Fall. ich schau mal woran das liegen kann.
 

dr_tommi

alter Oldie
Cool, woran lag es?
Ein Regex-Problem.
ist
Code:
Private Const EXM_OPT_CLEANSUBJECT_REGEX As String = "RE:s|Re:s|AW:s|FW:s|WG:s|SV:s|Antwort:s"

Soll
Code:
Private Const EXM_OPT_CLEANSUBJECT_REGEX As String = "RE:\s|Re:\s|AW:\s|FW:\s|WG:\s|SV:\s|Antwort:\s"

und
Ist
Code:
    'Replace multiple chars by 1 char
    objRegExp.Pattern = "s+"
Soll
Code:
    'Replace multiple chars by 1 char
    objRegExp.Pattern = "\s+"
Nach diesen Änderungen funktioniert es auch wieder mit den kleinen "s" im Betreff.
Der Hintergrund ist folgender.
Eigentlich sollte per Regex mehrfache Leerzeichen und die Leerzeichen nach den Antwortkennungen ( RE: AW: usw.) entfernt werden.
Nun wird aber bei Regex \s als "Space" genommen. Warum da nur "s" drinstand ist mir unklar.
Es könnte aber sein, dass früher die Regex-Bibliotheksfunktion das anders bearbeitet hat.
 

RichyZuHause

Alter mit Ego
Ein Regex-Problem.
Code:
Private Const EXM_OPT_CLEANSUBJECT_REGEX As String = "RE:s|Re:s|AW:s|FW:s|WG:s|SV:s|Antwort:s"
Code:
Private Const EXM_OPT_CLEANSUBJECT_REGEX As String = "RE:\s|Re:\s|AW:\s|FW:\s|WG:\s|SV:\s|Antwort:\s"

Die Erklärung von Tommi ist richtig.
Seltsamerweise war der Code in der ursprünglichen Lösung von Michael Wöhrer aus dem Jahre 2009 schon mal richtig.
Original-Auszug:
Code:
Private Const EXM_OPT_CLEANSUBJECT_REGEX As String = "RE:\s|Re:\s|AW:\s|FW:\s|WG:\s|SV:\s|Antwort:\s"

Das Problem mit dem Ordner-Dialog und der der separaten Inputbox für den Pfad löst man in VBA normalerweise etwa so (mit Application.FileDialog):
Code:
With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Zielverzeichnis"                'Fenstertitel
        .ButtonName = "Order wählen"              'Button Beschriftung
        .InitialFileName = "D:\Download\"         'Startverzeichnis
         If .Show = -1 Then                       ' if OK is pressed
            OrdnerName = .SelectedItems(1)
        End If
 End With
Funkioniert auch.
In Excel.
Aber nicht in Outlook, wie ich feststellen musste.

Bin gespannt auf Tommis Lösungsidee.
 

DrWaldfee

Mitglied
Ich bin auch gespannt. Diesen Fehler hätte ich überhaupt nicht finden können, weil ich noch nie was mit RegEx zu tun hatte. Lohnt es sich eurer Meinung nach generell sich damit auseinanderzusetzen?
Ansonsten wäre auch irgendein Weg super, wie man schneller in den gewünschten Zielordner gelangt und dieser dann erstmal bis man einen anderen Ordner auswählt der Zielordner bleibt, sehr toll.
 

RichyZuHause

Alter mit Ego
Lösungsvorschlag für die Voreinstellung eines Ablageordners.
Ersetze im vorhandenen Code die Funktion GetFileDir() komplett mit dieser Variante:
Code:
Private Function GetFileDir() As String

Const DEFAULT_FOLDER = "D:\EmailArchiv"
Const EINGABE_TEXT = "Bitte Ordner wählen oder unten eingeben!"
Dim objShell As Object
Dim objFolder As Object
Dim title As String
Dim folder As String

    folder = DEFAULT_FOLDER
    title = folder & vbCrLf & "--> " & EINGABE_TEXT
    Set objShell = CreateObject("Shell.Application")
    Const BFF_PARAMS = &H1 + &H10 + &H40 + &H1000                            ' &H10=EditBox dazu.
    Set objFolder = objShell.BrowseForFolder(0, title, BFF_PARAMS, (folder)) ' (folder), damit Variant.
    If objFolder Is Nothing Then
        GetFileDir = "ERROR_OCCURRED: " & "Abgebrochen."
    Else
        GetFileDir = objFolder.Self.path
    End If

End Function
Vorteil:
Diese Funktion benötigt die ganzen Windows-API-Deklarationen nicht.​
Damit lauffähig mit 32 und 64 Bit.​
Im zusätzlich vorhandenen (und vorbelegten) Eingabefeld kann man einen Pfad eingeben oder aus dem Clipboard heraus einfügen.​
Nachteil:
Per Click kann nur ein Ordner unterhalb dieses Startpunktes gewählt werden.​

Kritik.
 

dr_tommi

alter Oldie
Lösungsvorschlag für die Voreinstellung eines Ablageordners.
Ersetze im vorhandenen Code die Funktion GetFileDir() komplett mit dieser Variante:

Das sieht doch richtig gut aus.

Irgendwie scheinen die Bibliotheken der aktuellen Officeversionen nichts anderes zu ermöglichen.
Selbst mit dem Umweg über Excel, Word, Access oder die Standard-Dlls vom System scheint keine andere Möglichkeit dafür zu existieren.
Bei Outlook scheint jede andere Funktion zur Ordnerauswahl sich auf die Ordner innerhalb des Postfaches zu beziehen und nicht auf die des Dateisystems.

Vorteil:
Diese Funktion benötigt die ganzen Windows-API-Deklarationen nicht.​
Damit lauffähig mit 32 und 64 Bit.​
Im zusätzlich vorhandenen (und vorbelegten) Eingabefeld kann man einen Pfad eingeben oder aus dem Clipboard heraus einfügen.​
Nachteil:
Per Click kann nur ein Ordner unterhalb dieses Startpunktes gewählt werden.​

Kritik.
Auch gegen diesen Nachteil könnte man was machen.
Als möglichen Ansatz könnte man zwar das Textfeld belegen, aber den Ordner im Suchbaum nicht einstellen.
Dann wird der Ordner erst beim Klick oder bei Enter ausgewählt. Und wenn man doch einen anderen nehmen will, kann man den oben im Verzeichnisbaum einfach auswählen.

Auch die Speicherung für das nächste Mal ist möglich.
Die Frage ist nur ob Registry, INI oder XML und wenn Datei dann wo.
 

RichyZuHause

Alter mit Ego
Fürs Merken des zuletzt gewählten Ordners gibt es auch eine Lösung, die keine externen Dateien benötigt.
Dazu muss die Funktion GetFileDir() um den Aufruf von HiddenUserValue() ergänzt werden:
Code:
Private Function GetFileDir() As String

Const DEFAULT_FOLDER = "D:\EmailFolder"
Const EINGABE_TEXT = "Bitte Ordner wählen oder unten eingeben!"
Dim objShell As Object
Dim objFolder As Object
Dim title As String
Dim folder As String

    folder = HiddenUserValue("")                                             ' Letzten gemerkten Wert holen.
    If folder = "" Then folder = DEFAULT_FOLDER                              ' Falls leer, nimm Standard-Wert an.
    title = folder & vbCrLf & "--> " & EINGABE_TEXT
    Set objShell = CreateObject("Shell.Application")
    Const BFF_PARAMS = &H1 + &H10 + &H40 + &H1000                            ' &H10=EditBox dazu.
                                                                             ' http://wsh2.uw.hu/ch12f.html
    Set objFolder = objShell.BrowseForFolder(0, title, BFF_PARAMS, (folder)) ' (folder), damit Variant.
    If objFolder Is Nothing Then
        GetFileDir = "ERROR_OCCURRED: " & "Abgebrochen."
    Else
        folder = objFolder.Self.path
        GetFileDir = folder
        HiddenUserValue (folder)                                              ' Diesen Wert merken.
    End If
End Function

Die Funktion HiddenUserValue() erledigt das versteckte Speichern und Lesen des Folder-Wertes.
Code:
Private Function HiddenUserValue(folder As String) As String
' Speichert einen Wert als verstecktes Item.
' Idee: https://docs.microsoft.com/en-us/office/vba/api/outlook.storageitem.save
' Parameter: Wenn folder = "" dann alten Wert holen, sonst speichern.

Const MY_PRIVATE_STORE = "My hidden user settings"
Const MY_STORED_VALUE = "Last Email Backup Folder"

Dim oInbox As Outlook.folder
Dim myStorage As Outlook.StorageItem
Dim sVal As String

    On Error GoTo ErrorHandler
    Set oInbox = Application.Session.GetDefaultFolder(olFolderInbox)
 
    ' Get an existing instance of StorageItem, or create new if it doesn't exist
    Set myStorage = oInbox.GetStorage(MY_PRIVATE_STORE, olIdentifyBySubject)
 
    ' If StorageItem is new, add a custom property for folder of type text
    If myStorage.Size = 0 Then
        myStorage.UserProperties.Add MY_STORED_VALUE, olText
    End If 'myStorage.Size
 
    sVal = ""
    If folder = "" Then                                          ' Wenn Input = leer, dann Wert holen.
        sVal = myStorage.UserProperties(MY_STORED_VALUE).Value   ' Read a value from custom property.
    Else                                                         ' Wert speichern.
        myStorage.UserProperties(MY_STORED_VALUE).Value = folder ' Assign a value to the custom property.
        sVal = folder
        myStorage.Save                                           ' Gemerkt.
    End If ' folder = "".

ExitScript:
    HiddenUserValue = sVal
    Exit Function
ErrorHandler:
    MsgBox (Err.Description)
    Resume ExitScript
End Function
 

dr_tommi

alter Oldie
Fürs Merken des zuletzt gewählten Ordners gibt es auch eine Lösung, die keine externen Dateien benötigt.
Dazu muss die Funktion GetFileDir() um den Aufruf von HiddenUserValue() ergänzt werden:


Die Funktion HiddenUserValue() erledigt das versteckte Speichern und Lesen des Folder-Wertes.
Soweit ich das gelesen habe wird der Wert dann als versteckter Eintrag im Posteingang gespeichert.
It saves the data in a custom property of a StorageItem object in the Inbox folder.
Im Normalfall auch ok so.
Aber was ist wenn man mehr als einen Posteingang hat, weil man auch mehrere Konten verwaltet? Welche Inbox wird dann genommen? Eine gemeinsame? Oder wird für jedes Konto separat gespeichert?
Ich kann erst wieder ab Mittwoch testen.
 

RichyZuHause

Alter mit Ego
Ich gehe davon aus, dass mit GetDefaultFolder() ein einziger Folder auch bei mehreren Konten gewählt wird.
Da bin ich aber nicht sicher.
 

dr_tommi

alter Oldie
Ich gehe davon aus, dass mit GetDefaultFolder() ein einziger Folder auch bei mehreren Konten gewählt wird.
Da bin ich aber nicht sicher.
Aber ich. :D
Ja, es ist der gleiche "Posteingang" auch bei mehreren Konten. Welcher das dann allerdings ist, lässt sich nicht ganz so einfach feststellen.
Ich habe doch Zeit gefunden das zu testen. Aktuell Outlook 2019 mit 8 Konten ( 2x Office365-, 2x Exchange- und 4xIMAP-Konten).
Egal aus welchem Konto das Makro aufgerufen wird, ab dem 2. Aufruf wird der gespeicherte Eintrag angezeigt.
 

DrWaldfee

Mitglied
Leider hats uns hier alle erwischt und wir liegen mehr oder weniger flach. Kann daher vermutlich erst ab nächster Woche die Vorschläge testen und meinen Senf dazu beitragen.
 

DrWaldfee

Mitglied
Schade, dass das mit dem schönen Dateiauswahldialog nicht geht. Sieht einfach auch viel besser aus als dieser kleine BrowseForFolder-Dialog und ist auch einfach viel praktischer, aber es funktioniert auch mit RichyZuHause's Lösung.

Was ich jetzt noch ausprobiert habe, ist, einer abgelegten Email eine Kategorie zuzuweisen, damit man einen Überblick über abgelegte Emails bekommt.
Eine sehr einfache Lösung dafür wäre:
  1. Händisch die Kategorie mit gewünschter Farbe umbenennen in z.B. "Abgelegt"
  2. Die Funktion "ProcessEmail" um folgenden Code erweitern:
    'Save file myMailItem.SaveAs strFullPath, vExtConst ' myMailItem.Categories = "Abgelegt"
Dann hatte ich noch die Idee den Ablagepfad in der Kategorie zu speichern mit folgendem Code:
myMailItem.Categories = "Abgelegt unter " & strFullPath

Das hat leider den Nachteil, dass die Kategorie dann keine Farbe hat und der Vorteil des Überblicks über abgelegte Emails verschwindet.
Außerdem würde mit jedem neuen Ablageordner scheinbar eine neue Kategorie angelegt werden.
Dann dachte ich ich könnte den Ablagepfad einfach am Anfang der Email ablegen, was ich leider nicht hinbekommen habe.

Kann mir von euch jemand auf die Sprünge helfen?
 

RichyZuHause

Alter mit Ego
Man könnte vor dem Speichern der Mail mit sowas wie
Code:
myMailItem.UserProperties.Add("Abgelegt", olText).Value = strFullPath
die Info mitgeben, aber was nützte das in der Ansicht in Outlook?

Die Kategorie "Abgelegt" mitzugeben ist doch gut!
Warum die Kategorien-Auflistung vollmüllen (und letztendlich schwer benutzbar zu machen)?

Und diese Info in den Mail-Body zu schreiben ist noch schlechter, da die Mail dann ja verändert wird.

Just my 2 cents.
 

DrWaldfee

Mitglied
Mir ist gerade aufgefallen, dass wenn man mehrere Emails auswählt und ablegen möchte, nur bei der ersten ausgewählten Email die Kategorie gesetzt wird.
Bei den nächsten leider nicht. Für mich ergibt das überhaupt keinen Sinn.
Die Funktion ProcessEmail wird doch in der Prozedur ExportEmailToDrive2 in einer For-Schleife für jede einzelne ausgewählte Email aufgerufen und müsste dafür doch dann die Kategorie entsprechend setzen.
Stattdessen erhalte ich ein Ergebnis wie auf dem Bild unten: Ab der zweiten Email gibt es nur noch einen leeren Rahmen...
 

Anhänge

  • IMG_20210201_115332+1.jpg
    IMG_20210201_115332+1.jpg
    497,5 KB · Aufrufe: 28

RichyZuHause

Alter mit Ego
@DrWaldfee: Sieht so aus, als hättest Du Dich an dem Vorschlag aus Post #46 versucht.
Da das reine Vermutung ist, kann man nur sehr schwer eine konkrete Lösung anbieten.
Vorschlag: mehr und genaue Infos. Z.B. Deine komplette Version des Scripts.
 

DrWaldfee

Mitglied
Ich habe nur die Änderungen aus #45 angewendet, also in der Funktion ProcessEmail die Zeile myMailItem.Categories = "Abgelegt" unter der Zeile myMailItem.SaveAs strFullPath, vExtConst eingefügt:

Code:
Private Function ProcessEmail(myItem As Object, strBackupPath As String) As Variant
  [...]
  
    'Save as msg or txt?
    Select Case UCase(EXM_OPT_MAILFORMAT)
        Case "MSG":
            strFullPath = strFullPath & ".msg"
            vExtConst = olMSG
        Case Else:
            strFullPath = strFullPath & ".txt"
            vExtConst = olTXT
    End Select
   
    'File already exists?
    If CreateObject("Scripting.FileSystemObject").FileExists(strFullPath) = True Then
        Error 1002
    End If
  
    'Save file
    myMailItem.SaveAs strFullPath, vExtConst
    myMailItem.Categories = "Abgelegt"
   
    'Return true as everything was successful
    ProcessEmail = True

[...]
End Function
 

DrWaldfee

Mitglied
Man könnte vor dem Speichern der Mail mit sowas wie
Code:
myMailItem.UserProperties.Add("Abgelegt", olText).Value = strFullPath
die Info mitgeben, aber was nützte das in der Ansicht in Outlook?
Das ist ein guter Tipp, danke. So wie ich das verstehe, kann man dann eine weitere Spalte mit dem UserProperty Namen zum Anzeigen in Outlook auswählen.

Habs gerade ausprobiert. Leider scheint das doch nicht so einfach zu funktionieren, als ich gedacht habe.
 
Oben Unten