VBA-Script für Outlook: Gesendete Nachrichten als gelesen markieren

ole258

Active member
Registriert
2 Sep. 2010
Beiträge
2.241
Hallo,

leider bin ich kein Held in VBA.

Was ich möchte: E-Mails, nach dem Versand, im Ordner "Gesendete" (+ Unterordner), als gelesen markieren.

Ordnerstruktur in Outlook:

Gesendete (=Hauptordner)
>Gesendete1
(=Unterordner)
>Gesendete2
(=Untertordner)
>Gesendete3
(=Untertordner)

Was ich jetzt gefunden habe (Quelle: http://www.vboffice.net/de/developers/email-automatisch-als-gelesen-markieren):
Code:
Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Dim F As Outlook.MAPIFolder

  Set Ns = Application.GetNamespace("MAPI")
  Set F = Ns.GetDefaultFolder(olSentMail)
  Set F = F.Folders("[COLOR=#ff0000]Gesendete1[/COLOR]")
  Set Items = F.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub
Problem:^So werden nur die Mails in Gesendete1 als gelesen markiert.

Frage: Wie muss das Script aussehen, dass die Mails in allen 4 Ordnern (Gesendete, Gesendete1, Gesendete2, Gesendete3) als gelesen markiert werden?Danke vorab für Tipps.

ole258
 
Zuletzt bearbeitet:
Es scheint am einfachsten zu sein, wenn du die Objekte und die Ereignisprozedur duplizierst.

Das ist zwar alles andere als Elegant, aber sollte funktionieren:

Code:
Private WithEvents ItemsGesendete As Outlook.Items
Private WithEvents ItemsGesendete1 As Outlook.Items
Private WithEvents ItemsGesendete2 As Outlook.Items
Private WithEvents ItemsGesendete3 As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Dim F As Outlook.MAPIFolder

  Set Ns = Application.GetNamespace("MAPI")
  Set F = Ns.GetDefaultFolder(olSentMail)
  Set F = F.Folders("Gesendete")
  Set ItemsGesendete = F.Items

  Set F = F.Folders("Gesendete1")
  Set ItemsGesendete1 = F.Items

  Set F = F.Folders("Gesendete2")
  Set ItemsGesendete2 = F.Items

  Set F = F.Folders("Gesendete3")
  Set ItemsGesendete3 = F.Items
End Sub

Private Sub ItemsGesendete_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendete1_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendete2_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendete3_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Eleganter wäre es, wenn du es in eine Klasse kapselst, pro Ordner eine Instanz der Klasse erstellts und diese in einer modulweiten Collection ablegst.
Aber das ist auf die Schnelle nicht so einfach zu erklären.
 
Mit dem Regelassistenten kannst Du es nicht lösen?
Außerdem werden doch alle gesendeten Nachrichten automatisch als "gelesen" in "Gesendete Objekte" abgelegt. Du brauchst dann nur noch eine Regel, wann die Gesendete Mail in den jeweiligen Unterordner verschoben und als "Gelesen" markiert werden soll - sofern Outlook die betreffende Bedingung bietet.

Die VBA-Applikationen sind ja recht nett, doch reduzieren sie die Sicherheitseinstellungen, wenn man sie nutzen will.
 
Zuletzt bearbeitet:
Es scheint am einfachsten zu sein, wenn du die Objekte und die Ereignisprozedur duplizierst.

Das ist zwar alles andere als Elegant, aber sollte funktionieren:

Elegant muss es nicht sein - nur funktionieren.
Wie muss der Syntax lauten, wenn z.B. Gesendete1 > Gesendete 1 heißt? Also mit Leerzeichen?


Code:
  Set F = F.Folders("Gesendete 1")
  Set ItemsGesendete 1 = F.Items

...so geht's zumindest nicht ;)

Edit:

Außerdem gibt es einen Laufzeitfehler hier:

Code:
 Set F = Ns.GetDefaultFolder(olSentMail)
Laufzeitfehler '-2147024809 (80070057)'

Liegt das vielleicht daran, dass der Ordner SentMail, ja schon der Haupt-Ordner Gesendete ist und der ja jetzt nochmal als Unterordner angesprochen wird?
- - - Beitrag zusammengeführt - - -

Mit dem Regelassistenten kannst Du es nicht lösen?
Außerdem werden doch alle gesendeten Nachrichten automatisch als "gelesen" in "Gesendete Objekte" abgelegt. Du brauchst dann nur noch eine Regel, wann die Gesendete Mail in den jeweiligen Unterordner verschoben werden soll - sofern Outlook die betreffende Bedingung bietet.

Nein - weil es den Punkt im Regel-Assi "und als gelesen markieren" nicht gibt (zumindest nicht bei Office 365)

Und ja, sie werden automatisch in Gesendete Objekte abgelegt, aber eben nicht als gelesen markiert. Und in den Unterordnern, in die die andreren kopiert werden, noch viel weniger. (Sonst wär's easy)
 
Zuletzt bearbeitet:
Das Leerzeichen darf nur hier rein:

Code:
Set F = F.Folders("Gesendete 1")

Zum Laufzeitfehler:
Du sagtest doch das was du hast würde funktionieren. Nun nicht mehr, oder nur wenn mehrere Folder im Spiel sind?
Funktionieren alle Ordner denn einzeln?

Davon ab, ich habe kein Outlook hier. Ich kenne mich mit VBA sehr gut aus, aber Outlook spezifisch muss ich auch im Web die Dokus durchsuchen.
Wie ist denn die Fehlermeldung (der Text) den du bekommst?
 
Zuletzt bearbeitet:
Also nochmals kurz zur Situation.

vereinfachte Outlook-Orderstruktur:

Gesendete = Hauptordner/SentMail
Gesendete Hans = Unterordner (mit Leerzeichen)
Gesendete Gerd_h = Unterordner (mit Leerzeichen und Unterstrich)

Code:
Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Dim F As Outlook.MAPIFolder

  Set Ns = Application.GetNamespace("MAPI")
  Set F = Ns.GetDefaultFolder(olSentMail)
  Set F = F.Folders("[COLOR=#ff0000]Gesendete...[/COLOR]")
  Set Items = F.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

...wenn ich diese Zeile raus lasse

Code:
Set F = F.Folders("[COLOR=#ff0000]Gesendete...[/COLOR]")

werden alle Mails in Gesendet als gelesen markiert.

Wenn ich die Zeile drin lasse und mit einem der Namen, der Unterorder ergänze z.B. Gesendete Hans, dann werden die Mails in Gesendete Hans als gelesen markiert, aber nicht mehr in Gesendete.

Angepasst müsste das Script dann so aussehen:
Code:
Private WithEvents ItemsGesendete As Outlook.Items
Private WithEvents ItemsGesendeteHans As Outlook.Items
Private WithEvents ItemsGesendeteGerd_h As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Dim F As Outlook.MAPIFolder

  Set Ns = Application.GetNamespace("MAPI")
  Set F = Ns.GetDefaultFolder(olSentMail)
  Set F = F.Folders("Gesendete")
  Set ItemsGesendete = F.Items

  Set F = F.Folders("Gesendete Hans")
  Set ItemsGesendeteHans = F.Items

  Set F = F.Folders("Gesendete Gerd_h")
  Set ItemsGesendeteGerd_h = F.Items

End Sub

Private Sub ItemsGesendete_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendeteHans_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendeteGerd_h_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub
...dann kommt folg. Fehlermeldung:

Fehler.jpg

...nach Debuggen:

debug.jpg

Ich vermute dass es daran liegt(?), weil der Ordner SentMail und Gesendete, derselbe ist und es dadurch zum Konflikt kommt - kann das sein?
 
Zuletzt bearbeitet:
Wie kommen überhaupt ungelesene Mails in die "Gesendete" Ordner?
In allen Umgebungen, in denen ich bisher Outlook in den Fingern hatte, waren gesendete Mails nie "ungelesen".
 
Wie kommen überhaupt ungelesene Mails in die "Gesendete" Ordner?
In allen Umgebungen, in denen ich bisher Outlook in den Fingern hatte, waren gesendete Mails nie "ungelesen".


Kann ich Dir sagen...weil ich die Mails über eine Regel dort rein schiebe.

Warum?

Weil über die Standardfunktion von Outlook "Gesendete E-Mails speichern" o.ä., speichert er mir alle Mails in Gesendete und dann kopiere ich sie per Regel ja noch in die versch. Postausgänge - also wären sie doppelt vorhanden.
 
Hm, kann man - wie bereits oben angedeutet - nicht in der Regel festlegen (per UND), dass die E-Mails dann auch automatisch als gelesen markiert werden? Meine Outlook-Zeiten sind Gottseidank schon lang vorbei, aber ich meine mich daran erinnern zu können, dass das geklappt hat ...
 
Ich glaube ich sehe den Fehler (prüfen kann ich es wie gesagt nicht).
Es ist wohl das Überschreiben deiner Variable 'F'.
Probiere doch mal das:
Code:
Private WithEvents ItemsGesendete As Outlook.Items
Private WithEvents ItemsGesendeteHans As Outlook.Items
Private WithEvents ItemsGesendeteGerd_h As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Set Ns = Application.GetNamespace("MAPI")

  Dim F As Outlook.MAPIFolder
  Set F = Ns.GetDefaultFolder(olSentMail)

  Set ItemsGesendete = F.Folders("Gesendete").Items
  Set ItemsGesendeteHans = F.Folders("Gesendete Hans").Items
  Set ItemsGesendeteHans = F.Folders("Gesendete Gerd_h").Items
End Sub

Private Sub ItemsGesendete_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendeteHans_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendeteGerd_h_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub
 
Zuletzt bearbeitet:
Ich glaube ich sehe den Fehler (prüfen kann ich es wie gesagt nicht).
Es ist wohl das Überschreiben deiner Variable 'F'.
Probiere doch mal das:

Danke, hat leider auch nicht funktioniert.

Dieselbe Fehlermeldung, selbe Markierung, wie o.g.

- - - Beitrag zusammengeführt - - -

Hm, kann man - wie bereits oben angedeutet - nicht in der Regel festlegen (per UND), dass die E-Mails dann auch automatisch als gelesen markiert werden? Meine Outlook-Zeiten sind Gottseidank schon lang vorbei, aber ich meine mich daran erinnern zu können, dass das geklappt hat ...

...ja damals, da waren die Manuals auch noch auf Schiefer geschrieben...:D

Heute sieht das so aus:

1.jpg 2.jpg 3.jpg 4.jpg
 
Zuletzt bearbeitet:
Ich muss nochmal nachfragen: Bist du sicher, dass es in der Zeile kracht?:

Code:
Set F = Ns.GetDefaultFolder(olSentMail)

Sagtest du nicht, dein ursprüngliches Beispiel in ersten Posting funktioniert?
Kann ich kaum glauben...
 
Zuletzt bearbeitet:
Ich muss nochmal nachfragen: Bist du sicher, dass es in der Zeile kracht?:

Code:
Set F = Ns.GetDefaultFolder(olSentMail)

Sagtest du nicht, dein ursprüngliches Beispiel in ersten Posting funktioniert?
Kann ich kaum glauben...

:facepalm: Sorry, ich muss mich 1.000 Mal entschuldigen!

Gleich im ersten Script war ein Fehler:

Code:
Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Dim F As Outlook.MAPIFolder

  Set Ns = Application.GetNamespace("MAPI")
  Set F = Ns.GetDefaultFolder(ol[COLOR=#00ff00]Folder[/COLOR]SentMail)
  Set F = F.Folders("[COLOR=#ff0000]Gesendete Hans[/COLOR]")
  Set Items = F.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Habe das Wort "Folder" versehentlich überschrieben!

So wie oben, werden Mails im Ordner Gesendete Hans als gelesen markiert.

Wenn ich diese Zeile lösche:

Code:
Set F = F.Folders("[COLOR=#ff0000]Gesendete Hans[/COLOR]")

...dann werden alle Mails im Hauptordner (=SentMail) Gesendete, als gelesen markiert

Der Fehler ändert derzeit aber noch nichts am Ergebnis, dass die beiden Scripts von Dir nicht funktionieren. Allerdings kommt die Fehlermeldung an einer anderen Stelle:

Und zwar immer an der folg. Stelle...

Bei der ersten Variante:

Code:
Set F = F.Folders("Gesendete")

und bei der zweiten Variante:

Code:
Set ItemsGesendete = F.Folders("Gesendete").Items


Hilft Dir das jetzt weiter?
 
Zuletzt bearbeitet:
Demnach müsste es dann so korrekt sein:

Code:
Private WithEvents ItemsGesendete As Outlook.Items
Private WithEvents ItemsGesendeteHans As Outlook.Items
Private WithEvents ItemsGesendeteGerd_h As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Set Ns = Application.GetNamespace("MAPI")

  Dim F As Outlook.MAPIFolder
  Set F = Ns.GetDefaultFolder(olFolderSentMail)

  Set ItemsGesendete = F.Items
  Set ItemsGesendeteHans = F.Folders("Gesendete Hans").Items
  Set ItemsGesendeteHans = F.Folders("Gesendete Gerd_h").Items
End Sub

Private Sub ItemsGesendete_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendeteHans_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Private Sub ItemsGesendeteGerd_h_ItemAdd(ByVal Item As Object)
  Item.UnRead = False
  Item.Save
End Sub

Probier' es bitte mal.
 
Zuletzt bearbeitet:
Nein, ein Schreibfehler.

Code:
Private WithEvents ItemsGesendete[COLOR=#0000CD]Hans[/COLOR] As Outlook.Items 
Private WithEvents ItemsGesendete[COLOR=#0000CD]Gerd_h[/COLOR] As Outlook.Items


Code:
Set ItemsGesendete[COLOR=#0000CD]Hans[/COLOR] = F.Folders("Gesendete [COLOR=#008000]Hans[/COLOR]").Items 
Set ItemsGesendete[COLOR=#0000ff]Gerd_h[/COLOR] = F.Folders("Gesendete [COLOR=#008000]Gerd_h[/COLOR]").Items
 
  • ok1.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen
Zurück
Oben