【问题标题】:Make Outlook AppointmentItem Read-Only将 Outlook AppointmentItem 设为只读
【发布时间】:2012-12-19 02:00:06
【问题描述】:

我正在使用 MS Access 和 Outlook 对象模型中的 VBA 以编程方式创建 Outlook 约会项目(尽管语言应该无关紧要)。

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

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

我希望有一个可更新的“ReadOnly”属性,它可以为每个约会项目设置,并且除非设置回 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

【问题讨论】:

  • 尝试查看 PropertyChange 事件。当 AppointmentItem 的 Start / End 属性被拖放时,您可以捕获它们的变化。
  • 感谢您的帮助。问题在于我在上面定义的设置“appt”。我不知道如何在“选择任何约会”时触发事件,而不仅仅是“这个约会索引”。我可以为“任何项目”触发事件,但这些事件是有限的。如果我能弄清楚这一点,那么您最初使用 Appt_Write 的建议会很有效。

标签: vba ms-access outlook exchange-server


【解决方案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

【讨论】:

  • 谢谢,我已经用你的建议更新了我的 OP,但还是有点偏离。问题在于仅引用 Items 集合中的 OLAppointments。否则,在一个项目发生变化后会有一个项目事件,但到那时为时已晚。
  • 我已将此标记为正确答案,并针对我在拖动时遇到的麻烦发布了一个后续问题。否则,感谢您带领我走上正确的道路。 stackoverflow.com/q/14172866/1665654
【解决方案2】:

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

因此,当您创建日历项目时,请为其指定一个唯一 ID,例如后端表格行中的 ID。将此添加到日历项目的属性中,例如里程属性。

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

或者在下面给出您的评论;

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

【讨论】:

  • 如果我只给他们读取权限,他们就不能通过 Access 进行预约。我目前使用 Mileage 作为唯一 ID,并循环遍历所有约会以更新它们 - 但更新之间存在严重滞后,因为让这个循环持续运行是不切实际的(尽管这是一个想法)。
  • 嗯,感谢您的更新。我想我有一个取消更改事件的解决方案。您的解决方案在使更改双向工作方面会更加完整。我的问题仍然是,当用户一键选择并在日历上拖动它时设置 Outlook 约会对象。不过,这可能值得提出一个新的 SO 问题。
猜你喜欢
  • 2014-07-17
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多