With the Sub UpdateAppointment you can create and update Outlook meetings or appointments. All items must have a unique index to filter on. The sub filters on BillingInformation, a field I rarely use for other purposes.

Appointments

The appointments are created in your personal calendar. If you want to put stuff in others calendar, you can create a meeting, set a specific category with a dull color that you can ignore. Changes in Outlook that makes it impossible to update the item as an appointment or meeting, will be re-created.

Updates in Outlook

You can update the items in Outlook and use ReadAppointment to read info back to Excel.

Meetings

Include an e-mail address, and the recipient will receive a meeting request.

Download

At the bottom of this article you can download the workbook.

References needed in the VBAProject

To run the code, you need the Microsoft Outlook xx Object library.

Sub ReadAppointment

The ReadAppointment sub reads the Item with the unique index you provide. This way you can organize the items in Outlook and read the date, starttime and endtime back to your workbook.

Usage sample

The Demo sub calls the Testappointment sub which creates two calendar Items on 13. september 2021, and updates the start time to a random time in each loop.

Sub Demo()
    Randomize
 
    While 1
    
        TestAppointment "UniqueId00"
        TestAppointment "UniqueId01"
 
        Debug.Assert 1 > 1
 
    Wend
End Sub

Sub TestAppointment(UniqueId)
    
    Dim AppointmentData As Variant
    AppointmentData = ReadAppointment(UniqueId)

    Dim x As Long
    Dim Label As String
    Dim Msg As String
    
    If Not IsEmpty(AppointmentData) Then
     
        For x = 1 To UBound(AppointmentData)
        
            Select Case x
         
                Case 1
                    Label = "Date"
         
                Case 2
                    Label = "From"
         
                Case 3
                    Label = "To"
        
            End Select
        
            Msg = Msg & Label & ":  " & AppointmentData(x) & ", "
        
        Next x

        If Msg <> "" Then
            'MsgBox Msg
            Debug.Print Msg
        End If
    
    End If
    
    Dim Subject As String
    Dim Starttime As String
    Dim StopTime As String
    Dim BodyText As String
    Dim Email As String
    Dim Category As String
    
    Dim RandomStartHour As String
    RandomStartHour = Start

    Subject = "This is my Subject"
    Starttime = "2021.09.13 " & RandomStartHour & ":00"
    StopTime = "2021.09.13 " & RandomStartHour & ":59"
    BodyText = "BodyText"
    'Email = "demouser@xgmail.com"
    Category = "Demo" & Right(UniqueId, 2)
    
    UpdateAppointment UniqueId, Subject, Starttime, StopTime, BodyText, Email, Category

End Sub

Function Start() As String

 Start = Format(Rnd(8) * 10 + 5, "00")

End Function

Module ModOutlook code

Option Explicit

 
Sub UpdateAppointment(ByVal AppointId As String, Subj As String, Starttime, EndTime, Body As String, Email As String, Category As String, Optional DeleteAppoint As Long)
 
    Dim oApp As Outlook.Application
    Dim oNS As Outlook.Namespace
    Dim oFLDR As Outlook.MAPIFolder
    Dim Appoint As Outlook.AppointmentItem
    Dim oObject As Object
    Dim sMessage As String
    
    Dim Found As Boolean
    
    Found = False
    
    On Error Resume Next
    Set oApp = GetObject("Outlook.Application")
 
    If Err <> 0 Then
        Set oApp = CreateObject("Outlook.Application")
    End If
    
    On Error GoTo Err_Handler
 
    Set oNS = oApp.GetNamespace("MAPI")
    Set oFLDR = oNS.GetDefaultFolder(olFolderCalendar)
    
    Dim Filter As String
    
    Filter = "[BillingInformation] = '" & AppointId & "'"

    Dim oFilteredItems
    Set oFilteredItems = oFLDR.Items.Restrict(Filter)

    Found = False
    Dim UpdateAppoint As Outlook.AppointmentItem
    
    If oFilteredItems.Count > 0 Then
    
        'Should only be one if Index is unique
        Set Appoint = oFilteredItems(1)
        Set UpdateAppoint = Appoint
        Found = True
    
    End If
    
    'If not found, create new
    If Found = False And DeleteAppoint = 0 Then
        Set UpdateAppoint = oApp.CreateItem(olAppointmentItem)
    End If
    
    'Update or create info
    If DeleteAppoint = 0 Then
    
        If LCase(Environ("UserName")) = "ketil" Then
            On Error GoTo 0
        End If
    
        'If we fail to update existing Item, we re-create it
        If SetAppoint(UpdateAppoint, Subj, Starttime, EndTime, Category, Body, AppointId) Is Nothing Then
     
            Set UpdateAppoint = oApp.CreateItem(olAppointmentItem)
            UpdateAppoint = SetAppoint(UpdateAppoint, Subj, Starttime, EndTime, Category, Body, AppointId)
        
        End If
        
        'Appointment or meeting
        With UpdateAppoint
                
            If Email <> "" Then
                
                .MeetingStatus = olMeeting
                .Recipients.Add (Email)
                .Send
                
            Else
                
                .Save
                
            End If
        
        End With
    
    End If
 
    If DeleteAppoint Then
        
        If Found = True Then
            UpdateAppoint.Delete
        End If
         
    End If
 
 
    Set oApp = Nothing
    Set oNS = Nothing
    Set Appoint = Nothing
    Set oFLDR = Nothing
    Set oObject = Nothing
 
    Exit Sub
 
