2012-12-09 50 views
1

請參閱下面的代碼。我編寫的子程序應該查看所有今天剛剛發佈的電子郵件,並只移動那些主題爲「每日統計」的電子郵件。我故意發送兩封電子郵件給自己,主題爲「每日統計」。收件箱中還有一封其他電子郵件沒有相應的主題。總共有三封電子郵件。當Sub MoveHarpStatMail運行時,它僅移動其中一個具有主題「每日統計」的正確電子郵件。另一個似乎被忽略。我的過濾器弦有什麼扭曲嗎?我在另一個子程序中使用了完全相同的過濾器字符串,它在那裏工作得非常好,閱讀了今天發佈的所有電子郵件。我想我需要另一雙眼睛來指出我出錯的地方。未讀取收件箱中的所有郵件項目

艾倫

Public StatsArchiveFolder As Outlook.Folder 
'StatsArchiveFolder is set elsewhere in another subroutine 
Public Const SubjectTitle As String = "daily stats" 
_______________________________________________ 

Sub MoveHarpStatMail() 

Dim olapp As Outlook.Application 
Dim olappns As Outlook.NameSpace 
Dim oitem As Object 
Dim ItemsToProcess As Outlook.Items 
Dim myFolder As MAPIFolder 
Dim sFilter As String 
Dim tempMailItem As Outlook.MailItem 

On Error GoTo LocalErr 

'set outlook objects 

Set olapp = New Outlook.Application 
Set olappns = olapp.GetNamespace("MAPI") 
Set myFolder = olappns.GetDefaultFolder(olFolderInbox) 
'Filter for only MailItems received today 
sFilter = "[ReceivedTime] >= " & AddQuotes(Format(Date, "ddddd")) 
Set ItemsToProcess = Session.GetDefaultFolder(olFolderInbox).Items.Restrict(sFilter) 

For Each oitem In ItemsToProcess 
If TypeName(oitem) = "MailItem" Then 
    Set tempMailItem = oitem 
    Debug.Print tempMailItem.Subject 
    If CheckSubject(tempMailItem.Subject) Then 
    MoveToArchiveFolder tempMailItem 
    End If 
End If 
Next oitem 

ExitProc: 
Set olapp = Nothing 
Set olappns = Nothing 
Set myFolder = Nothing 
Set ItemsToProcess = Nothing 

Exit Sub 

LocalErr: 
    If Err.Number <> 0 Then 
    Msg = "Sub MoveHarpStatMail" & vbCrLf & "Error # " & Str(Err.Number) & " was generated by " _ 
     & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description 
    MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext 
    End If 
End Sub 

____________________________________________ 

Private Function AddQuotes(MyText) As String 
    AddQuotes = Chr(34) & MyText & Chr(34) 
End Function 

_______________________________________________ 

Sub MoveToArchiveFolder(Item As Outlook.MailItem) 

    If StatsArchiveFolder Is Nothing Then 
     MsgBox ("The ArchiveFolder object is not set.") 
    End If 

    Item.Move StatsArchiveFolder 

End Sub 
________________________________________________ 

Function CheckSubject(Subject As String) As Boolean 

    If LCase(Trim(Subject)) = LCase(Trim(SubjectTitle)) Then 
    CheckSubject = True 
    Else 
    CheckSubject = False 
    End If 

End Function 
+0

你好!你是否檢查過'ItemsToProcess'中有多少物品,以及哪些物品?還有你檢查哪些傳遞給'MoveToArchiveFolder'?一般來說,您需要使用F8逐步完成代碼並/或添加更多'Debug.Print'語句。另外,我想知道如果你只是將oitem傳遞給'MoveToArchiveFolder',它會不會更好地工作?我真的不需要'tempMailItem'。 –

+0

您有一個初始化但不使用的變量。即myFolder。嘗試將'Set ItemsToProcess = Session.GetDefaultFolder(olFolderInbox).Items.Restrict(sFilter)'更改爲'Set ItemsToProcess = myFolder.Items.Restrict(sFilter)' – deusxmach1na

+0

使用debug.print語句的建議對確實有幫助。如果我用一個debug.print語句替換對MoveToArchiveFoler的調用,那麼該循環會正確地迭代3個以上的郵件。如果我將呼叫留給MoveToArchiveFolder,循環只迭代兩次,只移動一個帶有「每日統計數據」主題的郵件項目,然後退出循環,忽略最後一個使用主題爲「每日統計數據」的第三個郵件項目。我敦促你使用我的代碼自己嘗試一下。我不明白爲什麼它會過早退出。請指教。 – Alan

回答

1

我懷疑你的循環正在退出「過早」,因爲你的循環增值每次經過,而你遞減的同時堆棧(ItemsToProcess),所以你」自然會跳過你的一半物品。
爲了避免這種情況,你可以遍歷從頂部使用這樣的底部:

For i = ItemsToProcess.Count To 1 Step -1 

,並使用i作爲引用MailItems索引。

+0

+1。通過Jove,我認爲你已經明白了!這就像刪除行一樣。 –

相關問題