Ошибка выполнения 438 при попытке запустить код VBA для повторяющихся писем в Oulook365 - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь написать код для поиска повторяющихся писем. Я нашел фрагмент в Интернете и попытался его использовать.

Он работает нормально в некоторых папках Outlook, а в некоторых выдает ошибку времени выполнения 438 . Поскольку я не разбираюсь в VBA, я не могу понять проблему.

Я получаю сообщение об ошибке в этой строке:

strKey = objItem.Subject & "," & objItem.Body & "," & objItem.SentOn

Можете ли вы дать мне совет, как исправить эту ошибку ?

Это код:

Sub RemoveDuplicateItems()
    Dim objFolder As Folder
    Dim objDictionary As Object
    Dim i As Long
    Dim objItem As Object
    Dim strKey As String

    Set objDictionary = CreateObject("scripting.dictionary")
    'Select a source folder
    Set objFolder = Outlook.Application.Session.PickFolder

    If Not (objFolder Is Nothing) Then
       For i = objFolder.Items.Count To 1 Step -1
           Set objItem = objFolder.Items.Item(i)

           Select Case objFolder.DefaultItemType
                  'Check email subject, body and sent time
                  Case olMailItem
                       strKey = objItem.Subject & "," & objItem.Body & "," & objItem.SentOn
                  'Check appointment subject, start time, duration, location and body
                  Case olAppointmentItem
                       strKey = objItem.Subject & "," & objItem.Start & "," & objItem.Duration & "," & objItem.Location & "," & objItem.Body
                  'Check contact full name and email address
                  Case olContactItem
                       strKey = objItem.FullName & "," & objItem.Email1Address & "," & objItem.Email2Address & "," & objItem.Email3Address
                  'Check task subject, start date, due date and body
                  Case olTaskItem
                       strKey = objItem.Subject & "," & objItem.StartDate & "," & objItem.DueDate & "," & objItem.Body
           End Select

           strKey = Replace(strKey, ", ", Chr(32))

           'Remove the duplicate items
           If objDictionary.Exists(strKey) = True Then
              objItem.Delete
           Else
              objDictionary.Add strKey, True
           End If
       Next i
    End If
End Sub

1 Ответ

1 голос
/ 05 мая 2020
Dim objItem As Object

Любой вызов члена, сделанный для этого objItem объекта, будет иметь позднее связывание. То есть решается во время выполнения. Это означает, что компилятор не знает, действительно ли objItem.Whatever или нет, и ему все равно (ура, позднее связывание!). К сожалению, это также означает, что он не может вам помочь, и если вы вызываете член, который VBA не может найти в этом объекте во время выполнения, именно тогда и как возникает ошибка 438 «не удается найти этот член».

Одним из решений может быть тщательный анализ участников, которым вы звоните, в какую ветвь Case.

Другим решением может быть переключение на раннее связывание , как только вы узнаете, какой тип вы имеете дело, и вернитесь к безопасности во время компиляции - имеется ссылка на библиотеку типов Outlook, компилятор уже знает, какие типы Outlook.

Кроме того, Select Case objFolder.DefaultItemType является постоянным для каждой итерации l oop, вы захотите это изменить. Используя TypeOf...Is, вы можете проверить тип среды выполнения объекта objItem по типам времени компиляции:

Select Case True
    Case TypeOf objItem Is Outlook.ContactItem
        '...

    Case TypeOf objItem Is Outlook.TaskItem
        '...

    Case TypeOf objItem Is Outlook.AppointmentItem
        '...

    Case TypeOf objItem Is Outlook.MailItem
        Dim currentMailItem As Outlook.MailItem
        Set currentMailItem = objItem '<~ cast the object to MailItem

        strKey = currentMailItem.Subject & "," & currentMailItem.Body & "," & currentMailItem.SentOn

... Я не очень знаком с объектной моделью Outlook, но похоже, что a Task также является MailItem, поэтому порядок предложений может быть важным (сначала проверьте более конкретные c типы, а затем более широкие всеобъемлющие типы).

...