在数字之后和Word分层标题中的单词之前插入文本

时间:2015-01-28 14:14:03

标签: vba ms-word word-vba

我正在通过两本书(罗马的写作词宏,曼斯菲尔德为MS Office掌握VBA)。在我的工作环境中,我使用Word 2007和Word 2010。

我的问题是我想使用VBA在我的编号层级标题中的英语字符串之前插入非常短的标准化文本。例如,我有:

  

1.1.1快速布朗福克斯。

我想要的是:

  

1.1.1(XXxx)Quick Brown Fox。

我想我最基本的问题是我不知道如何应对这种情况。我有层级标题但我不知道如何说,实际上,“无论级别如何,都要转到每个分层标题。将自己插入标题的第一个英语单词前面。将文本”XXxx“粘贴在前面标题中的第一个单词。转到下一个标题和所有剩余的标题并执行相同的操作。我的文档超过700页,有数百个分层标题。

我看到段落是对象,层次标题是段落。但是,我看不出任何方法让VBA认出我在说什么。我无法成功使用选择方法。我尝试过使用Range方法,但却无法智能地表达VBA代码。我无法指定包含所有且仅包含分层标题的范围,特别是,我不明白如何在标题的第一个英语单词前面插入。

我刚刚开始使用书签。但是,不要书签要求我去每个标题并输入它们吗?如果是这样的话,我也可以粘贴我的内容。我很难过。有趣的是,没有像预期的那样,这似乎是一件简单的事情

2 个答案:

答案 0 :(得分:0)

假设您正在使用Word的大纲级别(我认为这是分层标题的含义),您可以检查此状态的段落。例如,假设我的文档中有一个段落应用了标题1样式:

Sub PrintHeadings()
Dim objDoc as Document
Dim objPara as Paragraph
Set objDoc = ActiveDocument
For each objPara in objDoc.Content.Paragraphs
    If objPara.OutlineLevel <> wdOutlineLevelBodyText then
        Debug.Print objPara.Range.Text
    End If
Next objPara
End Sub

此代码会将具有大纲级别上方大纲级别的任何段落的内容打印到VBA立即窗口。还有其他方法;您可以使用“查找和替换”来搜索每个“大纲”级别。这样可以减少控制;您希望您的更改可以封装在Word查找和替换中。但是,如果你有一个很长的文档而且没有太多的标题级别会更快。一个基本的例子:

Sub UnderlineHeadings()
Dim objDoc as Document
Set objDoc = ActiveDocument
With objDoc.Content.Find
    .ClearFormatting
    .ParagraphFormat.OutlineLevel = wdOutlineLevel1
    With .Replacement
        .ClearFormatting
        .Font.Underline = wdUnderlineSingle
    End With
    .Execute Forward:=True, Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll
End With
End Sub

这将强调所有大纲等级1的文本。

也许这会让你开始。

答案 1 :(得分:0)

几个月前我问过这个问题:“我的问题是我想使用VBA在我的编号层级标题中的英文字符串之前插入非常短的标准化文本。”通过“编号的分层标题”,我的意思是Word多级列表。我收到的答案很受欢迎,但没有对我的问题做出有效回应或指导我做出决议。我传递了这个,希望它可能对其他人有用。

首先,Word标题的“数字”部分无关紧要。在编写代码时,不需要考虑标题的“数字”部分和“文本”部分。我担心我试图插入的任何文本都会在多级编号之前插入,而不是在英文文本之前插入。多级编号显然会被自动忽略。以下是两个有效的解决方案。

第一个宏成功产生了预期的结果:1.1.1(FOUO)。我使用这个宏为每个标题顺序创建单独的宏。我还没有学会如何将它们组合成一个宏。但是它们可以单独工作(但是没有花费太多时间来处理一个复杂的,段落重的670页文档的大约5到10分钟)。

Public Sub InsertFOUOH1()
Dim doc As Document
Dim para As Paragraph
Dim paraNext As Paragraph
Dim MyText As String
Dim H1 As HeadingStyle

Set doc = ActiveDocument
Set para = doc.Paragraphs.First

Do While Not para Is Nothing
Set paraNext = para.Next
MyText = "(U//FOUO) "
If para.Style = doc.Styles(wdStyleHeading1) Then
para.Range.InsertBefore (MyText)
End If
Set para = paraNext
Loop
End Sub

这适用于所有第一顺序标题(1,2,3等)

我使用下面的宏来添加我的安全标记所有正文段落:

Public Sub InsertFOUObody()
'Inserts U//FOUO before all body paragraphs
Dim doc As Document
Dim para As Paragraph
Dim paraNext As Paragraph
Dim MyText As String
Set doc = ActiveDocument
Set para = doc.Paragraphs.First
Do While Not para Is Nothing
Set paraNext = para.Next
MyText = "(U//FOUO) "
If para.Style = doc.Styles(wdStyleBodyText) Then
para.Range.InsertBefore (MyText)
End If
Set para = paraNext
Loop
End Sub

这些宏运行缓慢,最后生成错误28堆栈空间错误。但是,在运行宏时以及宏成功执行其工作之后会显示错误。