2015-01-22 5 views
0

Я получаю случайную ошибку времени выполнения 13 (несоответствие типа), выполняющую следующую подпрограмму. Эта процедура работает большую часть времени. Папка, переданная в качестве аргумента, является легитимной во время сбоя. Из того, что я вижу в отладчике, objitem не хватает некоторых полей во время выполнения. После этого в отладчике точки прерывания, я могу сразу одношаговый (повторное выполнение строки нарушения), и нет ошибки.outlook Ошибка выполнения сценария VBA 13 случайным образом при повторении писем в общей папке

Я попытался использовать 'on error goto' для спящего режима, а затем повторить различные строки, и ошибка сохраняется до тех пор, пока она не остановится в отладчике.

Я также попытался изменить между формулами для ii и для каждой формы команд цикла.

Я также временно отключил антивирус.

Я повторяю большое количество общих папок. Мой клиент Outlook 2003 работает под XP, и я привязан к серверу 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

Во-первых, не следует использовать многоточечные обозначения; кешируйте коллекцию 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 
+0

Сценарий остановился неудачу случайно, и я смог отладить его с помощью изменения. Я нашел две особенности: 1) Нужно добавить 'Если VarType (ThisItem) = 9 Затем GoTo NextdblLoop' before 'Установить Objitem = ThisItem' 2) Необходим этот синтаксис для вызова подпрограммы: 'CheckEmailForErrorReports (objFolder.Items (ii)) ' – trindflo

 Смежные вопросы

  • Нет связанных вопросов^_^