【问题标题】:VBA Macro To Format All Headings in Document As BoldVBA宏将文档中的所有标题格式化为粗体
【发布时间】:2019-03-07 05:36:30
【问题描述】:

我正在尝试自动搜索/替换 Word 2013 文档中的标题(请注意,这些不是 Word 样式的标题,而只是用冒号以大写字母键入的文本)。例如:

主要投诉:

体格检查:

搜索和替换只是将标题格式化为粗体,否则必须手动完成,否则标题文本保持不变。无法知道文档中将包含哪些标题(或是否有标题)、哪种顺序或文档的第一行是否包含标题。

手动搜索/替换:^13(*:)

对此:^p\1

有效,除非第一个实例位于文件的开头(不返回)。

我一直使用的宏是这样的:

Sub BoldHeadings()
'
' BoldHeadings Macro
'
Application.ScreenUpdating = False
With ActiveDocument.Range.Find
  .ClearFormatting
  .Replacement.ClearFormatting
  .Format = False
  .Forward = True
  .MatchWildcards = True
  .Wrap = wdFindContinue
  .Text = "^13(*:)"
  .Replacement.Text = "^p\1"
  .Replacement.Font.Bold = True
  .Execute Replace:=wdReplaceAll
  .Replacement.ClearFormatting
End With
Application.ScreenUpdating = True
End Sub

如上所述,这可以正常工作,除非第一个实例位于文件的开头。还有其他方法可以实现吗?

谢谢!

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    试试:

    Sub BoldHeadings()
    Application.ScreenUpdating = False
    With ActiveDocument.Range
      .InsertBefore vbCr
      With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Replacement.Font.Bold = True
        .Text = "^13*:"
        .Replacement.Text = "^&"
        .Format = True
        .Forward = True
        .MatchWildcards = True
        .Wrap = wdFindContinue
        .Execute Replace:=wdReplaceAll
      End With
      .Paragraphs.First.Range.Delete
    End With
    Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

    • 非常感谢!这几乎有效。它完美地处理了文档开头的实例,但如果标题后面没有任何内容(无论标题在文档中的哪个位置),它就会失败。例如,一个标题下面有一个列表——换句话说,在冒号后面是另一个返回。这会导致标题和它下面的列表文本都被加粗。有什么想法吗?
    • 我发布的代码不会在冒号后加粗。如果您正在查找此类内容,那是因为它已经以这种方式进行了格式化。也就是说,您可以尝试将 Find 表达式更改为 "^13[!^13]@:"
    • 新表达式可以解决问题!谢谢!但是,关于您的其他陈述,我不敢苟同。第一个表达式 does 将所有中间文本从一个标题加粗到下一个标题,并且没有任何内容已格式化。如果您不相信我,请在模拟文档上尝试一下。键入 3 个带有冒号的大写标题。在标题 1 上,冒号后面有 2 个空格和一些句子大小写文本:“HEADER1: Blah blah blah。”在 HEADER2: 上,不要在冒号后键入任何文本,而是按回车键并在标题下方键入编号列表。紧随其后的是 HEADER3: 以及冒号后面的更多句子大小写文本。
    • ...继续...完全按照您在上面发布的第一个 Find 表达式运行您的宏,您会发现文档中的所有标题都是如所希望的那样粗体,但是HEADER2 和 HEADER3 之间的所有中间文本(即编号列表)也将是粗体。我认为这是由于 HEADER2 冒号后的返回或编号列表中的返回,或两者的某种组合。不过没关系。您的第二个 Find 表达式是完美的。再次感谢!
    • 原始的 Find 表达式 - 本质上是您自己的 - 查找段落分隔符和冒号之间的所有内容。这种方法的问题在于,使用 * 意味着它将从第一个段落开始并从那里继续,直到找到一个冒号,无论后面可能有多少段。替换表达式将找到的范围限制为单个段落。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多