Используйте обработчик события ItemChange для обновления свойства элемента - PullRequest
0 голосов
/ 27 мая 2019

У меня список контактов в Outlook обновлен через другую программу. Я сам не касаюсь списка. Каждый раз, когда меняется контакт, я хочу обновить название компании через VBA.

Public WithEvents objNewContact As Items   
Public Sub Initialize_handler()
    Set objNewContact = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts).Items
End Sub

Public Sub objNewContact_ItemChange(ByVal Item As Object)
    Item.CompanyName = "NewCompanyName"
    MsgBox "Company name changed to " & Item.CompanyName
End Sub

Если я сам редактирую контакт через Outlook, он работает. При редактировании через другой источник, он показывает MsgBox, сообщающий мне, что название компании было изменено, но изменение не сохраняется.

Если я добавлю «Item.Save», это создаст бесконечный цикл.

Public Sub objNewContact_ItemChange(ByVal Item As Object)
    Item.CompanyName = "NewCompanyName"
    MsgBox "Company name changed to " & Item.CompanyName
    Item.Save
End Sub

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы можете отключить обработчик события ItemChange перед изменением Item.CompanyName.

Public Sub objNewContact_ItemChange(ByVal Item As Object)

    ' event handler off
    Set objNewContact = Nothing

    Item.CompanyName = "NewCompanyName"
    Item.Save

    MsgBox "Company name changed to " & Item.CompanyName

    ' event handler on
    Initialize_handler

End Sub
0 голосов
/ 27 мая 2019

Вы можете заключить внутреннее поведение вашего метода изменения в оператор If. Таким образом, он остановит бесконечный цикл на 2-й итерации, так как Элемент больше не будет обновляться:

Public Sub objNewContact_ItemChange(ByVal Item As Object)
    If Item.CompanyName != "NewCompanyName" Then
        Item.CompanyName = "NewCompanyName"
        MsgBox "Company name changed to " & Item.CompanyName
        Item.Save
    End If
End Sub
...