0

MSAccessのVBAとOutlookオブジェクトモデルを使用してプログラムでOutlookの予定項目を作成しています(言語は関係ありませんが)。

アイテムは、他のユーザーに読み取り/書き込み権限が付与されている単一のユーザーに属する複数のカレンダーに追加されます。ユーザーは、Outlookを使用してカレンダーで予定を作成または編集する理由はありません。その後、予定データはバックエンドテーブルに保存されます。基本的に、Outlookは私の「カレンダービュー」として使用されています。

ただし、ユーザーがOutlookで直接予定項目を変更すると、バックエンドで更新されないという大きな問題が発生します。

予定項目ごとに設定でき、Falseに戻さない限り変更を許可しない、更新可能な「ReadOnly」プロパティが欲しいのですが、存在するとは思わないでください。助言がありますか?

私が解決策として試した、または却下したこと:

  • ルールをユーザーに思い出させます。
  • 不一致のアイテムをすべて検出するスクリプト-これは機能しますが、実用的ではありません。
  • 編集を許可しないカスタム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 を付与します。これをマイレージ プロパティなどのカレンダー アイテムのプロパティに追加します。

テーブル内の現在のすべてのカレンダー アイテムをループして Outlook から ID を取得する update メソッドを作成し、変更されていないことを確認し、テーブルが更新されているかどうかを確認します。

または、以下のコメントを入力してください。

私の意見では、あなたは見通しをコントロールしなければなりません。そのような敵は正しい軌道に乗っているので、おそらく Outlook アドインを使用して Outlook オブジェクトにフックする必要があります。次に、ユーザーが開いた各予定項目を取得し、マイレージ ID があるかどうかを確認する必要があります。その場合は、Outlook ではなくデータベースでこれを変更するように指示するか、予定項目への変更を示す関連イベントを取得して、変更されるのを待つ必要があります。次に、これらの変更を Outlook からデータベースに送信します。

于 2012-12-19T05:10:20.413 に答える