【发布时间】:2018-01-11 07:30:45
【问题描述】:
我有这个函数循环遍历我的 Outlook 收件箱,如果有符合我设定条件的电子邮件,则返回 Boolean 作为最终结果。
即使条件错误,该函数也始终返回 true。我将.Sender 替换为xxxxxxx,它也返回True。
GetSMTPAddressForRecipients 来自 MSDN 仅将 Sub 更改为 Function GetSMTPAddressForRecipients(mail As Outlook.MailItem)
我做错了什么?
Function CheckInbox(ByVal fpemail As Variant) As Boolean
CheckInbox = False
Dim objOutlook As Object, objNamespace As Object, objFolder As Object
Dim EmailCount As Integer
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
On Error Resume Next
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)
Dim tdyDate As Date
Dim checkDate As Date
tdyDate = Format(Now(), "Short Date")
checkDate = DateAdd("d", -7, tdyDate) ' DateAdd(interval,number,date)
Dim iCount As Integer, DateCount As Integer
EmailCount = objFolder.Items.Count
DateCount = 0
' loop the mailbox
For iCount = 1 To EmailCount
'check for sender.email type first, mine is 'EX'
With objFolder.Items(iCount)
If DateSerial(Year(.ReceivedTime), Month(.ReceivedTime), Day(.ReceivedTime)) >= checkDate And _
DateSerial(Year(.ReceivedTime), Month(.ReceivedTime), Day(.ReceivedTime)) <= tdyDate And _
.Subject Like "Test Subject" And _
.Sender.GetExchangeUser.PrimarySmtpAddress = "xxxxxxx" And _
GetSMTPAddressForRecipients(.To) = fpemail Then
CheckInbox = True
Exit Function
Else
CheckInbox = False
End If
End With
Next iCount
Set objFolder = Nothing
Set objNamespace = Nothing
Set objOutlook = Nothing
End Function
【问题讨论】:
-
暂时删除
On Error Resume Next并告诉我们您在If语句中遇到的错误。 (如果If有错误,则下一条语句是CheckInbox = True。)您甚至可能在If之前出现错误,但您要让它继续运行,直到它遇到If,然后得到一个那里也有错误 - 可能是因为未设置对象或类似的东西。但在您删除错误屏蔽之前,我们无法轻易判断是什么。 -
@YowE3K 运行时错误 91 对象变量或未设置块变量,突出显示我的整个 IF 条件...
-
我的 猜测 是
objFolder.Items(iCount).Sender.GetExchangeUser.PrimarySmtpAddress失败了。在If之前添加一些额外的语句,说Dim xxxx As Object,然后是Set xxxx = .Sender,然后是Set xxxx = xxxx.GetExchangeUser,然后是Debug.Print xxxx.PrimarySmtpAddress。然后运行代码并查看它崩溃的那些。 (我对 Outlook VBA 了解的不够多,无法知道哪些对象无效,因此这将是一种简单的测试方法。) -
Debug.Print xxxx.PrimarySmtpAddress崩溃。 -
我刚刚搜索了您可能使用的
GetSMTPAddressForRecipients函数。我找到的代码以MailItem作为参数。你有没有修改它来接受一个字符串?如果不是,那将导致 object required 错误。 (您可能需要使用GetSMTPAddressForRecipients(objFolder.Items(iCount)) = fpemail Then,但没有看到您的代码,我无法确定。)
标签: excel vba function outlook