在Access VBA中使用后期绑定在Outlook邮件项目中循环时出错:未定义用户定义的类型
我正在尝试筛选Outlook的“已删除邮件”文件夹,然后遍历符合条件的所有邮件 我用的是后期装订。我的申报方式有问题 这是我的变量在Access VBA中使用后期绑定在Outlook邮件项目中循环时出错:未定义用户定义的类型,vba,ms-access,Vba,Ms Access,我正在尝试筛选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 OutlMai
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
如果TypeOf OutlFolder.Itemsi是MailItem,那么粗体部分将突出显示
错误为未定义的用户定义类型
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
MailItem类没有定义,编译器没有说谎-您需要引用Outlook库,或者为要编译的代码定义一个MailItem类
您可以将TypeName函数用于后期绑定类型检查注意,它不如编译时检查健壮:
If TypeName(OutlFolder.Items(i)) = "MailItem" Then
确保optionexplicit也位于每个模块的顶部:延迟绑定Explicit或not已经导致大量的输入错误,在运行时错误438时会将事情搞砸;只要有可能,编译器就可以更早地发现问题。使用此选项,打字错误将不会成为会产生奇怪的意外错误的动态变量值
MailItem类没有定义,编译器没有说谎-您需要引用Outlook库,或者为要编译的代码定义一个MailItem类
您可以将TypeName函数用于后期绑定类型检查注意,它不如编译时检查健壮:
If TypeName(OutlFolder.Items(i)) = "MailItem" Then
确保optionexplicit也位于每个模块的顶部:延迟绑定Explicit或not已经导致大量的输入错误,在运行时错误438时会将事情搞砸;只要有可能,编译器就可以更早地发现问题。使用此选项,打字错误将不会成为会产生奇怪的意外错误的动态变量值。为什么在代码01:36 PM'*/?错误,我的版本没有它。我在发帖前编辑过,删除了评论等,把事情搞砸了。是否立即编辑这些公共声明与函数在同一模块中?OutlFolderInbox被声明为Public和Const-I get冲突错误。你运行过Debug>Compile吗?它们在另一个版本中,但我已经用这种方式运行了很多函数,而且从来没有出现过问题。OutFOlderInbox被意外声明了两次,但我的在另一个模块中,所以它只使用这个模块中的一个。更新originalIf如果您显式延迟绑定为对象/变量,并且没有库引用来定义类型,那么编译器不知道它们的成员以及在该库中定义的类型-因此在编译时不定义TypeOf…Is表达式中的MailItem;如果没有对库的引用,就不能进行这种类型的检查。TypeName函数应该可以工作:如果TypeNameOutlFolder.Itemsi=MailItem,那么。确保指定了显式选项。为什么在代码01:36 PM'*/?错误,我的版本没有它。我在发帖前编辑过,删除了评论等,把事情搞砸了。是否立即编辑这些公共声明与函数在同一模块中?OutlFolderInbox被声明为Public和Const-I get冲突错误。你运行过Debug>Compile吗?它们在另一个版本中,但我已经用这种方式运行了很多函数,而且从来没有出现过问题。OutFOlderInbox被意外声明了两次,但我的在另一个模块中,所以它只使用这个模块中的一个。更新originalIf如果您显式延迟绑定为对象/变量,并且没有库引用来定义类型,那么编译器不知道它们的成员以及在该库中定义的类型-因此在编译时不定义TypeOf…Is表达式中的MailItem;如果没有对库的引用,就不能进行这种类型的检查。TypeName函数应该可以工作:如果TypeNameOutlFolder.Itemsi=MailItem,那么。确保指定了Option Explicit。我也更喜欢早期绑定,并且已经使用了多年,但现在我需要开始共享我的dbs,我遇到了不同版本的访问和错误问题。除了迟到,我找不到别的解决办法。至于optionexplicit,我一直都有它,至少它在运行之前清除了一些错误time@lalachka我一直在所有用户都有相同版本的环境中工作;我可以看出,如果您不需要使用受支持的最低版本开发解决方案,那么早期绑定可能会导致问题。您可以使用If-LATEBIND-Then条件编译语句/块,并使用Const定义模块作用域预编译器常量—您希望这些常量只是0或1的开关。您还可以在“项目属性”对话框中定义项目范围预编译器常量。对于较大/涉及的项目和/或取决于抽象的意义,包装所需库的功能是值得的,然后对包装器对象使用早期绑定调用,对包装的库对象进行后期绑定调用。@lalachka这是一个opt
ion-conditional编译在IMO中并不可取,但它可以让您尽早编写代码,并从尽可能多的编译时检查中获益,然后切换预编译器常量,删除所有库引用,并分发一个都是后期绑定的解决方案,并且可以正常工作。至于包装器,它只是一个抽象的问题:一个过程是对一堆低级事物的抽象,它们自己抽象其他低级事物,依此类推,直到它都是直接的1和0-一个类只是用来抽象事物。请看,我基本上包装了ADODB库=我也更喜欢早期绑定,并且已经使用了多年,但是现在我需要开始共享我的dbs,我遇到了不同版本的访问和错误问题。除了迟到,我找不到别的解决办法。至于optionexplicit,我一直都有它,至少它在运行之前清除了一些错误time@lalachka我一直在所有用户都有相同版本的环境中工作;我可以看出,如果您不需要使用受支持的最低版本开发解决方案,那么早期绑定可能会导致问题。您可以使用If-LATEBIND-Then条件编译语句/块,并使用Const定义模块作用域预编译器常量—您希望这些常量只是0或1的开关。您还可以在“项目属性”对话框中定义项目范围预编译器常量。对于较大/涉及的项目和/或取决于抽象的意义,包装所需库的功能是值得的,然后对包装器对象使用早期绑定调用,从而对包装的库对象进行后期绑定调用。@lalachka这是一个选项-在我看来,条件编译并不可取,但它使编写早期绑定的代码成为可能,并从尽可能多的编译时检查中获益,然后切换一个预编译器常量,删除所有库引用,并分发一个都是后期绑定的解决方案,并且可以正常工作。至于包装器,这只是一个抽象的问题:一个过程是对一堆低级事物的抽象,它们自己抽象其他低级事物,依此类推,直到它都是直起的1和0——一个类只是用来抽象事物。请看,我基本上在这里包装了ADODB库=