2013-06-24 81 views
0

我想知道你們是否可以幫助我。我們最近從Outlook 2003遷移到2010年。我們使用Outlook VBA腳本來接收特定的傳入電子郵件表單,通讀它們,提取信息並將其編譯到文件中。VBA For Loop未按預期工作

腳本可以工作,但它只能讀取文件夾中一半的消息。我對文件夾進行了計數測試,並且顯示了正確的數字,但由於某種原因,我使用的for循環僅對一半的項目執行。因此,如果文件夾中有8條消息,那麼它只能讀取其中的4條消息,如果有4條消息,則只讀取2條消息,等等......

我弄不清楚我的代碼的哪一部分是在轟炸。任何幫助將不勝感激。我只發佈了我的代碼的for循環部分。如果你需要整個腳本,請告訴我。

enter code here Set myOlApp = CreateObject("Outlook.Application") 'Outlook App Obj. 
Set myNameSpace = myOlApp.GetNamespace("MAPI") 'MAPI Namespace 
Set myFolder = myNameSpace.Folders("[email protected]").Folders("TestAccMail") 'Outlook folder to access 

For Each Item In myFolder.Items 'Loop through each mail item 
    If (regex.Test(Item.Subject)) Then 'Test for TestAccX Message 
     strDataSplit = Split(Item.Body, vbNewLine) 'Split the contents of the body to an array 
     strOutput = "" 
     For Each arrItem In strDataSplit 'Loop through the contents of the e-mail body 
      If (regExData.Test(arrItem)) Then 'Test if line contains a field we need 
       field = Split(arrItem, ":")(1) 'Store the value of the field 
       strOutput = strOutput & Trim(Replace(field, Chr(160), "")) & "|" 'Concat the previous field value with current; seperated by | 
      End If 
     Next arrItem 'Next field in array 

     If Not strOutput = "" Then 'Ensure the output var has data 
      WriteToATextFile strOutput, file 'Append the data record to the provided file 
      Item.Move myFolder.Folders("TestAcc Complete") 'Move mail item to completed folder 
      recCount = recCount + 1 
     Else 'If the string is blank, no data was extracted; Error! 
      Item.Move myFolder.Folders("Errors") 'Move mail item to Error folder 
      errCount = errCount + 1 'Incremeant error count 
     End If 
     messCount = messCount + 1 'Incremeant message count, error or not 
    End If 
Next 'Next TestAccX Message 
+0

你在這之前有一個錯誤的繼續嗎? for循環執行正確的次數?如果是這樣,你添加了代碼來查看它是否導致失敗的正則表達式或strOutput? –

+0

亞歷克斯 - 我正在使用「On Error GoTo outlookerror:」,所以如果發生錯誤,我會收到通知。另外,For循環只執行一半的時間。我把它放在調試模式中,並遍歷所有的代碼。沒有發生錯誤,循環只執行了它應該有的一半時間。 – user2516507

+1

好吧,您爲folder.items中的每個項目編寫了代碼,然後將該項目移動到其他文件夾,這當然是一種不好的做法。例如,你是第一個項目,你移動它。您現在將轉到第二個項目,但由於您已經移動了第一個項目,所以第二個項目獲取第一個索引,但是您已經移動到第二個索引,因此它忽略了第一個項目。無論何時處理收集,都要使用反向循環,因此即使您從收集中移動項目,也不會更改剩餘項目的索引。對不起,如果我的語言不清楚。 – Vikas

回答

1

我不知道VBA如何處理收藏品,但是當你從集合中,你實際上是「跳躍過的」 MyFolder中移動項目我猜。適當的語言不會允許您更改每個循環正在處理的集合。

+0

Janne - 你說得對!看來其他代碼的「Item.Move myFolder.Folders ..」部分在這裏是@ fault。我評論它,它讀取每條消息。 – user2516507

+0

你有什麼建議可以替代嗎? – user2516507

+0

改爲使用Do.While循環 –