Vba 运行时错误';13';将对象分配给声明为mailitem的变量时消息不匹配

Vba 运行时错误';13';将对象分配给声明为mailitem的变量时消息不匹配,vba,outlook,Vba,Outlook,我在Outlook 2016 Pro Plus中有运行多年的VBA代码 突然之间,几乎每次发送和接收邮件时,我都会在Set myEmail=上收到一个错误 Option Explicit Option Base 1 Option Compare Text Sub MyRules() Set myNameSpace = GetNamespace("MAPI") Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)

我在Outlook 2016 Pro Plus中有运行多年的VBA代码

突然之间,几乎每次发送和接收邮件时,我都会在
Set myEmail=
上收到一个错误

Option Explicit
Option Base 1
Option Compare Text

Sub MyRules()

Set myNameSpace = GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)

myEmails = myInbox.Items.Count

For myCount = myEmails To 1 Step -1
    Set myEmail = myInbox.Items(myCount) '**<<< Error occurs on this line <<<**
    Select Case myEmail.SenderEmailAddress
        Case Is = "aaa@gmail.com", "bbb@btinternet.com", "ccc@gmail.com"
            mySender = "Cxxxxx Dxxxxxx"
        Case Else
            mySender = myEmail.SenderEmailAddress
    End Select
    Select Case mySender
        Case Is = ""
            If myEmail.Subject = "" Then
                myEmail.UnRead = False
                myEmail.Delete
                GoTo Next_EMail
            End If

尝试使用
测试类型,如果TypeName(myInbox.Items(myCount))=“MailItem”,然后使用
检查它是否有效:

Option Explicit
Option Base 1
Option Compare Text

Sub MyRules()

Set myNameSpace = GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)

myEmails = myInbox.Items.Count

For myCount = myEmails To 1 Step -1
    If TypeName(myInbox.Items(myCount)) = "MailItem" Then
        Set myEmail = myInbox.Items(myCount) '**<<< Error occurs on this line <<<**
        Select Case myEmail.SenderEmailAddress
            Case Is = "aaa@gmail.com", "bbb@btinternet.com", "ccc@gmail.com"
                mySender = "Cxxxxx Dxxxxxx"
            Case Else
                mySender = myEmail.SenderEmailAddress
        End Select
        Select Case mySender
            Case Is = ""
                If myEmail.Subject = "" Then
                    myEmail.UnRead = False
                    myEmail.Delete
                    GoTo Next_EMail
                End If

尝试使用
测试类型,如果TypeName(myInbox.Items(myCount))=“MailItem”,然后使用
检查它是否有效:

Option Explicit
Option Base 1
Option Compare Text

Sub MyRules()

Set myNameSpace = GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)

myEmails = myInbox.Items.Count

For myCount = myEmails To 1 Step -1
    If TypeName(myInbox.Items(myCount)) = "MailItem" Then
        Set myEmail = myInbox.Items(myCount) '**<<< Error occurs on this line <<<**
        Select Case myEmail.SenderEmailAddress
            Case Is = "aaa@gmail.com", "bbb@btinternet.com", "ccc@gmail.com"
                mySender = "Cxxxxx Dxxxxxx"
            Case Else
                mySender = myEmail.SenderEmailAddress
        End Select
        Select Case mySender
            Case Is = ""
                If myEmail.Subject = "" Then
                    myEmail.UnRead = False
                    myEmail.Delete
                    GoTo Next_EMail
                End If

Outlook文件夹可能包含不同类型的项目。因此,您需要首先签出项目类型(或消息类)。例如:

Dim obj As Object

If TypeName(obj) = "MailItem" Then
  ' your code for mail items here
End If
另外,我注意到代码中有以下循环:

For myCount = myEmails To 1 Step -1
迭代收件箱文件夹中的所有项目并不是一个好主意。相反,我建议使用
Items
类的
Find
/
FindNext
Restrict
方法来获取仅对应于您的条件的项目集合。请在以下文章中阅读有关这些方法的更多信息:


Outlook文件夹可能包含不同类型的项目。因此,您需要首先签出项目类型(或消息类)。例如:

Dim obj As Object

If TypeName(obj) = "MailItem" Then
  ' your code for mail items here
End If
另外,我注意到代码中有以下循环:

For myCount = myEmails To 1 Step -1
迭代收件箱文件夹中的所有项目并不是一个好主意。相反,我建议使用
Items
类的
Find
/
FindNext
Restrict
方法来获取仅对应于您的条件的项目集合。请在以下文章中阅读有关这些方法的更多信息:


您将myEmail声明为什么?很可能您正在处理的项目不是
邮件项目
。。。并非所有项目都是电子邮件,也就是说,请参阅。
Dim
语句在哪里?您有显式
选项。请将这些语句添加到您的问题的代码中谢谢BigBen,它设置为“Public myEmail As MailItem”,到目前为止,我已经注意到这种情况正在发生,例如NoReply@Tesco.com, hello@news.monese.com & reply@e.seetickets.com,但所有这些都已经在我的收件箱里很久了,并且一定已经通过了这个代码数千次了!!!如果我收到读取通知,它总是会崩溃,但只有那些,没有其他…你声明myEmail作为什么?很可能您正在处理的项目不是
邮件项目
。。。并非所有项目都是电子邮件,也就是说,请参阅。
Dim
语句在哪里?您有显式
选项。请将这些语句添加到您的问题的代码中谢谢BigBen,它设置为“Public myEmail As MailItem”,到目前为止,我已经注意到这种情况正在发生,例如NoReply@Tesco.com, hello@news.monese.com & reply@e.seetickets.com,但所有这些都已经在我的收件箱里很久了,并且一定已经通过了这个代码数千次了!!!如果我收到读取通知,它总是会崩溃,但只有那些,没有其他…这似乎是可行的,谢谢你,但为什么突然发生这种情况,代码已经在没有这行或这个问题的情况下愉快地运行了多年?!?!?我只能推测,但也有可能是其他一些代码保存了其他类型的
项目
s以用于存档,因此可能会将非
邮件项目
保存在收件箱文件夹中。尝试在收件箱中循环,直到找到一个非
邮件项,并在msgbox中显示它的一些属性。这可能会引导您找到问题的根源。这似乎是可行的,谢谢,但为什么突然发生了这种情况,代码已经在没有这行代码或这个问题的情况下愉快地运行了多年?!?!?我只能推测,但也有可能是其他一些代码保存了其他类型的
项目
s以用于存档,因此可能会将非
邮件项目
保存在收件箱文件夹中。尝试在收件箱中循环,直到找到一个非
邮件项,并在msgbox中显示它的一些属性。这可能会让你找到问题的根源。谢谢你,我刚刚接受了Super Symmetry的类似答案,但你的答案给出了相同的基本原因。。。然而,正如我问过他的,为什么这个问题会突然出现,而这个代码已经正常工作了很多年?!?我还将研究循环,因为我的收件箱可能会变得非常大,谢谢:-)谢谢,我刚刚接受了Super Symmetry的类似答案,但你的答案给出了相同的基本原因。。。然而,正如我问过他的,为什么这个问题会突然出现,而这个代码已经正常工作了很多年?!?我还将研究循环,因为我的收件箱可能会变得非常大,谢谢:-)