Regels uitvoeren bij verlaten Outlook?

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.281
Ik zou graag voor alle gelezen berichten in mijn Inbox de regels automatisch willen laten uitvoeren bij het verlaten van Outlook.
Ik vind hier iets dat in die richting gaat:
http://www.slipstick.com/outlook/rules/run-outlook-rules-startup/
Nu ken ik wel VBA voor Excel, maar niet voor Outlook, dus ik heb een aantal vragen:
Waar, in de VBA Editor, plaats je die Private Sub?
Hoe macro wijzigen dat het gebeurt bij het verlaten van Outlook?
Hoe macro wijzigen dat het enkel gebeurt voor gelezen berichten?
Hoe macro uitbreiden dat ook de regels voor de verzonden items worden uitgevoerd?
 
De Subs plaats je in de sectie ThisOutlookSession. Code die moet worden uitgevoerd bij het afsluiten van Outlook plaats je in een Sub die heet Private Sub Application_Quit(), ook weer in diezelfde module.

Gelezen berichten kun je benaderen door een object met bijvoorbeeld de naam MsgItem te maken.
Deze vraag je dan als volgt in een loop op: If MsgItem.Read = True
Dat kan in zowel de inbox als de send items box.

Een voorbeeld voor het uitvoeren van regels kun je hier vinden:
http://www.outlookcode.com/codedetail.aspx?id=1266
 
Laatst bewerkt:
Heel erg bedankt, brengt me een heel eind verder.
Maar dat MsgItem, hoe moet je dat declareren?
Dim MsgItem As ....???
Set MsgItem = ???
 
Met Dim msgItem As MailItem. Het gaat tenstlotte om een mailbericht.
 
Dit is een klein voorbeeldje van een routine om berichten te lezen die ik zelf gebruik:
Code:
Private Sub sp_ItemAdd(ByVal item As Object)
    Dim msgItem As Object
   
    On Local Error Resume Next
    For Each msgItem In sp
        If msgItem.UnRead = True Then
            MsgBox ("Nieuw bericht van: " & item.SenderEmailAddress), vbInformation
            msgItem.UnRead = False
        End If
    Next
    On Local Error Goto 0
End Sub
 
Bedankt aan alle twee, denk wel dat het nu gaat lukken!
Octafish, ik ken het objectenmodel van Outlook niet :(
(Wist zelfs niet dat er boeken bestaan voor Outlook VBA)
 
Met <F2> kom je een heel eind; kun je in ieder geval het Objectenmodel doorbladeren :).
 
Weet ik wel natuurlijk, maar zonder enige basiskennis van Outlook VBA geraak ik daar niet zo goed wijs uit.
Kan je trouwens een hint geven hoe ik via VBA een nieuwe regel moet maken? Ik vind dat manueel een hele klus...
Vind het ook erg lastig dat die regels niet alfabetisch staan als je er iets aan wil wijzigen.
 
