VBA Word - 改变标题使其失去风格

时间:2015-10-12 14:40:14

标签: vba ms-word word-vba

这里有一堆问题询问如何获得所有标题,但显然没有人试图改变标题......

我想将 Old Heading 的某些二级标题更改为 New Heading ,所以我这样做了......

Sub changeHeading()
    Dim p As Paragraph
    For Each p In ActiveDocument.Paragraphs
        If p.Style = "Heading 2" Then _
            If p.Range.Text = "Old Heading" & vbCr Then p.Range.Text = "New Heading" & vbCr
    Next p
End Sub

标题获得新名称,但它们也有不同的风格 - 它们获得以下段落的样式 - 即如果标题后面的文字具有样式表格文本,则标题将具有样式之后表格文本(字体大小将保留旧标题中的字体大小),章节的编号将丢失。如果我将样式设置回p.Style = "Heading 2",这将使该标题(即下一段)之后的第一个文本具有Heading 2样式,尽管它仍然是同一段p(带有更改的文本) ,但在文件中的位置相同)。

之前的情况:

1.4 Old Heading
some text

更改标题并设置样式后

New Heading
1.4 some text    

其中some text样式Heading 2New Heading的字体大小为标题,但没有编号。

第二个问题,它需要令人难以置信的长时间(对于只有几段的小文档,几秒钟)。

那么,如何更改标题?如何以一种不需要几分钟就可以完成大文档的方式来实现?谢谢你的帮助。

编辑:

我发现用

更改文本
Call p.Range.Find.Execute(FindText:="Old Heading", ReplaceWith:="New Heading")

将保留样式,所以这将解决我原来更改文本的问题,但我仍然想知道为什么设置段落文本会使其失去风格。

1 个答案:

答案 0 :(得分:1)

样式更改的原因是因为您覆盖了段落标记(vbCr)。段落级格式直接与段落字符相关联。当你删除它,然后在下一个段落的开头插入另一个段落时,新段落将采用它所源自的段落的格式。

顺便说一句,使用Range.Find和Replace可能比循环段集合更有效。 Word的查找功能还可以搜索格式。因此,您可以使用单个“查找”操作来查找标题2样式和特定文本(不带段落标记)。然后使用Replace来编写新文本。

在Word UI中测试,然后录制宏以获得基本语法。