【问题标题】:display email body of selected email in outlook as a message box in excel?将outlook中所选电子邮件的电子邮件正文显示为excel中的消息框?
【发布时间】:2016-01-20 14:02:38
【问题描述】:

我正在使用 excel 2010 并创建了以下 vba 代码,该代码可以查找主题标题中包含单词 test 的电子邮件,然后在 excel 中显示带有该电子邮件正文的消息框:

Sub GetFromInbox()

    Dim olApp As Outlook.Application
    Dim olNs As Outlook.Namespace
    Dim olFldr As Outlook.MAPIFolder
    Dim olItms As Outlook.Items
    Dim olMail As Variant
    Dim i As Long

    Set olApp = New Outlook.Application
    Set olNs = olApp.GetNamespace("MAPI")
    Set olFldr = olNs.GetDefaultFolder(olFolderInbox)
    Set olItms = olFldr.Items
    Set objItem = olApp.ActiveExplorer.Selection.Item(1)


    olItms.Sort "Subject"

    i = 1

    For Each olMail In olItms
     If InStr(olMail.Subject, "Test") > 0 Then
            MsgBox olMail.Body
            i = i + 1
        End If
    Next olMail

    Set olFldr = Nothing
    Set olNs = Nothing
    Set olApp = Nothing

End Sub

我在这里的最终目的是在代码中添加更多 if 条件,以便只有当前选择的电子邮件或在 Outlook 中打开的电子邮件的电子邮件正文才会显示在我的 excel 消息框中

例如,假设我们有几封主题为“test”的电子邮件,就目前而言,代码将在不同的消息框中依次显示所有这些主题为“test”的电子邮件的正文。

但如果邮件主题是“测试”,则 Outlook 中当前选择/打开的电子邮件应该只显示一个消息框。

请有人告诉我如何做到这一点?

【问题讨论】:

    标签: excel vba outlook


    【解决方案1】:

    您可以使用Application.ActiveInsepctor 属性获取已打开的电子邮件,或使用Application.ActiveExplorer 属性获取选定但未打开的电子邮件

    Sub GetFromInbox()
    
        Dim olApp As Outlook.Application
        Dim olMail As Outlook.MailItem
    
        Set olApp = New Outlook.Application
    
        'If it's not an MailItem or there's no
        'ActiveInspector, error is ignored
        On Error Resume Next
            Set olMail = olApp.ActiveInspector.CurrentItem
        On Error GoTo 0
    
        'If nothing is open, see if a MailItem is selected
        If olMail Is Nothing Then
            On Error Resume Next
                Set olMail = olApp.ActiveExplorer.Selection.Item(1)
            On Error GoTo 0
        End If
    
        If Not olMail Is Nothing Then
            If InStr(olMail.Subject, "Test") > 0 Then
                MsgBox olMail.Body
            Else
                MsgBox "Selected/active email does not have correct subject"
            End If
        Else
            MsgBox "Active item is not an email or no email selected"
        End If
    
    End Sub
    

    首先,它查找活动的、打开的项目。如果那不是电子邮件,那么它会查看处于活动状态的“资源管理器”中的第一个选定项目。如果那不是电子邮件,那么它会给您一条消息。

    如果打开的活动项目是一封电子邮件,它会使用它并测试主题。在这种情况下,它不会查看任何选定的项目。只有当没有任何东西打开或打开的项目不是 Mailitem(就像它是 CalendarItem)时,它才会查看选择的内容。

    如果您在日历中,那么这就是活动的资源管理器,并且很可能任何选择都不是 MailItem。它也不关心您是否在另一个文件夹的收件箱中。它只关心选择的第一个项目是否是 MailItem。如果这对您很重要,您可以查看olapp.ActiveExplorer.CurrentFolder 以确保您在收件箱中。

    您的邮件文件夹中可以有非 MailItems 的项目。如果不是选中的 MailItem,那么您会收到一条消息。

    最后,您可以在收件箱中选择任意数量的项目。这仅查看选择的第一个项目。如果你想处理所有的项目,你可以使用.Selection.Count.Selection.Item(i)逐个处理。

    【讨论】:

    • 感谢您的建议,但我试过了,它似乎没有任何作用?
    • 我在我的机器上测试了它,它运行良好。你的意思是它什么都没做? olMail 什么都没有?你收到错误了吗?有开放的电子邮件吗?主题中是否有“测试”?
    • 代码似乎没有做任何事情,没有错误,物理上什么也没有发生。电子邮件在主题标题中进行了测试,并且电子邮件可能不一定是打开的,因此为什么我需要任何代码来处理选定的电子邮件而不是打开的电子邮件。你确定这段代码可以从excel执行吗?因为我正在尝试从 excel 执行代码
    • 好的,抱歉,我发现一旦用户打开电子邮件,代码就可以工作。但是,有没有办法根据选择的电子邮件使此代码工作?因为我的用户可能并不总是打开他们的电子邮件?
    • 好吧,我没有仔细阅读你的问题。我已调整代码以查找打开的电子邮件或选定的电子邮件。
    猜你喜欢
    • 2021-02-06
    • 2019-05-18
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2015-06-04
    • 2019-03-12
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多