如何为文档的各个部分设置样式

时间:2019-06-17 20:14:23

标签: arrays vba ms-word find variant

我有一个函数,可以为书中的标题设置样式。我正在尝试将不同的样式应用于文档的其他部分,但不能完全正常工作。

所以有3种样式:

  1. 章节标题
  2. 该章之后的第一行文字直到下一个换行符(^ p)
  3. 从第一行到下一个分页符(^ m)的所有内容

我确定我使用通配符向其他数组声明-但逻辑上有困难,并且在通配符= true时遇到了问题。

如果任何人也碰巧都掌握如何设置自己的样式的资源,则将它们声明给每个部分(有关我想做什么的想法,请参见代码中的替换样式-“标题1,章节标题” -我可以在宏中定义它吗?),我真的很感激!

有关Chapter功能,请参见下面的代码。

Private Function iiiChapterHeadings()
    Dim Chapters As Variant, Chapter
    Chapters = Array("Chapter One", "Chapter Two", "Chapter Three")

    For Each Chapter In Chapters

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles( _
        "Heading 1,Chapter Heading")
    With Selection.Find
        .Text = Chapter
        .Replacement.Text = "^m" & Chapter & "^p^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    Selection.Find.Execute Replace:=wdReplaceAll
    Next

End Function

文件示例!!!

Chapter One^p
^p
This first line of text will have a style set to it so there's no indentation, the first letter of the sentence is a capital letter and it applies to everything up to the next line break.^p
Everything after the line break above has a different style set to it.^p
All of this will have that style up until the next page break.^p
As will this line.^p
And this etc. ^p
^m

Chapter Two^p
^p

2 个答案:

答案 0 :(得分:0)

您不需要通配符。带有循环的普通查找将可以。例如:

Sub Demo()
Application.ScreenUpdating = False
Dim i As Long
With ActiveDocument
  With .Range
    .Style = wdStyleNormal
    .InsertBefore vbCr
    With .Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = "^pChapter"
      .Replacement.Text = ""
      .Forward = True
      .Format = False
      .Wrap = wdFindStop
      .Execute
    End With
    Do While .Find.Found
      .Start = .Start + 1
      .Paragraphs.First.Style = wdStyleHeading1
      .Collapse wdCollapseEnd
      .Find.Execute
    Loop
  End With
  With .Range
    With .Find
      .Text = ""
      .Style = wdStyleHeading1
      .Execute
    End With
    Do While .Find.Found
      .Paragraphs.First.Next.Style = wdStyleHeading2
      .Collapse wdCollapseEnd
      .Find.Execute
    Loop
  End With
  .Range.Characters.First.Text = vbNullString
End With
Application.ScreenUpdating = True
End Sub

以上代码假定文本的大部分内容为“常规”样式,而您的章节标题将采用“标题1”样式,其后的段落将采用“标题2”样式。由于您除了说“标题1”外没有说要使用什么样式,因此我只选择了两个内置样式。

答案 1 :(得分:0)

如果我正确理解您的文档,则包含许多章节,并以手动分页符分隔。本章的标题由“章”和另一个词组成,后跟一个空白的段落。

在您的问题中,您指的是“换行符(^ p)”。注意不要将行与段落混淆,因为它们是不同的。 ^ p实际上是一个段落标记,并使用Enter键输入。在Word中也有使用Shift+Enter输入的手动换行符,可以使用^ l找到。

如果分页符的唯一目的是确保章节标题位于新页面上,则没有必要。通过设置“之前的分页符”,可以将您的章节标题样式定义为具有隐式的分页符。

该章标题后面的空白段落也是不必要的。那种间隔方法的需要被打字机淘汰了。而是为您的章节标题样式设置“之后间距”,以提供适当的空间。

Word的内置样式(“普通”除外)均具有描述其预期用途的名称。文档正文中最适合文本的样式是正文。

由于Word的内置样式名称发生更改以反映应用程序语言,因此在引用它们时最好使用WdBuiltinStyle枚举器。大多数样式都有其价值,尽管缺少最新添加的样式。

下面的代码完成了上述所有操作,并使用通配符搜索来避免在文档中添加任何多余的内容。

Sub FormatDocument()
  With ActiveDocument.Range
    'set base style for document
    .Style = wdStyleBodyText
    RemovePageBreaks
    ModifyHeading1
    ' Find chapter headings and apply Heading 1
    With .Find
      .ClearFormatting
      .Text = "Chapter <*>"
      .Replacement.Text = ""
      .Forward = True
      .Wrap = wdFindStop
      .Format = False
      .MatchCase = True
      .MatchWholeWord = False
      .MatchWildcards = True
      .MatchSoundsLike = False
      .MatchAllWordForms = False
      .Execute
    End With

    Do While .Find.Found
      With .Paragraphs.First
        .Style = wdStyleHeading1
        .Next.Style = wdStyleHeading2
      End With
      .Collapse wdCollapseEnd
      .Find.Execute
    Loop
  End With
End Sub

Private Sub RemovePageBreaks()
  With ActiveDocument.Content.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "^m"
    .Replacement.Text = ""
    .Execute Replace:=wdReplaceAll
    'removing the page break leaves an empty para so remove all empty paragraphs
    'this will also remove the unnecessary empty paragraph after the chapter heading
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "^p^p"
    .Replacement.Text = "^p"
    .Execute Replace:=wdReplaceAll
  End With
End Sub

Private Sub ModifyHeading1()
  With ActiveDocument.Styles(wdStyleHeading1).ParagraphFormat
    'add implicit page break
    .PageBreakBefore = True
    'add space after in points
    .SpaceAfter = 12
  End With
End Sub

如果您想了解有关Word中样式的更多信息,请访问Shauna Kelly's website

尽管其中包含的许多文章都比较陈旧,但您可能还会发现Word MVP's的站点很有用。它还包含指向各个MVP网站的链接。