Search code examples
vbaoutlookoutlook-2007

Force the `Recipients` object to update when the To: text box has been edited


I sort recipients when composing an email.

If I have 3 recipients (for example), run the sort macro, and then remove a recipient from the To: text box, running the macro a second time causes the removed recipient to re-appear. When I step through the macro on the second run, I can see that both .CurrentItem.To and the Recipients object still have all 3 recipients.

It is intermittent. Is there any way to force the Recipients object to update when the To: text box has been edited?

I can't find anything in the Outlook VBA documentation and trial and error has proved fruitless.

Code excerpt:

Public Sub SortRecipients()
    With Application.ActiveInspector
        If TypeOf .CurrentItem Is Outlook.MailItem Then
            Debug.Print "Before: "
            Debug.Print "To: " & .CurrentItem.To
            Debug.Print "# of recipients: " & .CurrentItem.Recipients.Count

            ' Force an update if recipients have changed (DOESN'T HELP)
            .CurrentItem.Recipients.ResolveAll

            Set myRecipients = .CurrentItem.Recipients
            ' Create objects for To list
            Dim myRecipient As recipient
            Dim recipientToList As Object
            Set recipientToList = CreateObject("System.Collections.ArrayList")

            ' Create new lists from To line
            For Each myRecipient In myRecipients
                    recipientToList.Add myRecipient.Name
            Next

            ' Sort the recipient lists
            recipientToList.Sort
            ' Remove all recipients so we can re-add in the correct order
            While myRecipients.Count > 0
                myRecipients.Remove 1
            Wend

            ' Create new To line
            Dim recipientName As Variant
            For Each recipientName In recipientToList
                myRecipients.Add (recipientName)
            Next recipientName
            .CurrentItem.Recipients.ResolveAll

        End If
    End With
End Sub

Steps to reproduce:

  1. Add 4 recipients to the "To" line of a new email in Outlook 2007 (click "Check Names" to resolve the addresses.)
  2. Run the SortRecipients macro. (Recipients are now sorted)
  3. Delete one recipient, re-run the SortRecipients macro.
  4. After doing this, I still have 4 recipients (the deleted one returns).

Solution

  • You can (and should) add an Option Explicit, Outlook would have told you that myRecipients was not declared at the begining of your code.

    I added:

    Dim myRecipients As Recipients
    

    [EDIT] That wasn't enough to get the To field refreshed. I tried several things but eventually, i added a .CurrentItem.Save instead of your try of .CurrentItem.Recipients.ResolveAll

    I think i made it work this way on my Outlook 2007.