1

我正在尝试将标记为已的邮件从我的errorMails文件夹移动到我的sentErrors文件夹,这两个文件夹都在我的mailOne文件夹中。我拥有的当前代码适用于我标记为已读的大多数邮件,但只留下最后一封已读邮件。

我错过了什么吗?

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
4

1 回答 1

2

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

For i = Items.Count To 1 Step -1

作为另一种选择,您可以利用UBoundLBound确定适当的索引边界。

For i = UBound(Items) To LBound(Items) Step -1
于 2013-01-11T14:18:57.350 回答