首页 > 解决方案 > 在 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

标签: vbams-access

解决方案


If TypeOf OutlFolder.Items(i) Is MailItem Then

该类MailItem没有定义,编译器没有说谎 - 您需要引用 Outlook 库(或以其他方式定义一个MailItem类)才能编译该代码。

您可以使用该TypeName函数进行后期绑定类型检查(注意,它不如编译时检查健壮):

If TypeName(OutlFolder.Items(i)) = "MailItem" Then

确保Option Explicit也位于每个模块的顶部:后期绑定(显式或非显式)已经在运行时导致很多拼写错误(错误 438;尽可能选择早期绑定,然后编译器就能够接受)问题更早)。使用此选项,拼写错误不会成为Variant可能产生奇怪的意外错误的即时值。


推荐阅读