Search code examples
excelvbaoutlookappointment

Read Proposed Start Time suggested by the invited people


I am developing VBA code to import from Outlook the Proposed Start Time suggested by the invited people.

I have an error

Object doesn't support this property or method

in strNewTimeProposed = objMeeting.GetAssociatedAppointment(True).ProposedStartTime

Function SheetExists(sheetName As String, Optional wb As Workbook) As Boolean
    Dim s As Worksheet
    On Error Resume Next
    If wb Is Nothing Then Set wb = ThisWorkbook
    Set s = wb.Sheets(sheetName)
    SheetExists = Not s Is Nothing
End Function

Sub SaveNewTimeProposedToExcel()
    Dim objNamespace As Outlook.Namespace
    Dim objFolder As Outlook.Folder
    Dim objMail As Outlook.MailItem
    Dim strNewTimeProposed As Date
    Dim objWorkbook As Excel.Workbook
    Dim objMeeting As Outlook.MeetingItem
    Dim objItem As Object
    
    Dim lngRow As Long
    
    Set Base = ActiveWorkbook
    
    'Define o namespace e a pasta da caixa de entrada
    Set objNamespace = Outlook.Application.GetNamespace("MAPI")
    Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)
    
    'Abre o arquivo existente
    Set objWorkbook = Workbooks.Open("C:\Users\genascim\Desktop\Gregory Project\Gregory_database.xlsx")
    
    'Verifica se a planilha "New Time Proposed" já existe e cria uma nova planilha com um nome diferente, se necessário
    Dim strSheetName As String
    Dim intSheetCount As Integer
    intSheetCount = 1
    strSheetName = "New Time Proposed"
    Do While SheetExists(strSheetName, objWorkbook)
        intSheetCount = intSheetCount + 1
        strSheetName = "New Time Proposed " & intSheetCount
    Loop
    
    'Adiciona a nova planilha e define a primeira linha como cabeçalho
    Set objWorksheet = objWorkbook.Sheets.Add(After:=objWorkbook.Sheets(objWorkbook.Sheets.Count))
    objWorksheet.Name = strSheetName
    objWorksheet.Cells(1, 1).Value = "Remetente"
    objWorksheet.Cells(1, 2).Value = "Nova hora proposta"
    
    Set objMailItems = objFolder.Items.Restrict("[ReceivedTime] > '" & Format(Date - 7, "ddddd h:nn AMPM") & "'")
    
    'Loop através dos itens da pasta da caixa de entrada
    For Each objItem In objMailItems
        
        If TypeOf objItem Is Outlook.MailItem Then
            
            Set objMail = objItem
            Debug.Print "Processing email: " & objMail.Subject
        
        ElseIf TypeOf objItem Is Outlook.MeetingItem Then
        
            Set objMeeting = objItem

            'Check if the email item is a meeting request
            
            If objMeeting.MessageClass = "IPM.Schedule.Meeting.Resp.Pos" Or objMeeting.MessageClass = "IPM.Schedule.Meeting.Resp.Neg" Or objMeeting.MessageClass = "IPM.Schedule.Meeting.Resp.Tent" Then
                
                    'Check if the response contains a new time proposal
                    If InStr(1, objMeeting.Subject, "New Time Proposed", vbTextCompare) > 0 Then
                        'Extract the new time proposed
                        If Not objMeeting.GetAssociatedAppointment(True) Is Nothing Then
                            **strNewTimeProposed = objMeeting.GetAssociatedAppointment(True).ProposedStartTime**
                        End If

                    'Add the sender and new time proposed to the worksheet
                    lngRow = objWorksheet.Cells(objWorksheet.Rows.Count, 1).End(xlUp).Row + 1
                    objWorksheet.Cells(lngRow, 1).Value = objMeeting.SenderName
                    objWorksheet.Cells(lngRow, 2).Value = strNewTimeProposed
                End If

            End If
        End If
    Next objItem
    
    'Salva o livro
    objWorkbook.Save
    
End Sub

The variable strNewTimeProposed needs to receive the time proposed by the guests.


Solution

  • AppointmentItem object does not expose the ProposedStartTime property - see https://learn.microsoft.com/en-us/office/vba/api/outlook.appointmentitem

    Keep in mind that proposed new times cannot be stored on the parent appointment itself - imagine multiple attendees proposing different times. Which one do you store? These times are stored on the per-recipient basis (see below)

    The MeetingItem object (that carries a reply from an attendee proposing new time) is a different matter - the times can be accessed using MeetingItem.PropertyAccessor.GetProperty. The DASL property names are "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82500040" (called AppointmentProposedStartWhole) and "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82510040" (called AppointmentProposedEndWhole)

    On the parent appointment, proposed new times are stored on the per-attendee basis and can be accessed using Recipient.PropertyAccessor.GetProperty (where Recipient object comes from the AppointmentItem.Recipients collection). The DASL property names are "http://schemas.microsoft.com/mapi/proptag/0x5FE30040" (PR_RECIPIENT_PROPOSEDSTARTTIME), "http://schemas.microsoft.com/mapi/proptag/0x5FE40040" (PR_RECIPIENT_PROPOSEDENDTIME), "http://schemas.microsoft.com/mapi/proptag/0x5FFB0040" (PR_RECIPIENT_TRACKSTATUS_TIME).

    You can see these (and all other) properties live in OutlookSpy (I am its author) - select the meeting reply or the appointment and click IMessage button.