Имея Outlook, спросите меня, где сохранить отправленную электронную почту.Проблемы, когда пользователь отменяет - PullRequest
0 голосов
/ 09 июля 2019

Редактировать 2: Я обновил код, основываясь на комментариях Дмитрия Стребченко и Тима Уильямса.Спасибо вам обоим!Обновленный код ниже.Моя единственная проблема сейчас заключается в том, что когда я отменяю, он по-прежнему отправляет электронное письмо.


Редактировать: я обновил код на основе комментариев от Дмитрия Стребленченко.В результате Outlook больше не закрывается, когда я отменяю отправку электронной почты.Однако вместо того, чтобы возвращаться к электронному письму, оно все равно отправляет электронное письмо.


Я нашел некоторый код для макроса, который я использую, чтобы спросить, в какой папке сохранить электронное письмо.когда я нажимаю отправить.Когда я нажимаю кнопку «Отправить», открывается диалоговое окно с вопросом, где сохранить отправленное электронное письмо.

Однако, когда я решаю, что больше не хочу отправлять электронное письмо, и нажимаю «Отмена», а неВозвращаясь к электронной почте, я получаю сообщение об ошибке «IsInDefaultStore», которое гласит: «Эта функция не предназначена для работы с объектами Nothing и возвращает False».Затем, после нажатия OK в диалоговом окне, я получаю сообщение об ошибке:

Ошибка времени выполнения '91': переменная объекта или переменная блока не установлена ​​

Когда я нажимаю Отладка, подсвечиваются следующие строки

If Not objFolder Is Nothing And _
          IsInDefaultStore(objFolder) And _
          objFolder.DefaultItemType = olMailItem Then

Я бы хотел, чтобы макрос ничего не делал, когда нажимал Отмена.Например, если я осознаю, что после нажатия «Отправить», я хотел бы добавить что-либо к электронному письму, я бы хотел иметь возможность нажать «Отмена» в диалоговом окне с вопросом, где сохранить, и вернуться к редактированию моегоЭл. адрес.Я хотел бы, чтобы диалоговое окно снова появлялось, когда я нажимаю Отправить во второй раз.

Любая помощь будет оценена - спасибо!


Обновлен код, основанный на уже полученных комментариях:

Private Sub Application_ItemSend(ByVal Item As Object, _
                                 Cancel As Boolean)
    Dim objNS As NameSpace
    Dim objFolder As MAPIFolder

    Set objNS = Application.Session
    If (objFolder Is Nothing) Then Set objFolder = Application.Session.GetDefaultFolder(olFolderSentMail)
    Set Item.SaveSentMessageFolder = objFolder

If Item.Class = olMail Then
        Set objFolder = objNS.PickFolder
        If Not objFolder Is Nothing Then Exit Sub
    End If

    Set objFolder = Nothing
    Set objNS = Nothing
End Sub

Public Function IsInDefaultStore(objOL As Object) As Boolean
    Dim objApp As Outlook.Application
    Dim objNS As Outlook.NameSpace
    Dim objInbox As Outlook.MAPIFolder
    Dim blnBadObject As Boolean
    On Error Resume Next
    Set objApp = objOL.Application
    If Err = 0 Then
        Set objNS = objApp.Session
        Set objInbox = objNS.GetDefaultFolder(olFolderInbox)
        Select Case objOL.Class
            Case olFolder
                If objOL.StoreID = objInbox.StoreID Then
                    IsInDefaultStore = True
                Else
                    IsInDefaultStore = False
                End If
            Case olAppointment, olContact, olDistributionList, _
                 olJournal, olMail, olNote, olPost, olTask
                If objOL.Parent.StoreID = objInbox.StoreID Then
                    IsInDefaultStore = True
                Else
                    IsInDefaultStore = False
                End If
            Case Else
                blnBadObject = True
        End Select
    Else
        blnBadObject = True
    End If
    If blnBadObject Then
        MsgBox "This function isn't designed to work " & _
                "with " & TypeName(objOL) & _
                " objects and will return False.", _
                , "IsInDefaultStore"
        IsInDefaultStore = False
    End If
    Set objApp = Nothing
    Set objNS = Nothing
    Set objInbox = Nothing
End Function

Ответы [ 3 ]

0 голосов
/ 09 июля 2019

Вы можете упростить свой код:

Set objFolder = objNS.PickFolder
if (objFolder Is Nothing) Then set objFolder = Application.Session.GetDefaultFolder(olFolderSentMail)
Set Item.SaveSentMessageFolder = objFolder

И избавьтесь от утверждения On Error Resume Next - ничего хорошего из этого не выйдет.

0 голосов
/ 13 июля 2019

В ItemSend есть параметр Cancel.

Private Sub Application_ItemSend(ByVal Item As Object, _
                                 Cancel As Boolean)
    Dim objNS As NameSpace
    Dim objFolder As MAPIFolder

    Set objNS = Application.Session

    If Item.Class = olMail Then

        Set objFolder = objNS.PickFolder

        If Not objFolder Is Nothing Then
            Set Item.SaveSentMessageFolder = objFolder
        Else
            ' Cancel ItemSend
            ' Now you must choose the save folder on every mail sent.
            Cancel = True
        End If

    End If

    Set objFolder = Nothing
    Set objNS = Nothing

End Sub

Учитывая текущее состояние вашего вопроса, похоже, нет необходимости в функции IsInDefaultStore.

0 голосов
/ 09 июля 2019

Вам нужно что-то более похожее на это:

Set objFolder = objNS.PickFolder
If objFolder Is Nothing Then Exit Sub

If IsInDefaultStore(objFolder) And objFolder.DefaultItemType = olmailitem Then
    '...etc
    '...etc

And в VBA не закорачивает: все тесты выполняются, поэтому, даже если objFolder равно Nothing, исходная линия по-прежнему вызываетIsInDefaultStore(objFolder)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...