請參閱下面的代碼。我編寫的子程序應該查看所有今天剛剛發佈的電子郵件,並只移動那些主題爲「每日統計」的電子郵件。我故意發送兩封電子郵件給自己,主題爲「每日統計」。收件箱中還有一封其他電子郵件沒有相應的主題。總共有三封電子郵件。當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
你好!你是否檢查過'ItemsToProcess'中有多少物品,以及哪些物品?還有你檢查哪些傳遞給'MoveToArchiveFolder'?一般來說,您需要使用F8逐步完成代碼並/或添加更多'Debug.Print'語句。另外,我想知道如果你只是將oitem傳遞給'MoveToArchiveFolder',它會不會更好地工作?我真的不需要'tempMailItem'。 –
您有一個初始化但不使用的變量。即myFolder。嘗試將'Set ItemsToProcess = Session.GetDefaultFolder(olFolderInbox).Items.Restrict(sFilter)'更改爲'Set ItemsToProcess = myFolder.Items.Restrict(sFilter)' – deusxmach1na
使用debug.print語句的建議對確實有幫助。如果我用一個debug.print語句替換對MoveToArchiveFoler的調用,那麼該循環會正確地迭代3個以上的郵件。如果我將呼叫留給MoveToArchiveFolder,循環只迭代兩次,只移動一個帶有「每日統計數據」主題的郵件項目,然後退出循環,忽略最後一個使用主題爲「每日統計數據」的第三個郵件項目。我敦促你使用我的代碼自己嘗試一下。我不明白爲什麼它會過早退出。請指教。 – Alan