Run a script rule
To use the code, you'll create a rule with the desired conditions and choose 'run a script' as the only action, selecting this script.
Sub KeepFriday(Item As Outlook.MailItem)
datefri = WeekdayName(Weekday(aItem.ReceivedTime))
If datefri = "Friday" Then
'moves to the Friday subfolder under Inbox.
Item.Move Session.GetDefaultFolder(olFolderInbox).Folders("Friday")
Else
Item.Delete
End If
End Sub
VBA to run anytime
To use this code sample select the folder then run the macro
Sub KeepFridayOnly()
Dim dest As Outlook.MAPIFolder
Dim aItem As Object
Dim datefri As String
Set mail = Application.ActiveExplorer.CurrentFolder
For Each aItem In mail.Items
datefri = WeekdayName(Weekday(aItem.ReceivedTime))
If datefri = "Friday" Then
aItem.Move Session.GetDefaultFolder(olFolderInbox).Folders("Friday")
End If
Next aItem
Set aItem = Nothing
Set myolApp = Nothing
End Sub
ItemAdd Macro
This version of the macro is an ItemAdd macro. This means it run when a message is added to the folder the macro is watching. In this sample, we're using Select Case to check the day of the week and assign a different category based on the date.
This macro is added to ThisOutlookSession and runs when Outlook starts. To test it without restarting Outlook, click in the Application_Startup macro and click Run. Select one or two messages, then Ctrl+C, V to copy and paste them in place. The macro will run on the copies.
Option Explicit
Private WithEvents olInboxItems As Items
Private Sub Application_Startup()
Dim objNS As NameSpace
Set objNS = Application.Session
' instantiate objects declared WithEvents
Set olInboxItems = objNS.GetDefaultFolder(olFolderInbox).Items
Set objNS = Nothing
End Sub
Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
Dim dayname As String
Dim strcat As String
dayname = WeekdayName(Weekday(Item.ReceivedTime))
Select Case dayname
Case "Monday", "Tuesday"
strcat = "Due Friday"
Case "Wednesday", "Thursday"
strcat = "Due Monday"
Case "Friday", "Saturday"
strcat = "Due Tuesday"
Case "Sunday"
strcat = "Due Wednesday"
End Select
Item.Categories = strcat
Item.Save
End Sub
Process mail by date and time
Outlook's Rules and Search functions can't search by times. While you can "do something" with messages (or any Outlook item) between two dates, you can't filter by time too. However, you can use VBA to "do something" messages that fall within a certain time period.
In this code sample, I'm adding a category to messages that arrived after 6 PM during the last 30 days. This macro runs on the messages in the selected folder.
Sub FlagByTime()
Dim aItem As Object
Dim strTime As String
Set mail = Application.ActiveExplorer.CurrentFolder
For Each aItem In mail.Items
'Check the message age
If aItem.ReceivedTime > Date - 30 Then
strTime = TimeValue(aItem.ReceivedTime)
'Check the received time
If strTime > #6:00:00 PM# Then
aItem.Categories = "Nighttime"
aItem.Save
End If
End If
Next aItem
Set aItem = Nothing
End Sub
Add a Category to messages received at specific dates and times
This macro will add a category to messages received at specific times between specific dates. In this example, messages received between 8 AM and 10 AM from 10/20/2019 through 11/3/2019.

