【问题标题】:Automatically Mark email in Deleted Items as Read Outlook 2016 VBA自动将已删除邮件中的电子邮件标记为已读 Outlook 2016 VBA
【发布时间】:2019-07-19 05:26:55
【问题描述】:

我在另一台计算机上使用 Outlook 设置了一个小宏,但现在我已经切换了计算机,我无法让它工作。当我尝试运行最后一个 Private Sub 时,它无法识别名称并拉出没有列出任何选项的宏选择框。

我不喜欢手动将“已删除邮件”文件夹中的电子邮件标记为已读,尤其是考虑到他们有惊人的远见将丢弃的草稿标记为未读。

这是以前可以工作的代码:

Dim WithEvents g_OlkFolder As Outlook.Items

Private Sub Application_Quit()
    Set g_OlkFolder = Nothing
End Sub

Private Sub Application_Startup()
    Set g_OlkFolder = Session.GetDefaultFolder(olFolderDeletedItems).Items
End Sub

Private Sub g_OlkFolder_ItemAdd(ByVal Item As Object)
    Item.UnRead = False
    Item.Save
End Sub

【问题讨论】:

  • 安装 Outlook 后,每个电子邮件帐户都有一个商店和默认商店。每个商店都有自己的已删除邮件文件夹。不使用默认的已删除邮件文件夹。这对你的新电脑来说是真的吗?尝试在您的即时窗口中输入? Session.GetDefaultFolder(olFolderDeletedItems).Parent.Name。它是否显示正确的商店名称?
  • 您是否希望g_OlkFolder_ItemAdd 出现在可供选择的宏列表中?带参数的宏只能被另一个宏调用,不能供用户选择。
  • 还要检查您的宏安全设置,如果没问题,请重新启动 Outlook,然后将未读项目移动到已删除的文件夹。
  • @TonyDallimore 我只在 Outlook 上使用一个帐户,所以我不认为应该有多个已删除项目存储。我真的不期望或关心 g_OlkFolder_ItemAdd 是否显示为宏。我真的只是想让它运行。
  • @0m3r 我启用了宏并重新启动了几次。感谢您尝试

标签: vba outlook outlook-2016


【解决方案1】:

这里有一些事情可以尝试和检查:

  • 将光标放在 Application_Startup 方法中,然后按 F5。然后回去再试一次。如果这有帮助,则说明尚未运行初始化,并且未设置 g_OlkFolder 变量。
  • Item.UnRead = False 行上放置一个断点。如果它没有停在那里,你的方法就没有运行。
  • 您是否已将代码放入 ThisOutLookSession 模块中?

【讨论】:

  • 您好,感谢您的回复。不幸的是,Application_Startup 中的 Run/F5 不起作用。当我在 Item.Unread 行上放置断点时,没有注意到任何区别。我已经在普通的 Module1 和 ThisOutlookSession 模块中尝试过。我现在注意到一个新问题,当我尝试运行任何部分时,它会给我一个“编译错误:预期的语句结束”,然后在声明行中突出显示 g_OlkFolder
  • 编译错误很可能是因为你不能在普通模块中使用那种变量声明。
  • 啊,那个特定问题在类模块中消失了
【解决方案2】:

尝试使用Application.Session property,或者使用我更喜欢的GetNamespace方法

例子

Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
    Dim olNs As Outlook.NameSpace
    Dim DeletedFolder  As Outlook.MAPIFolder

    Set olNs = Application.GetNamespace("MAPI")
    Set DeletedFolder = olNs.GetDefaultFolder(olFolderDeletedItems)
    Set Items = DeletedFolder.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
    If TypeOf Item Is Outlook.MailItem Then
        ' do something with Item
    End If
End Sub

【讨论】:

  • 您好,感谢您的回复。不幸的是,这仍然不能解决我根本没有运行的问题。每次我尝试运行一个子程序时,它只是想创建一个新宏。
【解决方案3】:

或定义 olFolderDeletedItems 或将其替换为 3。 详情请见this link

【讨论】:

  • 应用程序启动子已经这样做了还是我错过了什么?
  • 具体在哪里?请说明你在哪里定义它?
  • Private Sub Application_Startup() 设置 g_OlkFolder = Session.GetDefaultFolder(olFolderDeletedItems).Items End Sub
  • 再次:olFolderDeletedItems的定义在哪里?此外,如果您将断点设置为此字符串,调试器会显示什么:Set g_OlkFolder=...?
  • 感谢所有帮助,但我只是想出了一个更简单的解决方案(作为答案发布)。我猜有时你只需要重新开始
【解决方案4】:

在完全放弃我的代码并从头开始后,我想出了一个比我尝试的更简单的解决方案。无论如何,感谢所有帮助!

Sub MDAU()
Dim DI As Outlook.Items
Dim MSG As Object
Set DI = Session.GetDefaultFolder(olFolderDeletedItems).Items
Set MSG = Application.CreateItem(olMailItem)
For Each MSG In DI
MSG.UnRead = False
Next
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 2014-10-19
    • 2016-11-03
    • 2014-09-09
    • 2013-02-02
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多