Перенаправление сильно удаленных элементов в Outlook на удаленные элементы с помощью VBA - PullRequest
0 голосов
/ 30 июня 2011

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

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

Может С.О. помочь?

Вот два обработчика событий:

    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 будет вызываться дважды без предложений Tims для предложения inProgress-if-claus ... и что действительно странно, это то, что во втором обработчике событий элемент перемещается в Черновики, а не в Удаленные элементы, но в oDeletedItems-Object не меняется между ... Есть идеи?

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

Ответы [ 2 ]

1 голос
/ 30 июня 2011

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

Application.EnableEvents=False

для временного отключения событий перед перемещением itam, но при проверке кажется, что в OutLook VBA такого нет. В качестве альтернативы можно использовать статическую переменную, чтобы пропустить событие Move.

Вставленный псевдокод:

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 голосов
/ 03 июля 2011

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

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

...