Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Access VBA中使用后期绑定在Outlook邮件项目中循环时出错:未定义用户定义的类型_Vba_Ms Access - Fatal编程技术网

在Access VBA中使用后期绑定在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

我正在尝试筛选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
如果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库=