0

我正在使用 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
4

2 回答 2

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
于 2012-12-19T02:23:13.750 回答
0

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

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

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

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

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

于 2012-12-19T05:10:20.413 回答