How To Set Outlook 2013 Calendar Reminders To Stay On Top And In Focus

Recently I migrated our company to Office 365. It was a big change, since we used to use Office 2003 that was connected to Exchange Server 2003 Onsite. One of the biggest changes about Outlook 2013, is that when the Calendar reminder window “pops up”, it usually stays “hidden” behind many other windows. It does play a sound and the window “blinks” yellow in the task bar, but if you’re concentrating on something else, it’s easy to dismiss it, and you could find yourself running late to a meeting.

The Problem

Microsoft has designed it to work that way, so that if you’re in the middle of something and don’t see the pop up window, you won’t press “Enter” by mistake, confirm the reminders and make the window disappear. Hence, when Outlook 2013 calendar reminder window pops up, it becomes hidden since there are other open windows covering it.

The Solution

One simple solution is to set a different – more noticeable – sound to the reminder window. You can do that by opening Outlook -> File -> Options -> Choose “Advanced” on the left side -> Click “Browse” and choose a different sound under the “Play Reminder Sound” field.

Of course – this simple solution won’t help you set Outlook reminders to stay on top.

The real solution here is a VBA based code (Don’t freak out, it’s pretty simple and easy to create) that pops up a customizeable message box that stays on top of every other window, and you can’t ignore it. The only con I find for this solution, is that this message box comes before the reminder window, and in order to view the reminder window, you need to click “ok” on the message box.

This guide is related to Windows 7 and Office 2013 / Office 365, althoug h I assume it will work in Windows 8 as well. So here we go:

1. First – we need to create a Digital Certificate:

How To Find And Create Digital Certificate In Office 2013:

I read on many websites that you need to click “Start” and type “Certificate” and then choose “Digital Certificate for VBA Projects”, but it will not work in Office 2013 / Windows 7.

In order to Create a Digital Certificate, we need to run the file “SELFCERT.EXE”. Here is the file location: “C:\Program Files\Microsoft Office 15\root\office15”.

When you run the file, you’ll get this window:

Office 2013 "Create Digital Certificate" window
Office 2013 “Create Digital Certificate” window

2. Name your certificate and click “OK”. “outlookreminder” for example [without the quotation marks].

3. You’ll get a message says “Succesfully created a new certificate for outlookreminder”. Click “OK”.

4. Go to Outlook, and press ALT + F11 to open the VBA Editor.

5. On the left side, you’ll see “Project 1”. Double click, it will expand and you’ll see “Microsoft Outlook Objects”. Double Click it, it will expand and you’ll see “ThisOutlookSession”. Double click it.

