У меня список контактов в 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
Вы можете обернуть внутреннее поведение вашего метода изменения в оператор If
.
Таким образом, он остановит бесконечный цикл на второй итерации, поскольку элемент больше не будет обновляться:
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
Вы можете отключить обработчик события 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
Спасибо! Это решило проблему, которая у меня была, и это такое простое решение, я не знаю, почему я не подумал об этом, спасибо!