使Outlook AppointmentItem只读

时间:2012-12-19 02:00:06

标签: ms-access outlook exchange-server outlook-vba

我正在使用MS Access中的VBA和Outlook对象模型以编程方式创建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

2 个答案:

答案 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发送到您的数据库。