我试图在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
答案 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
进行成员调用。