使用VBA在MS Word多级列表标题中插入文本

时间:2015-07-30 13:38:36

标签: vba word-vba

我在6个月前请求论坛提供帮助,但我的问题仍然只是部分解决了。我希望有人可以帮助我认识我在我创建的代码中发生的错误。

我的问题是我想使用VBA在我的多级列表标题中的英语字符串之前插入非常短的标准化文本。这些标题在我的~600页文档中以样式形式存在。

例如,我有: 1.1.1快速布朗狐狸。

我想要的是: 1.1.1(XXxx)Quick Brown Fox。

我创建了这个宏,然后我为我的文档中的每个6个标题级别定制。

Public Sub InsertFOUOH1()
'Inserts U//FOUO before all first order Headings)
'Macro works on whole document
    Dim doc As Document
    Dim para As Paragraph

    Const MyText = "(U//FOUO) "
    Application.ScreenUpdating = False
    Set doc = ActiveDocument

    For Each para In doc.Paragraphs
        If para.Style = doc.Styles(wdStyleHeading1) Then
        para.Range.InsertBefore (MyText)
End If
Next para 
End Sub

此代码存在缺陷/损坏但我无法找到解决方案。这适用于标题级别1-3。它在标题级别4-6上失败。该文件很长,我的假设是4级标题的数量和更大的数量导致有缺陷的代码失败。代码根本不会在这些标题级别完成。

这似乎是代码中不正确的部分:

For Each para In doc.Paragraphs
If para.Style = doc.Styles(wdStyleHeading1) Then
para.Range.InsertBefore (MyText)

我已经在我的宏上尝试了几十种变体,它们似乎都失败了。在调试中,调试器只是跳过“If / Then”行。调试时,它们永远不会以黄色突出显示。

我的理解是您无法以编程方式在VBA中选择段落。我的标题级别是Word的段落。所以,我的行“para.Range.InsertBefore(Mytext)”可能对代码没有任何意义。我尝试创建一个Range来使宏工作(Ranges有一个'Selection'属性),但我做错了。

我当然感谢任何有关纠正我的代码的建议。

1 个答案:

答案 0 :(得分:1)

使用以下脚本作为测试:

Public Sub InsertFOUOH1()
'Inserts U//FOUO before all first order Headings)
'Macro works on whole document
    Dim doc As Document
    Dim para As Paragraph

    Const MyText = "(U//FOUO) "
    Application.ScreenUpdating = False
    Set doc = ActiveDocument

    For Each para In doc.Paragraphs
        If para.Style = doc.Styles(wdStyleHeading1) Then para.Range.InsertBefore ("Level 1")
        If para.Style = doc.Styles(wdStyleHeading2) Then para.Range.InsertBefore ("Level 2")
        If para.Style = doc.Styles(wdStyleHeading3) Then para.Range.InsertBefore ("Level 3")
        If para.Style = doc.Styles(wdStyleHeading4) Then para.Range.InsertBefore ("Level 4")
        If para.Style = doc.Styles(wdStyleHeading5) Then para.Range.InsertBefore ("Level 5")
        If para.Style = doc.Styles(wdStyleHeading6) Then para.Range.InsertBefore ("Level 6")
        If para.Style = doc.Styles(wdStyleHeading7) Then para.Range.InsertBefore ("Level 7")
        If para.Style = doc.Styles(wdStyleHeading8) Then para.Range.InsertBefore ("Level 8")
        If para.Style = doc.Styles(wdStyleHeading9) Then para.Range.InsertBefore ("Level 9")
    Next para
End Sub

我第一次尝试它只适用于wdStyleHeading7,我看到这是因为我的Heading Styles只升级到7级,即使有1.1.1.1.1.1.1.1(8级) )和我的文件中的第9级。

然后我通过选择文本并使用Update heading to Match Selection将第8和第9级样式添加到我的样式中。添加第8和第9 Heading Styles后,在标题文本之前添加Text

编辑:

我现在使用para.Range.InsertBefore (MyText)对其进行了测试,它也运行良好,因为它只是添加了文本