VBA: объект ошибки 438 не поддерживает это свойство или метод - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь запустить приведенный ниже макрос в Excel и получаю «Ошибка 438 объект не поддерживает это свойство или метод» в следующей строке If OutlookMail.ReceivedTime >= Range("From_date").Value Then

Может кто-нибудь мне помочь?

PS Я новичок в VBA, поэтому стараюсь шаг за шагом разобраться

Option Explicit

Sub getDataFromOutlook()

    Dim OutlookApp As Outlook.Application
    Dim OutlookNamespace As Namespace
    Dim Folder As MAPIFolder
    Dim OutlookMail As Variant
    Dim objOwner As Outlook.Recipient
    Dim i As Integer

    Set OutlookApp = New Outlook.Application

    Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")

    Set objOwner = OutlookNamespace.CreateRecipient("SharedMailboxaddres@companyname.com")
objOwner.Resolve

    If objOwner.Resolved Then
        Set Folder = OutlookNamespace.GetSharedDefaultFolder(objOwner, olFolderInbox)
    End If


    i = 1

    For Each OutlookMail In Folder.Items
        If OutlookMail.ReceivedTime >= Range("From_date").Value Then
            Range("eMail_sender").Offset(i, 0).Value = OutlookMail.SenderName
            Range("eMail_subject").Offset(i, 0).Value = OutlookMail.Subject
            Range("eMail_date").Offset(i, 0).Value = OutlookMail.ReceivedTime
            Range("eMail_categories").Offset(i, 0).Value = OutlookMail.Categories
            Range("eMail_flag_status").Offset(i, 0) = OutlookMail.FlagStatus

            i = i + 1
        End If
    Next OutlookMail

    Set Folder = Nothing
    Set OutlookNamespace = Nothing
    Set OutlookApp = Nothing

End Sub

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Очевидным фактом является то, что папки Outlook могут содержать элементы различного типа, поэтому не каждый тип предоставляет свойство ReceivedTime:

For Each OutlookMail In Folder.Items
    If OutlookMail.ReceivedTime >= Range("From_date").Value Then

Прежде чем получить доступ к какому-либо свойству, необходимо проверить тип элементаспособ убедиться, что такой элемент существует для элемента:

For Each OutlookMail In Folder.Items
   If TypeOf OutlookMail Is MailItem Then
      If OutlookMail.ReceivedTime >= Range("From_date").Value Then
1 голос
/ 08 октября 2019

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

Поздняя привязка? VBA не может знать, каким будет действительный тип Variant или Object до тех пор, пока код фактически не будет запущен - когда члены связаны во время выполнения, это называется поздняя привязка . Когда члены связаны во время компиляции, это называется раннее связывание . Вы хотите, чтобы большая часть вашего кода была связана с ранними данными, чтобы вы могли обнаружить такие ошибки во время компиляции, а не во время выполнения.

Но вы ссылаетесь на библиотеку Outlook- у вас нет веской причины для позднего связывания чего-либо здесь.

Folder.Items содержит много типов объектов: переменная OutlookMail имеет очень вводящее в заблуждение имя:

For Each OutlookMail In Folder.Items

Лучшее имяможет быть folderItem или unknownItem - потому что мы знаем, что это что-то в папке, но мы не знаем, какой это тип объекта. Все, что мы знаем об этом, это то, что это Object:

Dim unknownItem As Object
For Each unknownItem In Folder.Items

Теперь, если тип unknkownItem равен Outlook.MailItem, мы можем привести к этому интерфейсу:

    Dim emailItem As Outlook.MailItem
    If TypeOf unknownItem Is Outlook.MailItem Then
        Set emailItem = unknownItem

И теперь каждый отдельный вызов участника, который мы делаем против emailItem, будет проверяться во время компиляции, а не во время выполнения, потому что мы знаем , что внутри этого условного блока мысмотрите на MailItem объект.

        Sheet1.Range("eMail_sender").Offset(i, 0).Value = emailItem.SenderName

Обратите внимание, что SenderName будет в списке имен, когда вы наберете . точку: вот как вы знаете, что вы делаете рановызов связанного члена.

Избегайте неявного позднего связывания везде, где вы можете - это означает работу с объектными переменными, которые имеют явный объявленный тип, и избегание вызовов членов против Variant и Object.

...