将邮件代码为Outlook不动的最后一项

问题描述:

我想移动标记为从我errorMails文件夹到我的sentErrors文件夹的邮件,这两者都是我mailOne文件夹中。当前的代码对于我标记为已读的大多数邮件都有效,但是只留下最后一封读取的邮件。将邮件代码为Outlook不动的最后一项

我错过了什么吗?

Public Sub moveToSentFolder() 

Dim obj As Object 
Dim Items As Outlook.Items 
Dim OutMail As Outlook.MailItem 

Dim archiveFolder As Outlook.Folder 
Dim mailOneFolder As Outlook.Folder 
Dim sentErrorFolder As Outlook.Folder 
Dim dumpErrorFolder As Outlook.Folder 

Set archiveFolder = Outlook.Session.Folders("Archives") 
Set mailOneFolder = archiveFolder.Folders("mailOne") 
Set errorFolder = ehealthFolder.Folders("errorMails") 
Set dumpErrorFolder = ehealthFolder.Folders("sentErrors") 

'Dim Message As MailItem 

Set Folder = Application.Session.GetDefaultFolder(olFolderInbox) 
Set Items = errorFolder.Items 

For i = Items.Count - 1 To 0 Step -1 

    With Items(i) 

     ''Error 438 is returned when .receivedtime is not supported 
     On Error Resume Next 

     If .UnRead = False Then 
      If Err.Number = 0 Then 
       .Move dumpErrorFolder 
      Else 
       Err.Clear 
      End If 
     End If 
    MsgBox i 'debug 
    End With 

Next 

'For some reason the commented out code below only seems to move half of all the read mails, so I have to run the macro more than once to clear folder of read mails - this code now unused 
'For Each Message In Items 
    'If Message.UnRead = False Then 
    ''Message.Move dumpErrorFolder 
    'i = i + 1 
    'End If 
'Next Message 

End Sub 

在VBA,项目可以具有不同的索引的边界 - 使用option baseTo子句控制。在Office中,阵列从位置1(基于1的)开始索引,而不是0(基于0的)。您需要更改您的FOR环路以适应此更改。

For i = Items.Count To 1 Step -1 

又或者,你可以利用UBoundLBound以确定合适的索引边界。

For i = UBound(Items) To LBound(Items) Step -1