我正在使用MS Access中的VBA和Outlook对象模型以编程方式创建Outlook预约项目(尽管语言无关紧要)。
项目被添加到属于单个用户的多个日历中,其他用户被授予其读/写权限。用户没有理由使用Outlook在日历上创建或编辑约会。然后将约会数据存储在后端表中。从本质上讲,Outlook被用作我的“日历视图”。
但是,我遇到了一些重大问题,用户直接在Outlook中更改了约会项目,后者又不会在我的后端更新。
我希望可以为每个约会项设置一个可更新的“ReadOnly”属性,除非设置为False,否则不允许更改...但不要认为存在。有什么建议吗?
我尝试过或被视为解决方案的事情:
更新: 使用下面的nemmy建议,我已经做到了这一点。这仅在用户在更改任何内容之前选择约会时才有效。如果选择约会并在同一次点击中拖动,则它不起作用。
Private WithEvents objExplorer As Outlook.Explorer
Private WithEvents appt As Outlook.AppointmentItem
Public Sub Application_Startup()
Set objExplorer = Application.ActiveExplorer
End Sub
Private Sub objExplorer_SelectionChange()
If objExplorer.CurrentFolder.DefaultItemType = olAppointmentItem Then
If objExplorer.Selection.Count > 0 Then
Set appt = objExplorer.Selection(1)
End If
End If
End Sub
Private Sub appt_Write(Cancel As Boolean)
If Not appt.Mileage = "" Then 'This appointment was added by my program
MsgBox ("Do not change appointments directly in Outlook!")
Cancel = True
appt.Close (olDiscard)
End If
End Sub
答案 0 :(得分:1)
你能挂钩约会项目的写活动吗?您可以阻止以这种方式进行更改。下面的内容可能有效(免责声明未经测试):
Public WithEvents myItem As Outlook.AppointmentItem
Sub Initialize_handler()
Set myItem = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar).Items("Your Appointment")
End Sub
Private Sub myItem_Write(Cancel as boolean)
Cancel=true
End Sub
答案 1 :(得分:0)
您遇到的问题是人们具有写入权限,您是否可以仅授予他们读取权限?如果这是不可接受的,那么我的回答是你不能或不应该阻止他们更改项目。你需要处理它。这就是我的工作。
因此,在创建日历项时,请为其提供唯一ID,例如后端表行中的ID。将其添加到日历项的属性中,例如里程属性。
现在只需创建一个更新方法,循环遍历表中的所有当前日历项,并使用ID从outlook中获取它们,检查它是否已更改以及是否已更新表。
或者在下面给出您的评论
在我看来,你必须控制前景。因为这样的nemmy在正确的轨道上你需要使用outlook addin挂钩到outlook对象。然后,您需要获取用户打开的每个约会项目,并检查它是否有里程ID。如果确实如此,您需要告诉他们在您的数据库中更改此内容而不是Outlook,或者您需要获取相关事件,指示约会项目的更改并等待更改。然后将这些更改从outlook发送到您的数据库。