joha1908
Goto Top

Outlook VBA, Alternative zu NewMailEx, neue bereits gelesene Email im Posteingang

Hallo zusammen,

ich habe ein Skript in VBA für Outlook, dass bei neuen Emails den PDF-Anhang unter bestimmten Bedingungen extrahiert und abspeichert, dies erfolgt via Application_NewMailEx ... - funktioniert soweit auch.

Allerdings habe ich noch immer das Problem, dass wenn eine E-Mail zuvor mit einem anderen Mail-Client abgerufen wird (auch IMAP), diese dann nicht mehr als neue E-Mail im entsprechenden Outlook-Posteingang erscheint und somit die Prozedur nicht gestartet wird.

Gibt es dafür eine Lösung? Habe bisher nichts gefunden, das die Prozedur bei neuen Emails, die bereits als gelesen deklariert sind, startet.

Gruß
Joha

Content-Key: 305089

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

Ausgedruckt am: 29.03.2024 um 04:03 Uhr

Mitglied: 129413
129413 22.05.2016 aktualisiert um 09:16:36 Uhr
Goto Top
Mitglied: joha1908
joha1908 22.05.2016 um 13:29:40 Uhr
Goto Top
Hallo Skybird,

vielen Dank für deine Antwort.
Leider habe ich Probleme bei der Umsetzung.
Aktuell habe ich folgende Zeilen in "ThisOutlookSession":

Public Sub Application_NewMailEx(ByVal EntryIDCollection As String)

Dim varEntryIDs
Dim objItem
Dim i As Integer, k As Integer
Dim strCMDLine As String, strTempPath As String, strTargetPath As String, pdf_name
Dim att As Attachment
Dim fso As Object, objShell As Object, regex As Object, file As Object
Dim colPFiles As New Collection, colTFiles As New Collection

'Pfade  
'----------------------------------------------------------------------------------------------  
'Pfad zu pdftotext.exe  
strCMDLine = "C:\Users\User\Documents\PDFtoText\pdftotext.exe -table -layout -nopgbrk "  
'----------------------------------------------------------------------------------------------  

Set fso = CreateObject("Scripting.FileSystemObject")  
'Für das Starten eines externen Programms  
Set objShell = CreateObject("WScript.Shell")  
'Für das Absuchen von Text  
Set regex = CreateObject("vbscript.regexp")  
regex.MultiLine = True
    
varEntryIDs = Split(EntryIDCollection, ",")  
For i = 0 To UBound(varEntryIDs)
    Set objItem = Application.Session.GetItemFromID(varEntryIDs(i))
    'Überprüfung Absendername und Betreff  
    If objItem.Class = olMail And objItem.SenderEmailAddress Like "test@test.de" _  
    And objItem.Subject Like "*Test Nr*" Then  
        For Each att In objItem.Attachments
            'Wenn Attachment ein PDF ist dann ...  
            If InStr(att.DisplayName, ".pdf") Or InStr(att.DisplayName, ".PDF") Then  

....

Wo füge ich nun das ItemAdd-Event ein?
Muss ich dafür ein ein neues Modul anlegen oder bleibts in ThisOutlookSession?

Gruß
Joha
Mitglied: 129413
129413 22.05.2016 um 17:12:42 Uhr
Goto Top
Lesen scheint nicht so deine Stärke zu sein...
Wenn das in ein Modul käme hätte ich darauf hingewiesen. 2ten Link aufmachen kopieren, an deine Bedürfnisse anpassen, fertig.
Mitglied: joha1908
joha1908 22.05.2016 um 22:22:34 Uhr
Goto Top
... ich denke schon, dass ich lesen kann - allerdings startet die Prozedur weder beim Eingang einer ungelesenen, noch bei einer gelesenen Mail ...
Mitglied: 129413
129413 22.05.2016 aktualisiert um 22:28:57 Uhr
Goto Top
Das Makro läuft erst wenn du Outlook neu gestartet hast!

Wozu ist wohl die Sub
Private Sub Application_Startup() da die das Objekt für das Event setzt?

Natürlich muss Outlook laufen damit es erkennt wenn neue Dateien in den Posteingang verschoben werden. Wenn du bereits darin liegende Mails verarbeiten willst prüfe zusätzlich auch beim Start auf Mails mit einer ForeachSchleufe und prüfe die Eigenschaft Unread dann verarbeitest du sie und verschiebst sie in einen "verarbeitet" Ordner, fertig ist die Laube.
Mitglied: joha1908
joha1908 26.05.2016 um 22:36:29 Uhr
Goto Top
Hallo Skybird,

