VBA can't send calendar appointment

FizzBuzz picture FizzBuzz · Sep 30, 2011 · Viewed 7.4k times · Source

When I manually make a calendar reminder/appointment, I can then click "Invite Attendees" and chose the people to invite and then click "Send" and everyone will receive that calendar reminder/appointment.

I have the following code to make a reminder programmatically, but it won't send to the intended recipients. If I open the reminder after the script has run and click on "Invite Attendees" I can see the list is filled with the people I want to send the reminder to, so I'm not really sure why it's not actually sending the reminder to them.

Can anyone shed some light on this for me?

Private Function CreateAppointment(SubjectStr As String, BodyStr As String, StartTime As Date, EndTime As Date, AllDay As Boolean)
    Dim olApp As Outlook.Application
    Dim Appt As Outlook.AppointmentItem
    ' Only create the reminder if there's no duplicate
    If (CheckForDuplicates(SubjectStr) = False) Then
        Set olApp = CreateObject("Outlook.Application")
        Set Appt = olApp.CreateItem(olAppointmentItem)
        Appt.Recipients.Add ("John Doe")
        Appt.Recipients.ResolveAll
        Appt.Subject = SubjectStr
        Appt.Start = StartTime
        Appt.End = EndTime
        Appt.AllDayEvent = AllDay
        Appt.Body = BodyStr
        Appt.ReminderSet = True
        Appt.Save
        Appt.Send
    End If
    Set Appt = Nothing
    Set olApp = Nothing
End Function

Answer

JimmyPena picture JimmyPena · Oct 8, 2011

A meeting is a specific type of appointment -- an appointment that other people are invited to.

In order to make an appointment a meeting, you need to do more than just invite attendees. You need to set the status to 'Meeting'. Add this to your code:

Appt.MeetingStatus = olMeeting

Also note that you set a reminder, but didn't set a reminder time. For example,

Appt.ReminderMinutesBeforeStart = 30

Finally, if this is Outlook VBA, why are you using CreateObject? You should be using the native Application Object to derive all your objects.

i.e. instead of

Set olApp = CreateObject("Outlook.Application")

you would use

Set olApp = Outlook.Application

HTH