vba - 在 Access VBA 中使用后期绑定循环通过 Outlook MailItems 时出错:未定义用户定义的类型
问题描述
我正在尝试过滤 Outlook 的已删除邮件文件夹,然后遍历所有符合条件的项目。
我正在使用后期绑定。我声明的方式有问题。
这是我的变量
Public OutlApp As Object
Public OutlNameSpace As Object
Public OutlMail As Object
Public OutlAttach As Object
Public OutlFolder As Object
Public OutlItem As Object
Public OutlMailItem As Object
Public OutlSenderLogin As String
Public OutlSenderName As String
Public OutlSenderEMail As String
Public OutlDateReceived As String
Public OutlDateSent As String
Public OutlSubject As String
Public OutlMsgBody As String
Public OutlSubjectCriteria1 As String
Public OutlSubjectCriteria2 As String
Public OutlSubjectCriteria3 As String
Public OutlSubjectCriteria4 As String
Public OutlFilter As String
Public OutlStartDate As String
Public OutlEndDate As String
Public OutlSentBy As String
Public OutlSentBy2 As String
Public OutlSentBy3 As String
我在“If TypeOf OutlFolder.Items(i) Is MailItem Then”处收到错误,粗体部分突出显示。
错误是“未定义用户定义的类型”。
Option Compare Database
Option Explicit
Const OutlFolderInbox As Integer = 6
Const OutlFolderIDeletedItems As Integer = 3
Public Function OutlookDeletedItems()
CurPath = CurrentProject.Path & "\"
Dim i, CountOfItems As Long
Dim EmailContTD, EmailContNew As String
Set OutlApp = GetObject(, "Outlook.application")
Set OutlNameSpace = OutlApp.GetNamespace("MAPI")
Set OutlFolder = OutlNameSpace.GetDefaultFolder(OutlFolderIDeletedItems)
Set OutlMail = GetObject(, "Outlook.MailItem")
OutlMyUTC = 7
OutlStartDate = Format(DateAdd("h", -OutlMyUTC, Date), "\'m/d/yyyy\") & " 12:00 AM'"
OutlSentBy = "hhh, fff" '
OutlSentBy2 = "fffff@service-now.com" '/
OutlSubjectCriteria1 = "blah *"
OutlSubjectCriteria2 = "blah"
OutlSubjectCriteria3 = "blah"
OutlFilter = "@SQL= ((urn:schemas:httpmail:sendername = '" & OutlSentBy & "' OR urn:schemas:httpmail:sendername = '" & OutlSentBy2 & "') And urn:schemas:httpmail:datereceived >= " & OutlStartDate & _
") AND (urn:schemas:httpmail:subject = '" & OutlSubjectCriteria3 & "' OR urn:schemas:httpmail:subject = '" & OutlSubjectCriteria2 & "' OR urn:schemas:httpmail:subject Like '" & OutlSubjectCriteria1 & "') "
CountOfItems = OutlFolder.Items.Restrict(OutlFilter).Count
If CountOfItems = 0 Then
Exit Function
End If
Set OutlMailItem = OutlFolder.Items.Restrict(OutlFilter)
With OutlItem
For i = CountOfItems To 1 Step -1
If TypeOf OutlFolder.Items(i) Is MailItem Then
Set OutlMailItem = OutlFolder.Items(i)
OutlDateReceived = OutlMailItem.ReceivedTime
OutlSubject = OutlMailItem.Subject
OutlMsgBody = OutlMailItem.Body
If OutlSubject Like OutlSubjectCriteria1 Then
EmailContTD = Replace(OutlMsgBody, Chr(34), "")
End If
If OutlSubject = OutlSubjectCriteria2 Then
EmailContNew = Replace(OutlMsgBody, Chr(34), "")
DoCmd.RunSQL "INSERT INTO SNNew ( Contents ) SELECT """ & EmailContNew & """ AS Expr1 FROM DUAL;"
End If
If OutlSubject = OutlSubjectCriteria3 Then
For Each OutlAttach In OutlItem.Attachments
OutlAttach.SaveAsFile CurPath & "_Load\MyTickets.xlsx"
Next OutlAttach
End If
End If
EmailContTD = ""
EmailContNew = ""
Next
End With
End Function
解决方案
If TypeOf OutlFolder.Items(i) Is MailItem Then
该类MailItem
没有定义,编译器没有说谎 - 您需要引用 Outlook 库(或以其他方式定义一个MailItem
类)才能编译该代码。
您可以使用该TypeName
函数进行后期绑定类型检查(注意,它不如编译时检查健壮):
If TypeName(OutlFolder.Items(i)) = "MailItem" Then
确保Option Explicit
也位于每个模块的顶部:后期绑定(显式或非显式)已经在运行时导致很多拼写错误(错误 438;尽可能选择早期绑定,然后编译器就能够接受)问题更早)。使用此选项,拼写错误不会成为Variant
可能产生奇怪的意外错误的即时值。
推荐阅读
- performance - Tensorflow CPU 性能 anaconda 与自定义构建(cmake,在 Windows 上)
- javascript - 像滚动行为一样聊天 (ReactJs)
- function - 将函数从 Typescript 中的另一个文件添加到类
- git - 无法添加要提交的文件
- spring - 如何使用带有弹簧数据的自定义分页对对象列表(未映射的域对象)进行分页
- mysql - 为日期范围查询正确优化 MySQL 数字数据?
- tensorflow - ValueError:检查目标时出错:预期dense_2具有形状(None,2)但得到形状为(321、3)的数组
- java - Jenkins 构建失败:无法创建 /var/lib/tomcat8/.m2
- flutter - 可以(应该?)堆栈将其大小扩展到其定位的孩子吗?
- phpstorm - 无法解析外部 Xdebug 连接的服务器名称