5

我正在使用 VBA 在发送之前以某种方式格式化所有出站电子邮件。例如,我想从嵌入在电子邮件中的所有表中删除第一列。我使用以下代码:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim wd As Word.Document
    Set wd = ActiveInspector.WordEditor
    Dim tb As Word.Table
    For Each tb In wd.Tables
        tb.Columns(1).Delete
    Next tb
End Sub

上面的代码完美运行。但是,问题是我只想格式化我的电子邮件文本。通常,我会回复或转发其他人的电子邮件,这意味着上一封电子邮件的文本将在同一个 Inspector 窗口中。我不想格式化文本/图像/等。线程中以前的电子邮件。如何做到这一点?

我知道线程中的每封电子邮件——尽管它们都在同一个窗口中——是一个单独的单元。我知道这一点,因为在阅读属于线程一部分的电子邮件时,当您移动鼠标时,您会看到

在此处输入图像描述

在屏幕的右侧,指示线程的下一部分在哪里。在撰写属于主题的新电子邮件(回复或转发)时,上述按钮不会显示,但您仍会看到一条蓝色水平线将主题的不同部分彼此分开。

我在想也许我可以搜索电子邮件中第一次出现的行,并且只应用格式直到那时。但是,该行似乎不是真正的文本或任何在正常意义上可搜索的常规格式。事实上,如果您复制电子邮件文本(在发送之前),然后粘贴到 Word 中,该行就会消失。

有什么建议么?谢谢!

更新

我的问题与 2010 及更高版本中的“对话视图”无关。Outlook 2010 允许您在一个组中查看线程中的其他电子邮件。但是,我想要的是能够(通过代码)在同一电子邮件中的线程中循环电子邮件。因此,如果有一封电子邮件“a”,然后是一个回复“b”,然后是另一个回复“c”,c 的下方也将包含 b,然后在其下方包含 a,所有这些都在同一电子邮件中。在伪代码中,我想要以下内容:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim wd As Word.Document
    Dim smail as SubEmail
    Dim tb As Word.Table
    Set wd = ActiveInspector.WordEditor
    For Each smail in wd
        For Each tb In wd.Tables
            tb.Columns(1).Delete
        Next tb
        Exit For
    Next smail
End Sub

更新

我在 Exchange Web Services 中发现了一个类似的功能,称为 UniqueBody。见这里。这正是我正在寻找的,而不是 Exchange。

4

1 回答 1

1

为什么不直接寻找 "From:" chr(13) "Sent:" 呢?Outlook 会将这些标签放在任何电子邮件中,无论它来自何处。

假设上面示例中的电子邮件 a、b、c 的整个正文都在 sBody 中:

Sub GetFirstThread()
    Dim olItem As Outlook.MailItem
    Dim sText As String

    Set olItem = ActiveExplorer.Selection.Item(1)
    sBody = olItem.Body
    i=1
    While i < Len(sBody)
        If Asc(Mid(sBody, i, 1)) = 13 Then 'Look for From:
            If Mid(sBody, i + 1, 5) = "From:" Then
                'we found the start of email b
                nPosEb = i
            End If
        End If
        i=i+1
    Wend
     '...do something with nPosEb
End Sub
于 2014-01-03T18:09:16.627 回答