【发布时间】:2018-07-16 23:56:34
【问题描述】:
我正在尝试调整一些 MS Word VBA 宏以在 Outlook 2016 中运行。我想知道是否有人可以帮助我调整下面由 Tomalak 复制的宏? (见Q 33562468)
在 Outlook 中,我引用了 Microsoft Word 16.0 对象库,并尝试使用 http://www.vboffice.net/en/developers/use-word-macro-in-outlook/ 和 https://www.slipstick.com/developer/word-macro-apply-formatting-outlook-email/ 的建议,但没有成功。
原始 VBA 的目的是删除它在 Word 中所做的重复段落。我想对其进行调整以在 Outlook 2016 中打开并正在编辑的电子邮件中执行相同的功能。
在 Word 中运行的 VBA 会删除每个重复段落的所有实例,但只有一个实例;保留第一个实例(最接近文档顶部的实例)。我宁愿保留最后一个实例(最接近文档底部的那个)。
Sub DeleteDuplicateParagraphs()
Dim p As Paragraph
Dim d As New Scripting.Dictionary
Dim t As Variant
Dim i As Integer
Dim StartTime As Single
StartTime = Timer
' collect duplicates
For Each p In ActiveDocument.Paragraphs
t = p.Range.Text
If t <> vbCr Then
If Not d.Exists(t) Then d.Add t, New Scripting.Dictionary
d(t).Add d(t).Count + 1, p
End If
Next
' eliminate duplicates
Application.ScreenUpdating = False
For Each t In d
For i = 2 To d(t).Count
d(t)(i).Range.Delete
Next
Next
Application.ScreenUpdating = True
MsgBox "This code ran successfully in " & Round(Timer - StartTime, 2) & "
seconds", vbInformation
End Sub
【问题讨论】:
-
不要在段落上使用
For...Each,而是使用For...Next循环从最后一段倒数:如果您的字典中已经有文本,您可以删除当前的。 -
谢谢蒂姆。我不确定如何将 For Each..... 替换为 For...Next。
-
我现在已经能够调整代码以在 Outlook 中运行,方法是用 Word.Paragraph 替换 Paragraph 并用 objDoc.Paragraphs 替换 ActiveDocument.Paragraphs,并将修改后的代码插入到 Diane Poremsky 的提议代码中(上面的链接)。
-
...要保留最后一个重复段落而不是第一个,请将“For i=2 to d(t).Count”更改为“For i=1 to d(t).计数-1”。任务完成。感谢 Tomalak 提供原始代码。