2011-06-30 36 views
0

正如标题中所述,我正试图防止Outlook中的harddeleting项目。我能够捕捉BeforeItemMove事件中的操作。然后,用户可以选择是继续还是取消。如果他决定继续,则应将项目移至“已删除邮件”文件夹,而不是永久删除。使用VBA将Outlook中的硬删除项目重定向到已删除项目

我的第一个想法是取消删除操作,通过将取消设置为True,然后将项目移动到已删除邮件文件夹。问题是,事件再次为移动操作触发,但是交付的对象似乎以某种方式被破坏。我试着在删除的项目上设置一个UserProperty,然后移动它。但在事件子的“第二次运行”中,当我尝试读取prop时,发现运行时错误,指出无法找到消息。

S.O.帮帮我?

这里是所涉及的两个事件处理程序:

Private Sub oTasks_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As Folder, Cancel As Boolean) 

    Dim shouldDelete As Boolean 
    shouldDelete = False 

    Dim hardDeletePerformed 
    hardDeletePerformed = False 


    If (MoveTo Is Nothing) Then 
     shouldDelete = True 
     hardDeletePerformed = True 
    ElseIf (g_oNS.CompareEntryIDs(MoveTo.EntryID, oDeletedItems.EntryID)) Then 
     shouldDelete = True 
    End If 

    Dim oTask As TaskItem 
    Set oTask = Item 




    If shouldDelete Then 
     If (InStr(1, oTask.Subject, "frist", vbTextCompare)) Then 
      Dim message As String 
      message = "..." 
      Dim res As VbMsgBoxResult 

      res = MsgBox(message, vbOKOnly + vbCritical, "Compliance-Warnung!") 
      Cancel = True 
     Else 
      Dim message2 As String 
      message2 = "..." 

      Dim res2 As VbMsgBoxResult 

      res2 = MsgBox(message2, vbYesNo + vbCritical, "Compliance-Warnung!") 
      If (res2 = vbYes) Then 
       Cancel = False 
       If hardDeletePerformed Then 
        oTask.Move oDeletedItems 
        Cancel = True 
       End If 
      Else 
       Cancel = True 
      End If 
     End If 
    End If 
End Sub 

    Private Sub oAppointments_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As Folder, Cancel As Boolean) 


     If inProgress Then 
      Cancel = True 
      inProgress = False 
     Else 



     Dim shouldDelete As Boolean 
     shouldDelete = False 

     Dim hardDeletePerformed 
     hardDeletePerformed = False 


     If (MoveTo Is Nothing) Then 
      shouldDelete = True 
      hardDeletePerformed = True 
     ElseIf (g_oNS.CompareEntryIDs(MoveTo.EntryID, oDeletedItems.EntryID)) Then 
      shouldDelete = True 
     End If 

     Dim oAppointment As AppointmentItem 
     Set oAppointment = Item 


     If shouldDelete Then 
      If (InStr(1, oAppointment.Subject, "frist", vbTextCompare)) Then 
       Dim message As String 
       message = "..." 
       Dim res As VbMsgBoxResult 

       res = MsgBox(message, vbOKOnly + vbCritical, "Compliance-Warnung!") 
       Cancel = True 
      Else 
       Dim message2 As String 
       message2 = "..." 

       Dim res2 As VbMsgBoxResult 

       res2 = MsgBox(message2, vbYesNo + vbCritical, "Compliance-Warnung!") 
       If (res2 = vbYes) Then 
        Cancel = False 
        If hardDeletePerformed Then 
         inProgress = True 
         oAppointment.Move oDeletedItems 
         oAppointment.Save 
         'inProgress = False 
         Cancel = True 
        End If 
       Else 
        Cancel = True 
       End If 
      End If 
     End If 

     End If 

    End Sub 

奇怪的是,对于oTasks第一事件处理的工作正是我想要的方式运行。该项目被移至已删除的项目,并且该事件处理程序仅被调用一次。 oAppointments的第二个会被调用两次而没有Tim对inProgress-if-clause的建议......而真正奇怪的是,在第二个事件处理程序中,该项目被移动到草稿而不是删除项目,但是oDeletedItems-Object在两者之间没有改变...任何想法?我不喜欢VBA!

+0

总是有助于显示您的实际代码... –

回答

1

我会建议你使用

Application.EnableEvents=False 

你移动的ITAM之前暂时禁用事件,但检查它似乎有在Outlook VBA没有这样的事情。另一种方法是使用静态变量来允许跳过移动事件。

Intested伪代码:

Sub SomeEventHandler() 

    Static inProcess as Boolean 

    If inProcess then Exit Sub 

    If IsHardDelete then 
     inProcess = True 
     'move item 
     inProcess = False 
    End If 

End Sub 
+0

谢谢,这有一些调整工作。我不得不将inProgress = false移动到第一个if子句。看起来,事件处理者在开始新事物之前完成整个子事务。但仍然存在问题。出于某种原因,该项目被移动到草稿,而不是删除项目,尽管移动方法参数返回删除项目...另一个事件处理程序,具有完全相同的代码工作正常,即使没有inProgress部分它只被调用一次。 ..工作的是TaskItems和失败的AppointmentItems。任何想法如何可能? – Tobi

+0

我已将两个事件处理程序添加到原始问题 – Tobi

+0

对不起 - Outlook编程不是我的事情:我无法提供任何建议,为什么约会在草稿中结束 –

0

我认为调用oAppointment.SaveAppointmentItem保存到当前文件夹这大概是Drafts。先前调用oAppointment.Move oDeletedItems不会更改当前文件夹。

您确定需要保存oAppointment,因为您不在其他事件处理程序中保存oTask