läuft soweit alles.
Allerdings nicht auf allen meiner PCs.
Auf zwei Rechner (win10 & office 2016) bekomme ich es nicht zum laufen.
Das Application.Startup-Ereignis wird einfach nicht ausgelöst.

Ich weiß nicht woran das liegen könnte.?

Gruß
Joha
Mitglied: 129413
129413 26.05.2016 aktualisiert um 23:36:14 Uhr
Goto Top
Das Application.Startup-Ereignis wird einfach nicht ausgelöst.
Das weist du woher? Hast du dort mal eine msgbox reingesetzt die dir das bestätigt?
Sind Makros im Sicherheitscenter freigeschaltet oder nur signierter Code erlaubt ?
Mitglied: joha1908
joha1908 27.05.2016 um 23:57:38 Uhr
Goto Top
Habe Haltepunkte gesetzt zum testen...

Code ist signiert.

An dem Rechner an dem es läuft, ist nur ein Mail-Konto eingerichtet. An den anderen PCs ist das betreffende Konto als Standard eingerichtet.

Public WithEvents itmsFolderTest As Items

Public Sub Application_Startup()
    Set itmsFolderTest = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items  
    
End Sub

Public Sub itmsFolderTest_ItemAdd(ByVal Item As Object)

Dim varEntryIDs
Dim objItem
...
Mitglied: 129413
Lösung 129413 28.05.2016 aktualisiert um 08:32:06 Uhr
Goto Top
Habe Haltepunkte gesetzt zum testen...
Haltepunkte bringen dir bei diesem Event überhaupt nichts, denn die verschwinden nach dem Schließen von Outlook ja wieder (werden nicht gespeichert) und das Event feuert ja nur beim Start face-smile Bau also mal eine msgbox oder ein debug.print dort ein, dann siehst du ob es tatsächlich feuert.

ACHTUNG, wenn das Konto ein IMAP Konto ist musst du am Code etwas ändern denn dann hast du quasi zwei Stores, einmal den beim Provider und eine lokale PST in dem Postausgang, Kalender & Co liegen, deswegen musst du dann den Code im Startup-Event umschreiben:
Public Sub Application_Startup()
    Set itmsFolderTest = Application.Session.Stores("Name des IMAP Stores").GetRootFolder.Folders("Posteingang").Items  
End Sub
"Namen" bitte anpassen.
Mitglied: joha1908
joha1908 28.05.2016 um 14:57:13 Uhr
Goto Top
Funktioniert - lag an dem IMAP-Konto.

Danke!
Mitglied: joha1908
joha1908 05.06.2016 um 10:26:08 Uhr
Goto Top
Hallo Skybird,

hätte noch eine Off-Topic-Frage:

Möchte aus Outlook per VBA und einem Button in der Schaltfläche eine Excel-Datei öffnen.
Bekomme das auch soweit hin:
Public Sub Excel_oeffnen()

Dim objExcelApp As Object

Set objExcelApp = CreateObject("excel.application")  

With objExcelApp
    .Visible = True
    .Workbooks.Open ("C:\Users\Benutzer\Documents\Test.xlsm")  
End With

End Sub

Nun sollte die Datei nur geöffnet werden, wenn sie noch nicht geöffnet ist, andernfalls solle eine Msg-Box erscheinen.
In Excel für mich kein Problem, aber über Outlook zu Excel, hab ich Probleme bei der Umsetzung.

Gruß
Joha
Mitglied: 129413
129413 05.06.2016 aktualisiert um 10:59:07 Uhr
Goto Top
Public Sub Excel_oeffnen()
Dim objExcelApp As Object, wb as Object, strDoc as String
strDoc = "C:\Users\Benutzer\Documents\Test.xlsm"  

Set objExcelApp = GetObject(, "Excel.Application")  
If objExcelApp Is Nothing Then
    Set objExcelApp = CreateObject("Excel.Application")  
    With objExcelApp
        .Workbooks.Open strDoc
        .Visible = True
    End with
Else
    With objExcelApp
        For each wb in .Workbooks
           If LCase(wb.Path) = LCase(strDoc) then 
               Msgbox "Dokument ist schon geöffnet!",vbExclamation  
               Exit Sub
           End if
       Next
    End With
End if
End Sub

Immer diese Offtopics in Threads die nichts damit zu tun haben face-sad Gewöhn dir das ab, das macht man nicht und ist kontraproduktiv für ein Forum, vor allem für die die nach bestimmten Infos suchen.
Dafür gibt's neue Threads oder das interne Nachrichtensystem.

Und immer schön dran denken:
"Alles für den Dackel, alles für den Club" face-smile

Schönen Sondaach
gez. Hausmeister Krause