6. On the window on the right side, copy and paste the following code [You can always change the text ‘This is a friendly reminder…’ and the title "Attention!”]:

Private Sub Application_Reminder(ByVal Item As Object)<br /><br />If TypeOf Item Is AppointmentItem Then<br /> MsgBox "This is a friendly reminder about upcoming meeting!", vbSystemModal, "Attention!"<br /> End If<br /><br />End Sub

7. Your final window should look like this:

8. Click Save [D[Don’t exit yet!]/p>

9. In order to run the macro, we need to “sign” it. To do that, go to Tools -> Digital Signature -> Click “Choose” and select the certificate name we’ve created before [I[I named it "outlookreminder”, remember?]/p>

10. Click “OK”, save again and close the window.

11. Now – since this is a macro, we need to allow it in Outlook. I’ve tried to allow this macro specifically with no success. I had no choice but allowing all macros. It’s not risky in my opinion, but do it at your own risk.

12. In Outlook, Go to File -> Options -> Trust Center -> Trust Center Settings -> Macro Settings -> Check “Enable All Macros”. Click “OK”, close Outlook and open Outlook again.

13. From now on, every time there’s a calendar reminder, you’ll get a message box that will stay on top of each and every window, and trust me, you WON’T ignore it.

14. You welcome:

The Final Result
The Final Result

17 thoughts on “How To Set Outlook 2013 Calendar Reminders To Stay On Top And In Focus”

  1. consider actually showing the reminder windows instead of a MsgBox… see code below:

    Private Declare PtrSafe Function FindWindowA Lib “user32” _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Private Declare PtrSafe Function SetWindowPos Lib “user32″ ( _
    ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long

    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
    Private Const HWND_TOPMOST = -1

    Private Sub Application_Reminder(ByVal Item As Object)
    Dim ReminderWindowHWnd As Variant
    Dim cnt As Long
    On Error Resume Next
    cnt = 1
    Do Until (cnt > 20 Or ReminderWindowHWnd 0)
    ReminderWindowHWnd = FindWindowA(vbNullString, cnt & ” Reminder(s)”)
    cnt = cnt + 1
    Loop
    SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    End Sub

    1. Tom, this works except it also brings up the big Microsoft visualization screen where you drop the code into, and it is not on top. Is there something in the text that needs to change so this doesn’t show up and it is on top?
      Bruce

    2. Tom, there is also and error that says something about “Expected String constant”. Here is what it looks like.
      Private Declare PtrSafe Function FindWindowA Lib “user32? _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

      Private Declare PtrSafe Function SetWindowPos Lib “user32? ( _
      ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
      ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
      ByVal cy As Long, ByVal wFlags As Long) As Long

      Private Const SWP_NOSIZE = &H1
      Private Const SWP_NOMOVE = &H2
      Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
      Private Const HWND_TOPMOST = -1

      Private Sub Application_Reminder(ByVal Item As Object)
      Dim ReminderWindowHWnd As Variant
      Dim cnt As Long
      On Error Resume Next
      cnt = 1
      Do Until (cnt > 20 Or ReminderWindowHWnd 0)
      ReminderWindowHWnd = FindWindowA(vbNullString, cnt & ” Reminder(s)”)
      cnt = cnt + 1
      Loop
      SetWindowPos ReminderWindowHWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
      End Sub

      1. This site’s comments engine appears to have reformatted Tom’s straight quotation marks (in his VBA code) as “curly” ones. Not sure if fixing that will cure all problems, but it should cure syntax issues.

  2. Great stuff, no more missing appointments, usually have multiple OCS etc. flashing away in the toolbar so have learned to ‘blank out’ that method of notification.

    This just fixed that.

    Thanks for sharing Shay.

  3. I modified the code to display the actual windows and handle reminders from tasks.

    Private Sub Application_Reminder(ByVal Item As Object)

    If TypeOf Item Is AppointmentItem Or TypeOf Item Is TaskItem Then
    Application.ActiveExplorer.Activate
    End If

    End Sub

  4. Thanks for this article. Regarding the explanation for why Microsoft doesn’t make the reminder stay on top and thereby make reminders USEFUL(!!): All Microsoft has to do is not have any default buttons on the dialog.
    Are you listening, Microsoft? (silence)

  5. I’m regretting moving to Outlook 2013. These hidden reminders are completely useless. I cannot get the above VBA code to work. Please recommend an easier solution – any third party addon maybe?

    1. Download Outlook Reminders On Top. It was written to fix this exact situation. It brings the reminder window to the top without taking focus away from whatever other app you’re working in.

  6. Try using Outlook Web…no notifications at all, except a tiny number that blinks in the top corner, and that’s only if you are looking at the application.

  7. This works great – however I did have to “Trust” that cert upon the first restart of Outlook – no more questions or prompts after that and is working great. For those interested, I’m using Win8.1 and Office2013.

  8. Outlook is prompting me to save the VBA project every time I close Outlook. Even though I’m saying yes. I’m using Outlook 365 ProPlus. Any words of wisdom?

  9. I received the pop-up message to save the VBA project only once. Upon re-opening outlook, I received the “Trust” pop-up mentioned by Frank, but only that one time. No other issues since.

    Side note:

    I’m running Outlook 2016 on Windows 7 Professional.

    The “SELFCERT.exe” was located here for me:

    C:\Program Files\Microsoft Office\root\Office16\SELFCERT.EXE

    I also had to modify the actual VBA code in the post, as it did not copy/paste very friendly:


    Private Sub Application_Reminder(ByVal Item As Object)

    If TypeOf Item Is AppointmentItem Or TypeOf Item Is TaskItem Then
    Application.ActiveExplorer.Activate
    End If

    End Sub

    I ended up using Don’s code above, but the only thing I would prefer is that only the reminder window pop-up. On my machine, it brings the reminder window up, and along with it the Outlook window as well.

  10. Great! This thing works.
    You don’t know how pissed off I am at Microsoft over this issue.
    Myself and others have been begging those idiots to fix this for years.
    Why have appointments if the reminder does not interrupt you? Flashy icon? When I’m writing code the world could come to an end and I would not notice it.
    The one case where the pop-up works and now it’s like pulling teeth out of a chicken to even get MS to recognize that this is a problem!
    Your solution works in Outlook 2013/windows 7 and I am grateful for it.
    Just popped up! Yeah, it works, thank you! thank you! thank you!
    Regards,

Leave a Reply

Your email address will not be published. Required fields are marked *

fourteen − seven =