'How to get first names & last names of recipients of Outlook meeting invite?

I have a script to iterate through my calendar events that day and produce in a separate email a list in the following format:

Event 1:
Subject:
When:
Attendees:

The function, which lists all attendees:

Function listAttendees(ByRef item As Variant, myself As String, ByRef nicknames As Scripting.Dictionary) As String
    listAttendees = ""
    'Dim pa As Outlook.PropertyAccessor
    Dim sAtt As String
   
    For i = 1 To item.Recipients.Count
        sAtt = item.Recipients.item(i).AddressEntry.GetExchangeUser().FirstName & " " & item.Recipients.item(i).AddressEntry.GetExchangeUser().LastName
        sAtt = cleanName(sAtt)
        If nicknames.Exists(sAtt) Then
            sAtt = nicknames(sAtt)
        End If
        If sAtt <> myself Then
            If listAttendees <> "" Then
                listAttendees = listAttendees & ", "
            End If
            listAttendees = listAttendees & "[[" & sAtt & "]]"
        End If
    Next
End Function

I get

Runtime error 91 - object variable or with block variable not set

The error points to:

sAtt = item.Recipients.item(i).AddressEntry.GetExchangeUser().FirstName & " " & item.Recipients.item(i).AddressEntry.GetExchangeUser().LastName

This script was working a few days ago.



Solution 1:[1]

The GetExchangeUser method should be called only if the AddressEntry.AddressEntryUserType property is set to the olExchangeUserAddressEntry value. Here is what MSDN states for the property:

AddressEntryUserType provides a level of granularity for user types that is finer than that of AddressEntry.DisplayType. The DisplayType property does not distinguish users with different types of AddressEntry, such as an AddressEntry that has a Simple Mail Transfer Protocol (SMTP) email address, a Lightweight Directory Access Protocol (LDAP) address, an Exchange user address, or an AddressEntry in the Outlook Contacts Address Book. All these entires have olUser as their AddressEntry.DisplayType.

For illustration purposes take a look how it can be used in the code:

Sub DemoAE()  
 Dim colAL As Outlook.AddressLists  
 Dim oAL As Outlook.AddressList  
 Dim colAE As Outlook.AddressEntries  
 Dim oAE As Outlook.AddressEntry  
 Dim oExUser As Outlook.ExchangeUser  
 Set colAL = Application.Session.AddressLists  
 For Each oAL In colAL  
   'Address list is an Exchange Global Address List  
   If oAL.AddressListType = olExchangeGlobalAddressList Then  
     Set colAE = oAL.AddressEntries  
     For Each oAE In colAE  
       If oAE.AddressEntryUserType = olExchangeUserAddressEntry Then  
         Set oExUser = oAE.GetExchangeUser  
         Debug.Print(oExUser.JobTitle)  
         Debug.Print(oExUser.OfficeLocation)  
         Debug.Print(oExUser.BusinessTelephoneNumber)  
       End If  
     Next  
   End If  
 Next  
End Sub

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Eugene Astafiev