2011-06-30 3 views
0

Как сказано в заголовке, я пытаюсь предотвратить жесткие элементы в Outlook. Я могу поймать операцию в событии BeforeItemMove. Затем пользователю предоставляется выбор: продолжать или отменять. Если он решит продолжить, элемент следует перенести в папку «Удаленные» и не удаляться навсегда.Перенаправление удаленных элементов в Outlook на удаленные элементы с помощью VBA

Моя первая идея состояла в том, чтобы отменить операцию удаления, установив Cancel to True, а затем перемещая элемент в папку «Удаленные». Проблема в том, что событие снова срабатывает для операции перемещения, но предмет предмета с ручным движением кажется каким-то образом сломан. Я попытался установить UserProperty на удаленный элемент, а затем переместил его. но в «втором запуске» события-sub, когда я пытаюсь прочитать prop, я получаю ошибку времени выполнения, заявив, что сообщение не может быть найдено.

Can 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 

Странная вещь, первый EventHandler для oTasks работает именно так, как я хочу его. Элемент перемещается на удаленные элементы, а обработчик событий вызывается только один раз. второй для oAppointments будет вызываться дважды без предложений Tims для предложения inProgress-if ... и что действительно странно, что во втором обработчике событий элемент перемещается в черновики, а не в удаленные элементы, но объект oDeletedItems-Object не меняется между ... Любые идеи?

PS: Я ненавижу VBA!

+0

Всегда помогает показать ваш фактический код ... –

ответ

1

Я собирался предложить вам использовать

Application.EnableEvents=False 

временно отключить события, прежде чем переехал ИТПМ, но на проверку, кажется, нет такой вещи в OutLook VBA. Альтернативой было бы использование статической переменной, позволяющей пропускать событие Move.

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-предложение. Похоже, что обработчик событий завершает весь подраздел, прежде чем запускать новый. но проблема все еще остается. По какой-то причине элемент перемещается в черновики, а не удаляемые элементы dispite аргумент move-methods возвращает удаленные элементы ... другой обработчик событий, с точно таким же кодом работает нормально, даже без inProgress-part он получает только один раз. .. рабочий для TaskItems, а неудача - для AppointmentItems. Любая идея, как это могло быть? – Tobi

+0

Я добавил два обработчика событий, связанных с исходным вопросом. – Tobi

+0

Извините. Перспективы программирования не являются моей задачей: я не могу предложить никаких предложений о том, почему назначение заканчивается в черновиках –

0

Я думаю, что вызов oAppointment.Save сохранит AppointmentItem к текущей папке, которая предположительно является Drafts. Предыдущий вызов oAppointment.Move oDeletedItems не изменяет текущую папку.

Вы уверены, что вам нужно сэкономить oAppointment, потому что вы не можете сохранить oTask в другом обработчике событий?