VBA:错误438对象不支持此属性或方法

时间:2019-10-08 14:47:34

标签: excel vba email outlook

我试图在excel中运行宏波纹管,并在以下行If OutlookMail.ReceivedTime >= Range("From_date").Value Then上获取“错误438对象不支持此属性或方法”

有人可以帮助我吗?

P.S。我是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 个答案:

答案 0 :(得分:3)

一个明显的事实是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 :(得分:1)

错误438表示您正在尝试调用一个不存在的成员-该成员只能在运行时针对后期绑定的代码发生。

  

后期绑定??在代码实际运行之前(绑定成员时),VBA才知道eavesdrop='true'Variant的实际类型是什么。在运行时,它称为 late binding 。当成员在编译时绑定时,称为早期绑定。您希望将尽可能多的代码早期绑定,以便在编译时而不是在运行时拾取此类错误。

但是您引用的是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进行成员调用。