我在发送之前使用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
以上代码完美无缺。但是,问题是我只想格式化我的电子邮件文本。通常,我会回复或转发其他人的电子邮件,这意味着上一封电子邮件的文本将位于同一个“检查器”窗口中。我不想要格式化text / images / etc.线程中以前的电子邮件。如何实现这一目标?
我知道线程中的每封电子邮件 - 尽管它们都在同一个窗口中 - 是一个单独的单元。我知道这一点,因为在阅读作为线程一部分的电子邮件时,当您移动鼠标时,您将看到
屏幕右侧的
,指示线程的下一部分所在的位置。在撰写作为帖子一部分的新电子邮件(回复或转发)时,上面的按钮没有显示,但你仍会看到一条蓝色的水平线,将线程的不同部分相互分开。
我在想,也许我可以在电子邮件中搜索该行的第一次出现,并且直到那时才应用格式。但是,看起来该行不是真正的文本或任何常规格式,可以在正常意义上搜索。实际上,如果您复制电子邮件文本(发送前),然后粘贴到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
更新
我在Exchange Web Services中发现了一个名为UniqueBody的类似功能。见here。这正是我正在寻找的,而不是Exchange。
答案 0 :(得分:1)
为什么不只找“从:”chr(13)“已发送:”? 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