Ошибка выполнения 91, код работал раньше, а сейчас нет? - PullRequest
1 голос
/ 14 мая 2019

Мой код должен проверять мой почтовый ящик на наличие неоткрытых писем, содержащих файлы csv. Когда он встречает его, он должен загрузить его с новым именем и пометить письмо как прочитанное в новой папке.

Все работало вчера, и теперь я получаю ошибку времени выполнения 91.

Option Explicit

Sub SaveAttachments()
    Dim myOlapp         As Outlook.Application
    Dim myNameSpace     As Outlook.NameSpace
    Dim myFolder        As Outlook.MAPIFolder
    Dim myItem          As Outlook.MailItem
    Dim myAttachment    As Outlook.Attachment
    Dim avDate()        As String
    Dim vDate           As String
    Dim Address         As String
    Dim i               As Long
    Dim j               As Long
    Dim csvCount        As Long
    Dim myDestFolder    As Outlook.MAPIFolder

    Const myPath As String = "C:\Saved CSV\"
    ReDim Preserve avDate(3)

    Set myOlapp = CreateObject("Outlook.Application")
    Set myNameSpace = Application.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
    i = 0
    j = 0


    Set myDestFolder = myFolder.Parent.Folders("CSV Emails")

    For i = myFolder.Items.Count To 1 Step -1
        If TypeName(myFolder.Items(i)) = "MailItem" Then
            Set myItem = myFolder.Items(i)
        End If
        csvCount = 0

        If myItem.UnRead = True Then                                    'Run time error Here'
            avDate = Split(CStr(myItem.ReceivedTime), "/")
            vDate = Mid(avDate(2), 1, 4) & "-" & avDate(1) & "-" & avDate(0)


            If myItem.Attachments.Count <> 0 Then
                For Each myAttachment In myItem.Attachments
                    If LCase(Right(myAttachment.FileName, 3)) = "csv" Then
                        j = j + 1
                        csvCount = csvCount + 1

                        Dim recipientsItem As Object
                        Dim OldMessage As Outlook.MailItem
                        Set OldMessage = ActiveExplorer.Selection.Item(1)

                        For Each recipientsItem In OldMessage.Recipients
                            If OldMessage.SenderEmailType = "EX" Then
                                Address = OldMessage.Sender.GetExchangeUser.PrimarySmtpAddress
                            End If
                            If OldMessage.SenderEmailType = "SMTP" Then
                                Address = mymessage.SenderEmailAddress
                            End If
                        Next recipientsItem

                        myAttachment.SaveAsFile ((myPath) & "," & Address & "," & vDate & " - " & j & " - " & myAttachment.FileName)
                    End If
                Next myAttachment

                If csvCount > 0 Then
                    myItem.UnRead = False
                    myItem.Move myDestFolder
                End If
            End If
        End If
    Next i

SaveAttachments_exit:
  Set myAttachment = Nothing
  Set myItem = Nothing
  Set myNameSpace = Nothing
  Set OldMessage = Nothing
  Exit Sub

SaveAttachments_err:
  MsgBox "An unexpected error has occurred." _
    & vbCrLf & "Please note and report the following information." _
    & vbCrLf & "Macro Name: GetAttachments" _
    & vbCrLf & "Error Number: " & Err.Number _
    & vbCrLf & "Error Description: " & Err.Description _
    , vbCritical, "Error!"
  Resume SaveAttachments_exit


End Sub

Я получаю сообщение об ошибке

If myItem.UnRead = True Then

Вчера не было ошибки. Любая помощь будет оценена.

Я предполагаю, что это потому, что оператор set для myItem находится внутри цикла for и не устанавливается должным образом.

Для всех, кто интересуется, почему я ставлю запятые в имени файла, именно так я могу извлечь адрес электронной почты отправителей с помощью оператора -split в powershell.

1 Ответ

2 голосов
/ 14 мая 2019

Я подозреваю, что эта строка Set myItem = myFolder.Items(i) никогда не выполняется, и это приведет к тому, что ваша инструкция If не сможет получить доступ к свойству объекта.

Это может быть вызвано несколькими причинами:

  • Outlook не возвращает почту (Items.Count = 0)
  • Ваше If условие никогда не выполняется (TypeName(myFolder.Items(i)) никогда "MailItem")
  • Ваш почтовый ящик по умолчанию изменен и не содержит элементов MailBox.
  • Технические проблемы (т. Е. Не удается создать экземпляр Outlook, другая версия Office,и т. д.)

Обнаружение ошибки

Чтобы проверить, какая из этой проблемы может быть, я предлагаю вам запустить код в режиме отладки ивыполнение каждой инструкции пошагово (вы можете сделать это, нажав F8 ).

Продолжая выполнять код, проверьте значение ваших переменных (используяВаша Локальная переменная Окно).

Это может помочь вам лучше понять, что происходит сваш код, и может помочь найти причину проблемы.


Проверьте, не является ли объект ненулевым

В любом случае хорошей практикой является проверкаОбъект инициализируется перед попыткой доступа к нему.

Для этого вы можете добавить следующую инструкцию:

If Not myItem Is Nothing then
    If myItem.UnRead = True Then
        'rest of your code...

Надеюсь, это поможет.

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