Err_Handler:
    MsgBox Err.Number & " " & Err.Description
 
End Sub

Function SetAppoint(Item As Outlook.AppointmentItem, Subj As String, Starttime, EndTime, Category As String, Body As String, AppointId As String) As Outlook.AppointmentItem

    On Error GoTo Err_Handler

    With Item

        .Subject = Subj
        .Start = Starttime
        .End = EndTime
        .AllDayEvent = False
        .Categories = Category
        .Body = Body
        .BillingInformation = AppointId

    End With

    Set SetAppoint = Item

    Exit Function

Err_Handler:
    Set SetAppoint = Nothing

End Function

Function ReadAppointment(ByVal AppointId As String) As Variant
 
    Dim oApp As Outlook.Application
    Dim oNS As Outlook.Namespace
    Dim oFLDR As Outlook.MAPIFolder
    Dim Appoint As Outlook.AppointmentItem
    Dim oObject As Object
 
    Dim strErrorMessage As String
    
    Dim Found As Boolean
    
    Found = False
    
    On Error Resume Next
    Set oApp = GetObject("Outlook.Application")
 
    If Err <> 0 Then
        Set oApp = CreateObject("Outlook.Application")
    End If
    
    On Error GoTo Err_Handler
 
    Set oNS = oApp.GetNamespace("MAPI")
    Set oFLDR = oNS.GetDefaultFolder(olFolderCalendar)
    
    Dim Filter As String
    
    Filter = "[BillingInformation] = '" & AppointId & "'"

    Dim oFilteredItems 'As Outlook.MAPIFolder
    Set oFilteredItems = oFLDR.Items.Restrict(Filter)

    Found = False
    Dim UpdateAppoint As Outlook.AppointmentItem
    
    If oFilteredItems.Count > 0 Then
    
        Dim x As Long
        For x = 1 To oFilteredItems.Count
 
            Set Appoint = oFilteredItems(x)
            Set UpdateAppoint = Appoint
            Found = True
    
        Next x
    
    End If
    
    'If not found, exit
    If Found = False Then
        Exit Function
    End If
    
    'Update or create info
    
    Dim Value(3) As String
    Dim Streng As String
    Dim a As Long
    
    With UpdateAppoint
    
        Streng = .Start
     
        a = InStr(1, Streng, " ") - 1
        
        If a > -1 Then
        
            Value(1) = Left(Streng, a)
     
            Value(2) = Trim(Mid(Streng, a + 2, 5))
     
            Streng = .End
            Value(3) = Trim(Mid(Streng, a + 2, 5))
        
            ReadAppointment = Value
           
        End If
           
    End With
    
    'End If
 
    Set oApp = Nothing
    Set oNS = Nothing
    Set Appoint = Nothing
    Set oFLDR = Nothing
    Set oObject = Nothing
 
    Exit Function
 
Err_Handler:
    strErrorMessage = Err.Number & " " & Err.Description
 
End Function


Download the Excel Workbook: Excel VBA: Create and Update Outlook Calendar Items (1217 downloads )

Similar Posts