Vba 将Outlook任命项设置为只读

Vba 将Outlook任命项设置为只读,vba,ms-access,outlook,exchange-server,Vba,Ms Access,Outlook,Exchange Server,我正在使用MS Access中的VBA和outlook对象模型以编程方式创建outlook约会项目(尽管语言不重要) 项目被添加到属于单个用户的多个日历中,其他用户被授予读/写权限。用户没有理由使用Outlook在日历上创建或编辑约会。然后,约会数据存储在后端表中。实际上,Outlook被用作我的“日历视图” 但是,我遇到了一些重大问题,用户直接在Outlook中更改约会项目,而Outlook不会在我的后端更新 我想要一个可更新的“只读”属性,它可以为每个约会项目设置,并且不允许更改,除非设置为

我正在使用MS Access中的VBA和outlook对象模型以编程方式创建outlook约会项目(尽管语言不重要)

项目被添加到属于单个用户的多个日历中,其他用户被授予读/写权限。用户没有理由使用Outlook在日历上创建或编辑约会。然后,约会数据存储在后端表中。实际上,Outlook被用作我的“日历视图”

但是,我遇到了一些重大问题,用户直接在Outlook中更改约会项目,而Outlook不会在我的后端更新

我想要一个可更新的“只读”属性,它可以为每个约会项目设置,并且不允许更改,除非设置为False…但我认为它不存在。有什么建议吗

我尝试过的或不作为解决方案的事情:

  • 提醒用户规则
  • 找到所有不匹配项的脚本-这可以工作,但不实用
  • 不允许编辑的自定义Outlook表单-不阻止用户拖动约会
更新: 利用下面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

你能连接到约会项目的写入事件中吗?您可以防止以这种方式进行更改。类似以下内容可能会起作用(免责声明未经测试):


你的问题是人们有写访问权,你能不能或者只能给他们读访问权?如果这是不可接受的,那么我的回答是,您不能或不应该阻止他们更改项目。你需要处理它。我就是这么做的

因此,当您创建日历项时,给它一个唯一的ID,例如来自后端表行的ID。将其添加到日历项的属性,如里程属性

现在只需创建一个更新方法,该方法循环遍历表中的所有当前日历项,并使用ID从outlook获取它们,检查它是否未更改,以及是否已更新表

并在下面给出您的评论


在我看来,你必须控制自己的前景。因此,nemmy走上了正确的道路,您可能需要使用outlook插件连接到outlook对象。然后,您需要获取用户打开的每个约会项目,并检查它是否有里程ID。如果有,您需要告诉他们在数据库中更改此项,而不是在outlook中,或者您需要获取指示约会项目更改的相关事件,并等待更改。然后将这些更改从outlook发送到您的数据库。

如果我只授予他们读取权限,则不允许他们通过access进行约会。我目前使用里程数作为唯一ID,并循环所有约会来更新它们-但是更新之间存在严重的延迟,因为让这个循环持续运行(尽管这是一个想法)是不切实际的。嗯,感谢更新。我想我有办法取消变更事件。您的解决方案将更完整地实现双向更改。不过,我的问题仍然是,当用户在日历上单击并拖动outlook约会对象时,设置outlook约会对象。不过,这可能需要一个新的SO问题。谢谢,我已经用你的建议更新了我的OP,但还是有点不对劲。问题在于只引用Items集合中的olappoints。否则,项目更改后会出现项目事件,但此时为时已晚。我已将此标记为正确答案,并针对我在拖动时遇到的问题发布了后续问题。否则,谢谢你引导我走上正确的道路。尝试查看PropertyChange事件。拖放AppointItem的开始/结束属性时,您可能会捕获这些属性的更改。感谢您的帮助。问题在于按照我上面的定义设置“appt”。我不知道如何在“选择了任何约会”时触发事件,而不仅仅是“此约会索引”。我可以为“任何项目”触发事件,但这些事件是有限的。如果我能弄明白的话,你最初提出的使用Appt_Write的建议将会非常有效。
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