2013-11-27 91 views
0

我不是VBA的專家,有一個我找不出來的錯誤,請你幫忙指教一下?從電子郵件複製到excel

我需要一個excel宏從一個文件夾中的所有電子郵件複製到我的excel,谷歌搜索,並找到下面的代碼。該代碼運行良好的一些電子郵件,之後將有一個運行時錯誤440:數組索引超出界限在這條線。

abody =斯普利特(objfolder.Items(I)。體,vbNewLine)

大多數時候,我只是記錄宏編輯從那裏,所以我真的不明白什麼是數組索引的界限。 真希望你能賜教,謝謝你這麼多提前爲您的幫助...... =) 的完整代碼可以在下面找到...


新增的部分,其中宏將獲取詳細信息正在處理的電子郵件......但令人困惑的是,收到的電子郵件的詳細信息與正文不匹配。任何人都可以請幫助建議?


Sub test() 

Dim olApp As Object 
Dim olNS As Object 
Dim olFldr As Object 
Dim olMail As Object 
Dim i As Integer 
Dim j As Long 
Dim abody() As String 
Dim Cnt As Long 
Dim arrData() As Variant 

Set olApp = CreateObject("Outlook.Application") 
Set olNS = olApp.GetNamespace("MAPI") 
Set olFldr = olNS.GetDefaultFolder(olFolderInbox).Folders("temp") 

Cnt = 0 
For Each olMail In olFldr.Items 
On Error GoTo errorhandler 
Cnt = Cnt + 1 

abody = Split(olFldr.Items(Cnt).Body, vbNewLine) 

For j = 0 To UBound(abody) 
Sheet1.Cells(65000, 1).End(xlUp).Offset(1, 0).Value = abody(j) 
Next 

ReDim Preserve arrData(1 To 1, 1 To Cnt) 
arrData(1, Cnt) = olMail.ReceivedTime 
Cells(1, 1).Value = arrData(1, Cnt) 

Cells(1, 1).NumberFormat = "dd/mm/yyyy hh:mm:ss AM/PM" 

olFldr.Items(Cnt).Move olNS.GetDefaultFolder(6).Folders("Processed") 

Next 

Set olApp = Nothing 
Set olNS = Nothing 
Set olFldr = Nothing 

errorhandler: 
Application.CutCopyMode = False 
Set olApp = Nothing 
Set olNS = Nothing 
Set olFldr = Nothing 
Exit Sub 

End Sub 

更新的代碼:

Sub test() 

Dim olApp As Object 
Dim olNS As Object 
Dim olFldr As Object 
Dim olMail As Object 
Dim i As Integer 
Dim j As Long 
Dim abody() As String 
Dim Cnt As Long 
Dim arrData() As Variant 
Dim ws As Worksheet 

Set olApp = CreateObject("Outlook.Application") 
Set olNS = olApp.GetNamespace("MAPI") 
Set olFldr = olNS.GetDefaultFolder(olFolderInbox).Folders("temp") 
Set ws = ThisWorkbook.Sheets("Sheet1") 

EmailCount = olFldr.Items.Count 

MsgBox "Number of emails in the folder: " & EmailCount, , "email count" 

Cnt = 1 
For Each olMail In olFldr.Items 

abody = Split(olMail.Body, vbNewLine) 

For j = 0 To UBound(abody) 
ws.Cells(65000, 1).End(xlUp).Offset(1, 0).Value = abody(j) 
Next 

ReDim Preserve arrData(1 To 1, 1 To Cnt) 
arrData(1, Cnt) = olMail.ReceivedTime 
ws.Cells(1, 1).Value = arrData(1, Cnt) 

ws.Cells(1, 1).NumberFormat = "dd/mm/yyyy hh:mm:ss AM/PM" 

olMail.Move olNS.GetDefaultFolder(6).Folders("Processed") 

Cnt = Cnt + 1 


Next 

Set olApp = Nothing 
Set olNS = Nothing 
Set olFldr = Nothing 

End Sub 
+0

我能想到的唯一問題是如果你遇到一個沒有主體的郵件,因此返回一個'Empty'數組。你可以嘗試添加一個斷點並檢查是否有一個「abody」爲空的實例? – L42

+0

也許不是'temp'文件夾中的所有內容都是郵件項目?在嘗試訪問'body'之前,可能需要檢查項目的類型 –

+0

大家好,感謝您的建議......我試圖添加一個斷點,但我仍然無法弄清楚該模式。由於此宏將電子郵件從文件夾temp移動到處理,奇怪的部分是如果我結束錯誤並重新運行宏,它將繼續移動電子郵件直到最後一個。我還注意到,在電子郵件移動之前,下面的abody是每次超出範圍的下標,但它是隨機的。任何人都可以提供建議? [Sheet1.Cells(65000,1).End(xlUp).Offset(1,0).Value = abody(j)] – Jan

回答

0

你可以嘗試你的循環部分改變了這一點。
同時爲目標工作表添加聲明和變量分配。

Dim ws as Worksheet 
Set ws = ThisWorkbook.Sheets("Sheet1") 'added this to avoid the subscript out of range 

Cnt = 1 
For Each olMail In olFldr.Items 
On Error GoTo errorhandler 

    abody = Split(olMail.Body, vbNewLine) 'changed this to olMail.Body since you are already iterating each mail 
    For j = 0 To UBound(abody) 
    ws.Cells(65000, 1).End(xlUp).Offset(1, 0).Value = abody(j) 'use the declared ws here 
    Next 

    ReDim Preserve arrData(1 To 1, 1 To Cnt) 
    arrData(1, Cnt) = olMail.ReceivedTime 
    ws.Cells(1, 1).Value = arrData(1, Cnt) 'use ws here as well if same Sheet1 
    ws.Cells(1, 1).NumberFormat = "dd/mm/yyyy hh:mm:ss AM/PM" 
    olMail.Move olNS.GetDefaultFolder(6).Folders("Processed") 'change to olMail as well 
    Cnt = Cnt + 1 
Next 

這是未經測試,所以我離開了測試給你。 :)

+0

嗨,非常感謝您的建議......我已經測試了出來,但它的工作正常,但宏不會處理文件夾中所有可用的電子郵件。電子郵件在宏中,但宏將結束而不處理所有,沒有錯誤。這太奇怪了,你有什麼想法嗎?無論如何,我已經包含在頂部的更新的代碼供您參考... =) – Jan

+0

np,很高興它的工作。所以到目前爲止我們解決了什麼問題?沒有下標?現在在'abody'上沒有錯誤?唯一的問題是它沒有得到所有的電子郵件?那是對的嗎?你怎麼知道它沒有得到所有?你爲什麼不把一個'Msgbox Cnt&oMail。主題'在你的循環中,這樣你就可以看到什麼郵件被處理,什麼不是。然後我們會幫你分析。現在,我看不到任何你的'循環'失敗的原因。 – L42

+0

Hihi,再次感謝......試過了,根本沒有錯誤,我也很困惑。電子郵件計數顯示5,但宏直到cnt = 3才停止。現在,我只需重新運行宏,直到所有電子郵件都移動到處理的文件夾。但出於好奇,任何想法爲什麼它的行爲如此?順便說一句,是電子郵件計數?如果是這樣,爲什麼當我們已經循環'For olMld In olFldr.Items'時,需要將cnt = 1?另外,ReDim保存arrData(1到1,1到Cnt)是什麼意思?對不起,很多問題,只是很好奇... = P – Jan

相關問題