在公共文件夹中迭代电子邮件时,随机查看VBA脚本运行时错误13

时间:2015-01-22 21:20:18

标签: outlook outlook-vba outlook-2003

我收到执行以下子程序的随机运行时错误13(类型不匹配)。这个例程大部分时间都有效。作为参数传入的文件夹在失败时是合法的。从我在调试器中看到的,objitem在运行时期间缺少一些字段。在调试器中断点之后,我可以立即单步执行(重新执行违规行)并且没有错误。

我尝试使用'on error goto'来休眠然后重试各行,错误一直持续到调试器停止为止。

我还尝试在For ii和For Each形式的循环命令之间进行切换。

我也被反病毒暂时禁用了。

我正在迭代大量的公共文件夹。我的Outlook客户端是在XP下运行的2003,我附加到Exchange服务器版本7654。

任何人都可以告诉我我没有做什么(或者我不能尝试的是什么)?

以下代码根据@dmitry建议修改,现在可以使用。

Sub SearchFolders(objFolder As Outlook.MAPIFolder)
    Dim objFolders As Outlook.Folders
    Dim subFolder As Outlook.MAPIFolder
    Dim Objitem As Outlook.MailItem
    Dim ii As Integer
    Dim ThisItem As Object
    Dim Items As Outlook.Items

' Recurse through all subfolders
    Set objFolders = objFolder.Folders
    For Each subFolder In objFolders
    Call SearchFolders(subFolder)
    Next subFolder

' Search the emails
    Set Items = objFolder.Items
    For ii = 1 To Items.Count
    Set ThisItem = Items.item(ii)
    If ThisItem.Class = olMail Then
        If VarType(ThisItem) = 9 Then GoTo NextdblLoop
        Set Objitem = ThisItem
        CheckEmailForErrorReports (objFolder.Items(ii))
        Set Objitem = Nothing
    End If
    Set ThisItem = Nothing
NextdblLoop:
    Next ii
    Set Items = Nothing
End Sub

1 个答案:

答案 0 :(得分:1)

首先,不要使用多点符号;在进入循环之前缓存Items集合。

其次,在完成变量后立即释放变量

    dim item As Object
    dim Items as Outlook.Items
    set Items = objFolder.Items
    For ii = 1 To Items.Count
        set item = Items.Item(ii)
        If item.Class = olMail Then
            If TypeName(item) <> "MailItem" Then
                'THIS CAN NEVER HAPPEN. The check above is sufficient
                MsgBox ("Type mismatch: object s/b MailItem and is " & TypeName(item))
                GoTo NextdblLoop
            End If
            Set objitem = item 
            CheckEmailForErrorReports (objitem)
            Set objitem = Nothing
        End If
        Set item = Nothing
NextdblLoop:
    Next ii
End Sub