使用ItemChange事件处理程序更新项目属性

时间:2019-05-27 14:30:38

标签: vba outlook

我有一个通过其他程序更新的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 :(得分:0)

您可以在If语句中包装change方法的内部行为。 这样,它将在第二次迭代时停止无限循环,因为该项目将不再更新:

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

答案 1 :(得分:0)

您可以在更改Item.CompanyName之前关闭ItemChange事件处理程序。

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