【问题标题】:Can I Speed-Up This VBA to Move Emails?我可以加速此 VBA 以移动电子邮件吗?
【发布时间】:2018-12-06 14:30:48
【问题描述】:

我的 Outlook VBA 完全符合我的要求。它将前一个工作日的电子邮件移动到新文件夹,并在辅助电子邮件收件箱中执行此操作。

我正在寻找有关如何使其更快地移动电子邮件的建议。

如果我手动将所有电子邮件复制到另一个文件夹,则需要几秒钟。当我运行代码时,它需要几分钟。这是我的代码:

Option Explicit

Sub Move_Yesterdays_Emails()

'***Creates a new folder named yesterdays date under the inbox***

 Dim myNameSpace As Outlook.NameSpace
 Dim strMailboxName As String
 Dim myFolder As Outlook.Folder
 Dim myNewFolder As Outlook.Folder
 Dim xDay As String
 Dim XDate As Date
 Dim thatDay As String
 strMailboxName = "Deductions Backup"


    If Weekday(Now()) = vbMonday Then
        XDate = Date - 3
    Else
        XDate = Date - 1
    End If

    thatDay = WeekdayName(Weekday(XDate))

 Set myNameSpace = Application.GetNamespace("MAPI")
 Set myFolder = Session.Folders(strMailboxName)
 Set myFolder = myFolder.Folders("Inbox")
 Set myNewFolder = myFolder.Folders.Add(XDate & " " & thatDay)

'***Finds all emails in the inbox from yesterday and moves them to the created folder***

    Dim Inbox As Outlook.MAPIFolder
    Dim Items As Outlook.Items
    Dim Item As Object
    Dim Filter As String
    Dim i As Long

        Filter = "[ReceivedTime] >= '" & _
              CStr(XDate) & _
             " 12:00AM' AND [ReceivedTime] < '" & _
              CStr(XDate + 1) & " 12:00AM'"

        Debug.Print Filter

    Set myNameSpace = Application.GetNamespace("MAPI")
    Set myFolder = Session.Folders(strMailboxName)
    Set Inbox = myFolder.Folders("Inbox")
    Set Items = Inbox.Items.Restrict(Filter)
        Items.Sort "[ReceivedTime]"

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is MailItem Then
            Debug.Print Items(i)
            Set Item = Items(i)
            Item.Move myNewFolder
        End If
    Next
End Sub

知道为什么这比手动移动项目要慢得多,或者如何让它运行得更快?我不明白为什么它需要比手动完成更长的时间。

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    与其在查看和移动邮件之前过滤邮件,不如尝试简单地查看它们,然后决定是否移动它们。

    例如,像这样一个简单的 for 循环就可以解决问题:

    For Each item In Inbox.Items
         If TypeOf item Is MailItem Then
             If item.ReceivedTime < Date And item.ReceivedTime > Date - 1 Then
                 item.Move myNewFolder
             End If
         End If
     Next
    

    过滤某些东西非常慢。

    但请注意,我不能 100% 确定 Date - 1 是否适用于午夜后不久收到的邮件。

    【讨论】:

    • 您确定过滤确实是问题所在吗?我问这个只是因为我对我的代码的理解是过滤器在移动任何项目之前应用一次,而不是在每次移动后重新应用。当我观看此运行时,项目立即开始移动。只是项目 1....然后 2....然后 3 之间有时间。有时每个项目之间有 2 或 3 秒。所以我认为在 item.move 期间发生了缓慢而不是过滤......也许
    • 但是如果我手动选择所有项目并将它们放到子文件夹中,移动所有 200 多个项目需要大约 3 秒,但代码完成所有操作需要大约 5 分钟。
    • @TBoulz 在那种情况下,我误解了您的代码滞后的地方。我认为这是整个过程,而不仅仅是运动的部分。但请注意,无论如何过滤总是很慢。如果想到什么,我会编辑我的答案,你可以试试!
    • 感谢您查看,我在其中添加了一个调试计时器,实际上似乎没有什么需要那么长时间。过滤时间为 1 秒。移动每个项目不到一秒钟,有时需要更多时间。主要问题是有时在移动项目时,它会挂起并需要 2 或 3 秒。然后在移动大约 40 封电子邮件后,它似乎完全冻结了。即使没有挂断和冻结,如果它以每个项目 1 秒的速度继续下去,考虑到我可以拖放 200 个项目,这仍然非常慢,而且可能需要不到 2 秒的时间。令人沮丧的是手动速度要快得多
    • 有没有办法在 Outlook 中选择从某个日期显示的第一封电子邮件,然后选择它下面的所有电子邮件项目?像 shift+control+down 功能?它似乎在 Outlook 中不起作用,但可能是这样的,所以我只会做 1 个动作,而不是 200 多个动作。
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2014-08-25
    • 2022-01-09
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多