Поиск текста в теле письма с InStr - PullRequest
0 голосов
/ 27 февраля 2020

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

Я получаю

"Класс не поддерживает автоматизацию или не поддерживает ожидаемый интерфейс
. "

Я использую ту же строку кода для работающего субъекта.

Часть моего кода:

    For Each obj_item In folder.Items
        If obj_item.Class = olMail Then

            Set obj_mail = obj_item

            ' If InStr(1, obj_mail.Subject, active_cell_value, vbTextCompare) > 0 Then

            If InStr(1, obj_mail.Body, active_cell_value, vbTextCompare) > 0 Then

                Application.StatusBar = row_number & " - " & folder.FolderPath

                On Error Resume Next
                Cells(row_number, 1) = obj_mail.EntryID
                Cells(row_number, 2) = folder.FolderPath
                Cells(row_number, 3) = obj_mail.ReceivedTime
                Cells(row_number, 4) = obj_mail.Sender
                Cells(row_number, 5) = obj_mail.Subject
                Cells(row_number, 6) = obj_mail.To
                On Error GoTo 0

                row_number = row_number + 1
                msgs_found_counter = msgs_found_counter + 1
            End If
        End If
    Next obj_item

Отредактировано: перемещено On Error Resume Next до For Each obj_item In folder.Items обернуть почти все

    On Error Resume Next
    For Each obj_item In folder.Items
        If obj_item.Class = olMail And obj_item.EntryID <> "" Then

            Set obj_mail = obj_item

            ' If InStr(1, obj_mail.Subject, active_cell_value, vbTextCompare) > 0 Then

            If InStr(1, obj_mail.Body, active_cell_value, vbTextCompare) > 0 Then

                Application.StatusBar = row_number & " - " & folder.FolderPath

                Cells(row_number, 1) = obj_mail.EntryID
                Cells(row_number, 2) = folder.FolderPath
                Cells(row_number, 3) = obj_mail.ReceivedTime
                Cells(row_number, 4) = obj_mail.Sender
                Cells(row_number, 5) = obj_mail.Subject
                Cells(row_number, 6) = obj_mail.To

                row_number = row_number + 1
                msgs_found_counter = msgs_found_counter + 1
            End If

        End If
    Next obj_item
    On Error GoTo 0

РЕЗУЛЬТАТ:

Screenshot of the result

1 Ответ

0 голосов
/ 29 февраля 2020

Размещение On Error Resume Next и On Error GoTo 0 вокруг всего блока редко (никогда?) Является хорошей идеей во время разработки или исследования. Они просто означают, что вы не знаете, какое утверждение вызывает ошибку, и ограничивает вашу способность выявлять и исправлять ошибку.

Судя по полученному изображению, первый элемент не имеет EntryID, * 1006. *, Recipients или Sender. Моей первой реакцией было то, что это был черновик, и эти свойства еще не были назначены. Я не нашел этот убедительный ответ, потому что, по моему опыту, свойства, которые не были инициализированы, имеют допустимые значения, такие как «» или 0. Затем я увидел «Отзыв» в теме. Я на пенсии и больше не являюсь корпоративным пользователем, но я помню, что электронные письма отзывались. Я не могу расследовать без доступа к этой функции. Однако, согласно документации, которую я могу найти, предмет будет ReportItem, а не MailItem. ReportItem имеет EntryId, но не имеет ReceivedTime, Recipients или Sender.

. Мое предложение:

Удалить On Error Resume Next и On Error GoTo 0 .

Добавьте что-то вроде:

If TypeOf obj_mail Is MailItem Then
    ' Output MailItem properties
ElseIf TypeOf obj_mail Is ReportItem Then
    ' Output ReportItem properties
Else
  ' Report unexpected item
End If

Если вы по-прежнему получаете ошибку, выполнение остановится в операторе, выдающем ошибку. Наведите указатель мыши на оператор, чтобы узнать, какой объект или свойство является причиной ошибки. Используйте Watch, чтобы исследовать этот объект и обнаружить, что не так, как вы ожидаете. Это должно позволить вам добавить код, который позволяет избежать ошибки; возможно, это другой тип предмета.

Если вы не можете избежать ошибки, попробуйте что-то вроде этого:

Dim ErrNum As Long
Dim ErrDesc As String
   : : : 
On Error Resume Next
Statement giving the error
ErrNum = Err.Number
ErrDesc = Err.Description
On Error GoTo 0 
If ErrNum <> 0 Then
  Code to handle, report or ignore error
Else
  Code to handle normal situation
End If

Примечание: по моему мнению, это правильный способ использования On Error Resume Next и On Error GoTo 0. Разместите их вокруг одного утверждения. Сохраните Err.Number в переменной, потому что On Error GoTo 0 очищает Err.Number. Проверьте ErrNum и примите соответствующие меры.

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