【问题标题】:Run-time Error '13' MisMatch message when assigning an object to a variable declared as a mailitem将对象分配给声明为邮件项的变量时出现运行时错误“13”错误匹配消息
【发布时间】:2020-10-27 19:24:04
【问题描述】:

我在 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

这应该是所有相关的 DIM 语句。

Public myNameSpace As NameSpace
Public myInbox As MAPIFolder
Public myDest As MAPIFolder
Public myEmail As MailItem
Public myEmails As Integer
Public myCount As Integer
Public myAtmt As Attachment
Public myAtmtNo As Integer
Public mySender As String
Public myRecip As Outlook.Recipient
Public mySubFolders As Outlook.Folders
Public mySubFolder As MAPIFolder
Public mySubFolder1 As MAPIFolder
Public mySubFolder2 As MAPIFolder
Public mySubFolder3 As MAPIFolder
Public myNS As NameSpace
Public myTestFolder As Outlook.Folder
Public myFoldersArray As Variant
Public myLoopIndex As Integer
Public myOlApp As Outlook.Application
Public myOlTsk As TaskItem
Public myNoOfEMails As Long

【问题讨论】:

  • 您将myEmail 声明为什么?您很可能正在处理不是MailItem 的项目...并非所有项目都是电子邮件,即参见this
  • Dim 语句在哪里?你有Option Explicit。请将这些语句添加到您问题中的代码中
  • 感谢 BigBen,它设置为“Public myEmail As MailItem”,到目前为止,我注意到 NoReply@Tesco.com、hello@news.monese.com 和 reply@ 这样的事情正在发生e.seetickets.com,但所有这些都已经在我的收件箱中很久了,并且必须通过此代码数千次!如果我收到读取通知,它总是会崩溃,但只有那些,没有别的......

标签: vba outlook


【解决方案1】:

尝试使用If TypeName(myInbox.Items(myCount)) = "MailItem" Then 测试类型,看看它是否有效:

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

编辑:对 cme​​ts 的跟进

添加Else 子句,例如:

    If TypeName(myInbox.Items(myCount)) = "MailItem" Then
        Set myEmail = myInbox.Items(myCount) '**<<< Error occurs on this line <<<**
        '... the rest of the code
    
    Else
        Debug.Print TypeName(myInbox.Items(myCount))
        '... Some other prints here
    End if

【讨论】:

  • 这似乎行得通,谢谢,但为什么突然开始发生这种情况,代码已经快乐运行多年没有那行或这个问题?!?!?
  • 我只能推测,但有可能其他一些代码会保存其他类型的Items 用于存档目的,因此很可能在收件箱文件夹中保存非MailItem。尝试遍历收件箱,直到找到非MailItem 并在 msgbox 中显示它的一些属性。这可能会导致您找到问题的根源。
【解决方案2】:

一个 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/FindNextRestrict 方法来获取仅与您的条件相对应的项目集合。在以下文章中详细了解这些方法:

【讨论】:

  • 谢谢,我刚刚接受了 Super Symmetry 的类似答案,但你给出了相同的基本原因......但是,正如我问他的那样,为什么当这段代码有这个问题时会突然出现这个问题多年来一直工作正常?!?我也会查看循环,因为我的收件箱会变得非常大,谢谢 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多