1

「既読」とマークされたメッセージを自分のerrorMailsフォルダから自分のフォルダに移動しようとしています。sentErrorsどちらも自分のmailOneフォルダ内にあります。私が持っている現在のコードは、既読としてマークしたほとんどのメールで機能しますが、最後に読んだ1通のメールはそのままにしておきます。

私は何かが足りないのですか?

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 baseまたはTo句を使用して制御されます。Officeでは、配列は0(0ベース)ではなく、位置1( 1ベース)からインデックス付けされます。この変更に対応するには、ループを変更する必要があります。FOR

For i = Items.Count To 1 Step -1

別の方法として、適切なインデックス境界を活用UBoundして決定することもできます。LBound

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