【问题标题】:Insert Text in MS Word Multilevel List Headings Using VBA使用 VBA 在 MS Word 多级列表标题中插入文本
【发布时间】:2015-10-30 19:39:57
【问题描述】:

大约 6 个月前,我向论坛请求了帮助,但我的问题仍然只得到了部分解决。我希望有人可以帮助我识别我创建的代码中的错误发生在哪里。

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

例如,我有: 1.1.1 快速褐狐。

我想要的是: 1.1.1 (Xxxx) 快速褐狐。

我创建了这个宏,然后为文档中的 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)”行可能对代码没有任何意义。我尝试创建一个范围以使宏工作(范围具有“选择”属性),但我做错了。

我当然会很感激有关更正我的代码的任何建议。

【问题讨论】:

  • 在 office 2003 sp3 上测试。所有标题的代码工作正常(wdStyleHeading1..wdStyleHeading9)
  • 谢谢伊万。不幸的是,我必须在工作环境中使用 Word 2010 或 2013。 Office 2003 sp.3 不是一个选项。非常有趣的是宏在 2003 版本中有效。感谢您的建议。

标签: vba ms-word


【解决方案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) 对其进行了测试,它也工作得很好,因为它只是简单地添加了文本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多