This macro runs on the selected folder.
Public Sub FindMailbyTime()
Dim objOL As Outlook.Application
Dim objItems As Outlook.Items
Dim objFolder As Outlook.MAPIFolder
Dim obj As Object
Set objOL = Outlook.Application
Set objFolder = objOL.ActiveExplorer.CurrentFolder
Set objItems = objFolder.Items
For Each obj In objItems
If obj.MessageClass = "IPM.Note" Then
If obj.ReceivedTime => DateValue("10/20/2019") And obj.ReceivedTime <= DateValue("11/3/2019") Then
' 24-hour format
If Hour(obj.ReceivedTime) >= 8 And Hour(obj.ReceivedTime) < 10 Then
With obj
' do whatever
Debug.Print .ReceivedTime, .Subject
.Categories = "Received 8 - 10"
.Save
End With
End If
End If
End If
Next
Set obj = Nothing
Set objItems = Nothing
Set objFolder = Nothing
Set objOL = Nothing
End Sub
How to use the macro
First: You will need macro security set to low during testing.
To check your macro security in Outlook 2010 or 2013, go to File, Options, Trust Center and open Trust Center Settings, and change the Macro Settings. In Outlook 2007 and older, it’s at Tools, Macro Security. If Outlook tells you it needs to be restarted, close and reopen Outlook. Note: after you test the macro and see that it works, you can either leave macro security set to low or sign the macro.
Now open the VBA Editor by pressing Alt+F11 on your keyboard.
To use the macro code in ThisOutlookSession:
- Expand Project1 and double click on ThisOutlookSession.
- Copy then paste the macro into ThisOutlookSession. (Click within the code, Select All using Ctrl+A, Ctrl+C to copy, Ctrl+V to paste.)
Application_Startup macros run when Outlook starts. If you are using an Application_Startup macro you can test the macro without restarting Outlook by clicking in the first line of the Application_Startup macro then clicking the Run button on the toolbar or pressing F8.
More information as well as screenshots are at How to use the VBA Editor.
VBA Date and Time Functions
| Function | Description |
|---|---|
| Now | Current date and time. Example: 7/27/19 11:32:18 AM returned by Now |
| Today() | Current date only |
| Date | Current date only. Example: 7/27/19 returned by Date |
| Time | Current time only. Example: 11:32:18 AM returned by Time |
| TimeValue() | Time part of argument. Example: 11:32:18 AM returned by TimeValue(Now) |
| DateValue() | Date part of argument (excellent for ordering by date) |
| DateSerial() | Date part of three arguments: year, month, day DateSerial(Year(Now), Month(Now)-1, Day(Now)) |
| DatePart() | Returns a portion of the date. Year example: 2019 returned by DatePart("yyyy", Date) Month example: 7 returned by DatePart("m", #7/27/2019#) Week of year example: 30 returned by DatePart("ww", #7/27/2019#) DatePart function |
| Year() | Returns the year portion of the date argument. |
| Month() | Returns the month portion of the date argument. |
| Day() | Returns the day portion of the date argument. |
| MonthName() | Used to format month names. July returned by MonthName(Month(Date)) |
| WeekdayName() | Used to format day names. Wednesday returned by WeekdayName(Weekday(Date)) |
| DateDiff() | Returns the difference in dates. Days example: -237 returned by DateDiff("d", #7/27/2019#, #12/2/2018#) Months example: 2 returned by DateDiff("m", #7/27/2019#, #9/14/2019#) 0 is returned if the two dates have same month and year |
| DateAdd() | Add and subtract dates. 7/28/2019 returned by DateAdd("yyyy", 1, #7/27/2019#)) Today"s date + 30 days returned by DateAdd("d", 30, Date) The date 45 days ago returned by DateAdd("d", -45, Date) To find Monday of a week: DateAdd("d",-WeekDay(Date)+2,Date) |
| Format() | Used for formatting dates. Examples: Wed, 27-July-2019 returned by Format(Date,"ddd, d-mmmm-yyyy") 27-Jul-2019 returned by Format(Date,"d-mmm-yy") |
More Information
More Run a Script Samples:
- Autoaccept a Meeting Request using Rules
- Automatically Add a Category to Accepted Meetings
- Blocking Mail From New Top-Level Domains
- Convert RTF Messages to Plain Text Format
- Create a rule to delete mail after a number of days
- Create a Task from an Email using a Rule
- Create an Outlook Appointment from a Message
- Create Appointment From Email Automatically
- Delegates, Meeting Requests, and Rules
- Delete attachments from messages
- Forward meeting details to another address
- How to Change the Font used for Outlook's RSS Feeds
- How to Process Mail After Business Hours
- Keep Canceled Meetings on Outlook's Calendar
- Macro to Print Outlook email attachments as they arrive
- Move messages CC'd to an address
- Open All Hyperlinks in an Outlook Email Message
- Outlook AutoReplies: One Script, Many Responses
- Outlook's Rules and Alerts: Run a Script
- Read Outlook Messages using Plain Text
- Receive a Reminder When a Message Doesn't Arrive?
- Run a script rule: Autoreply using a template
- Run a Script Rule: Change Subject then Forward Message
- Run a script rule: Reply to a message
- Run a Script Rule: Send a New Message when a Message Arrives
- Run Rules Now using a Macro
- Run-a-Script Rules Missing in Outlook
- Save all incoming messages to the hard drive
- Save and Rename Outlook Email Attachments
- Save Attachments to the Hard Drive
- Save Outlook Email as a PDF
- Sort messages by Sender domain
- Talking Reminders
- To create a rule with wildcards
Hi Diane,
I am trying to get the script to work within a rule but it is not working for me. I added the script function back to Outlook via a registry edit. I have Microsoft Outlook for Office 365 and latest 64-bit version of Outlook.
Nothing happens when I run my rule with the script. I am trying to get an email I receive on Tuesdays, instead of Fridays like your example, to move the email to my "Tuesday" labeled folder from my "OneCloud" labeled folder, both under my inbox, where I can then have another rule to forward the email to the Outlook contact group of my choosing. See attached screenshots. Can you please help me?
Thank you,
When I try the code in the "Process mail by date and time" section I get the message:
"Run-time error '438':
Object doesn't support this property or method"
Please could someone tell me how to correct this?
Hi, I find it not usefull, cause the script can only run on a client and at the specific day i am not at work, thats why i neede the script.
These scripts require outlook to be open to run, even one triggered by reminders or an email rule. If outlook is open you can use a task reminder set for that specific day, or if you want to remotely trigger it, send an email with a specific (and unique) subject line.