如何创建递减 for 循环,以识别文件夹中的最新项目?

How to create a decrementing for loop, to identify the most recent item in a folder?

我想以相反的方式完成这个功能。我发现 you can't decrement through a for...each loop。我需要创建一个 for...next 循环并递减邮件项目。

Sub ProcessItemTesting(StartFolder As Outlook.MAPIFolder, Item As Object)
Dim myOlApp As New Outlook.Application
Dim objFolder As Outlook.MAPIFolder
Dim objItem As Object
Dim OlMail As Object
Dim mySaveName As String
Dim myExt As String
Dim strFolder As String
Dim myitem
Set myitem = myOlApp.CreateItem(olMailItem)

For Each OlMail In StartFolder.Items
    If (Now - OlMail.SentOn) > 90 Then
        If OlMail.Attachments.Count > 0 Then
            If TypeName(OlMail) = "MailItem" Then
                For x = 1 To OlMail.Attachments.Count
                    If UCase(OlMail.Attachments.Item(x).Filename) Like "*STRING*" Then
                        mySaveName = OlMail.Attachments.Item(x).Filename
                        myExt = Split(mySaveName, ".")(1)
                        Select Case myExt
                        Case "xls", "xlsm", "xlsx"
                            mySaveName = strFolder & "\" & mySaveName
                            OlMail.Attachments.Item(x).SaveAsFile mySaveName
                        Case Else
                            'do nothing
                        End Select
                    End If
                Next
            End If
        End If
    End If
Next

End Sub

这个循环通过我的邮箱 FIFO。执行时间太长,因为我正在寻找最近的实例,所以我想要后进先出。

所以,我的问题是,如何形成这个 for...next 循环?

具体来说,我不知道如何:

  1. 获取循环结束测试参数的计数 - [StartFolder.Items.count?]
  2. 在每次迭代中处理 OlMail 项目对象 - [OlMail(x)?]

首先,请看一下 MSDN 中的 Getting Started with VBA in Outlook 2010 文章,其中解释了基础知识。

遍历文件夹中的所有项目并不是一个好主意。我建议改用 Items class 的 Find/FindNext or Restrict 方法。后者对 Items 集合应用过滤器,返回一个新集合,其中包含原始集合中与过滤器匹配的所有项目。因此,您只需要遍历少量项目并执行所需的任何操作,而无需每次都检查属性。您可以在以下文章中阅读有关这些方法的更多信息:

How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)

How To: Use Restrict method to retrieve Outlook mail items from a folder

此外,您可能会发现应用程序 class 的 AdvancedSearch 方法很有帮助。在 Outlook 中使用 AdvancedSearch 方法的主要好处是:

  • 搜索在另一个线程中执行。您不需要手动 运行 另一个线程,因为 AdvancedSearch 方法 运行 会自动在后台运行它。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。 Restrict 和 Find/FindNext 方法可以应用于特定的项目集合(请参阅 Outlook 中文件夹 class 的项目 属性)。
  • 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的过滤文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的 IsInstantSearchEnabled 属性)。
  • 您可以随时使用搜索的停止方法停止搜索过程 class。

有关详细信息,请参阅 Advanced search in Outlook programmatically: C#, VB.NET

我遇到过类似的问题,我就是这样解决的。让我知道这是否有帮助。下面给出的代码是我所做的复制粘贴。

'Get the totals emails count in the given folder
bTotalEmails = OlMapFld.Items.Count
    For iCounter = bTotalEmails To 1 Step -1
        'this will be used instead of OlMail as per your code.
        OlMapFld.Items.Item(iCounter)               
    Next