我在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'属性),但我做错了。
我当然感谢任何有关纠正我的代码的建议。
答案 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)
对其进行了测试,它也运行良好,因为它只是添加了文本