我收到执行以下子程序的随机运行时错误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
答案 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