我在发送之前使用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
Run Code Online (Sandbox Code Playgroud)
上面的代码完美无缺.但问题是我只想格式化我的电子邮件文本.通常,我会回复或转发其他人的电子邮件,这意味着上一封电子邮件的文本将位于同一个"检查器"窗口中.我并不想格式化文字/图片/等.线程中以前的电子邮件.怎么能实现这一目标?
我知道一个帖子中的每封电子邮件 - 尽管它们都在同一个窗口中 - 是一个单独的单元.我知道这一点,因为在阅读作为线程一部分的电子邮件时,当你移动鼠标时,你会看到

在屏幕的右侧,指示线程的下一部分的位置.在编写作为线程一部分的新电子邮件(回复或转发)时,上面的按钮不会显示,但您仍然会看到一条蓝色的水平线,将线程的不同部分相互分开.
我想也许我可以在电子邮件中搜索第一次出现的行,并且只应用格式直到那一点.但是,看起来该行不是真正的文本或任何常规格式,可以在正常意义上搜索.实际上,如果您复制电子邮件文本(在发送之前),然后粘贴到Word中,该行将消失.
有什么建议?谢谢!
更新
我的问题与版本2010及更高版本中的"对话视图"无关.Outlook 2010允许您在一个组中查看线程中的其他电子邮件.然而,我想要的是能够在同一电子邮件中循环(通过代码)线程中的电子邮件.所以,如果有一个电子邮件"a",然后是回复,"b",然后是另一个回复,"c",c也将包含b,然后在其下方,所有都在同一封电子邮件中.在伪代码中,我想要以下内容:
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
Run Code Online (Sandbox Code Playgroud)
更新
我在Exchange Web服务中找到了一个名为UniqueBody的类似功能.看到这里.这正是我正在寻找的,而不是Exchange.
为什么不直接查找 "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
Run Code Online (Sandbox Code Playgroud)