outlook VBA 脚本 运行-在 public 文件夹中迭代电子邮件时随机出现错误 13
outlook VBA script run-time error 13 randomly while iterating emails in a public folder
我在执行以下子例程时收到随机 运行 时间错误 13(类型不匹配)。这个例程大部分时间都有效。作为参数传入的文件夹在失败时是合法的。从我在调试器中看到的情况来看,objitem 在 运行 时间内缺少一些字段。在调试器中断点后,我可以立即单步执行(重新执行违规行)并且没有错误。
我尝试使用 'on error goto' 休眠然后重试各种行,错误一直存在,直到它在调试器中停止。
我也尝试过在循环命令的 For ii 和 For Each 形式之间切换。
我也被杀毒暂时禁用了
我正在遍历大量 public 个文件夹。我的outlook客户端是XP下的2003运行ning,我挂的是Exchange server版本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
首先,不要使用多点符号;在进入循环之前缓存 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
我在执行以下子例程时收到随机 运行 时间错误 13(类型不匹配)。这个例程大部分时间都有效。作为参数传入的文件夹在失败时是合法的。从我在调试器中看到的情况来看,objitem 在 运行 时间内缺少一些字段。在调试器中断点后,我可以立即单步执行(重新执行违规行)并且没有错误。
我尝试使用 'on error goto' 休眠然后重试各种行,错误一直存在,直到它在调试器中停止。
我也尝试过在循环命令的 For ii 和 For Each 形式之间切换。
我也被杀毒暂时禁用了
我正在遍历大量 public 个文件夹。我的outlook客户端是XP下的2003运行ning,我挂的是Exchange server版本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
首先,不要使用多点符号;在进入循环之前缓存 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