Zal dit correct werken (durf het niet goed te proberen vooraleer dit aan jullie voor te leggen

Het gaat hem vooral over de volgende opdracht:
rl.Execute RuleExecuteOption:=olRuleExecuteReadMessages

Private Sub Application_Quit()
Dim st As Outlook.Store
Dim myRules As Outlook.rules
Dim rl As Outlook.Rule


' get default store (where rules live)
Set st = Application.Session.DefaultStore
' get rules
Set myRules = st.GetRules

For Each rl In myRules
Debug.Print rl.Name
rl.Execute RuleExecuteOption:=olRuleExecuteReadMessages
Next rl
End Sub
 
Daar gaat denk ik niemand zomaar met Ja op antwoorden. Om het zonder problemen te testen maak je een rule aan die geen kwaad kan en laat je die uitvoeren om te kijken of het werkt.
 
Laatst bewerkt:
Ik denk dat de macro werkt maar hij wordt niet automatisch uitgevoerd bij Verlaten noch Starten van Outlook, wel als ik hem zelf vraag om uit te voeren en dat begrijp ik niet???

Private Sub Application_Quit()
RegelsUitvoeren
End Sub


Private Sub Application_Startup()
RegelsUitvoeren
End Sub

Sub RegelsUitvoeren()

Dim st As Outlook.Store
Dim myRules As Outlook.rules
Dim rl As Outlook.Rule
Dim Antwoord As VbMsgBoxResult

Antwoord = MsgBox("Regels op gelezen mails nu uitvoeren?", vbYesNo + vbQuestion)
If Antwoord = vbYes Then



' get default store (where rules live)
Set st = Application.Session.DefaultStore
' get rules
Set myRules = st.GetRules


For Each rl In myRules
Debug.Print rl.Name
rl.Execute RuleExecuteOption:=olRuleExecuteReadMessages
Next rl

End If
End Sub
 
Start een debug sessie vanaf RegelsUitvoeren in Application_Startup(), dan kun je volgen wat er gebeurd.

Gebruik bij het plaatsen van code ook de codetag, dan blijven de inspringpunten behouden en is het duidelijker leesbaar.
 
Laatst bewerkt:
Ik zie geen knop voor code? Heb het dus maar in Courier gezet.
Ik denk niet dat het probleem in de inhoud van de macro zit, want als ik via Developer tab of een gewone VBA module de code uitvoer werkt hij.
Maar er werkt niets wat in ThisOutlookSession staat, zelfs niet het volgende:
Private Sub Application_NewMail()
MsgBox "nieuw"
End Sub
 
Je zult ook veel meer moeten doen om te kijken of er nieuwe mail binnenkomt. Dat gaat niet maarzo. Als ik hier een msgbox bericht in Application_Startup() en Application_Quit zet worden ze beide op de juiste momenten uitgevoerd.

De knop voor code zie je als je op "Ga geavanceerd" klikt. Maar je kunt het ook zelf ingeven door het volgende om je code heen te zetten maar dan zonder de spatie achter het [ teken: [ CODE] je code [ /CODE]
Dat ziet er dan zo uit:
Code:
 je code

Welke versie van Office gebruik je eigenlijk?
 
Laatst bewerkt:
Bij deze een voorbeeld van wat ik zelf ooit gemaakt heb en nog steeds goed werkt. Het geeft een bericht als er een nieuwe mail in een bepaalde map binnenkomt en laat tevens de afzender zien:

Code:
Option Explicit
Public WithEvents ns As Items
Public InboxID As String

Private Sub Application_Startup()
    ' Deze functie wordt aangeroepen wanneer Outlook start
    ' Na evt. wijzigingen cursor hierin plaatsen en op F5 drukken om uit te voeren, of Outlook herstarten
    ' Gebruik de functie GetOutlookFolderID om onderstaande ID's te verkrijgen
    ' Deze verschillen per account en machine
    InboxID = "0000000074DAB329BC3CBB47B94716705C3EBD82C2820000"
    Set ns = Application.GetNamespace("MAPI").GetFolderFromID(InboxID).Items
End Sub

Private Sub ns_ItemAdd(ByVal Item As Object)
    Dim MsgItem As Object

    On Local Error Resume Next
    For Each MsgItem In ns
        If MsgItem.UnRead = True Then
            MsgBox ("Nieuw bericht van " & Item.SenderEmailAddress), vbInformation
            MsgItem.UnRead = False
        End If
    Next
    On Local Error GoTo 0
End Sub

Private Sub GetOutlookFolderID()
   Dim olfolder As Outlook.MAPIFolder
   Dim olApp As Outlook.Application
   Set olApp = CreateObject("Outlook.Application")
   Set olfolder = olApp.GetNamespace("MAPI").PickFolder
   ' olfolder.Display
   Debug.Print olfolder.EntryID
   Set olfolder = Nothing
   Set olApp = Nothing
End Sub


Een Sub die moet worden uitgevoerd als de gebruiker zelf een nieuwe mail maakt zou als volgt zijn:

Code:
Private Sub Application_ItemLoad(ByVal Item As Object)
    MsgBox "Nieuwe mail maken"
End Sub
 
Laatst bewerkt:
Het is heel raar.
In Outlook 2007 onder Windows XP (mijn onbelangrijk toestel) werkt de macro vanuit een gewone module, en worden ook die automatische macro's uitgevoerd.
Maar in Outlook 2013 onder Windows 7 (mijn normale PC) werken de automatische macro's niet, enkel die in een gewone module. Ik heb de beveiliging eraf gehaald, alle macro's mogen zonder verwittiging worden uitgevoerd.
 
De voorbeelden die ik gaf werken bij mij in zowel Office 2007, 2010 als 2013.
 
Na herstarten van de PC werken voor Outlook 2013 de automatische macro's wel, heel eigenaardig. Ik laat nu de regels uitvoeren bij het verlaten van het programma.
 
Dat is vreemd inderdaad. Maar het werkt nu dus :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan