【问题标题】:Regex + Word Macro for Replacing Styles用于替换样式的正则表达式 + Word 宏
【发布时间】:2020-06-21 16:38:22
【问题描述】:

我有一堆不同样式的文档,我一直将它们添加到一个长宏中,该宏会查找并用正确的样式替换这些样式。现在,我只是添加到列表中,因为我发现了错误的样式。例如,可以有标题 1、标题 1、H1 或 h1。我现在想为每一个写一个查找和替换函数。更酷的是,如果我可以使用 Regex 为这些类型的事情编写一个 catch all 宏: (h|H).{6}\s1 (不是最好的 Regex 编写器,所以请耐心等待)。理想情况下,这将捕获标题 1 的任何变化(尽管它不会捕获 h1、H1 情况,尽管我可以很容易地添加它。

我知道 VBA 支持正则表达式。我已经添加了对它的引用。我也知道这将如何用于替换特定文本。我没有替换文本。仅格式化。我没有玩太多。我只想知道在专门使用样式时是否可以使用正则表达式。下面是函数现在的样子:

Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Heading 1")
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("SSC TOC 2")
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

我只是记录下来。现在,我可以用 Regex 代替那个字符串吗,像这样:

Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles(someRegex function (h|H).{6}\s1)
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("SSC TOC 2")
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

基本上只是使用函数 someRegex 函数 (h|H).{6}\s1 代替字符串文字。有没有办法做到这一点?非常感谢任何指导或帮助!

【问题讨论】:

  • 虽然我不是正则表达式的粉丝,但老实说,我不认为这对它来说是一个特别好的问题。我的建议是创建一个列表,列出要搜索的不同可能性(可能在文本文件中,但不必如此)。然后使用该列表搜索样式。否则,您将花费很长时间在正则表达式上绊倒以使其正确,并且您仍然可能会错过其他不同的拼写。我认为您最终会得到一个正则表达式列表,而您自己提出一个样式(错误)名称列表会更简单。
  • 我一直在考虑它,它可能无论如何都会失败,因为如果样式不存在,脚本就会死掉。所以你可能是对的。知道仍然会很有趣。
  • 一种方法是获取文档中的styles that are currently in use 列表,并将其与拼写错误的替换列表进行比较。
  • 这很好。在我开始之前,我试图通过 GUI 找到 Styles.In.use 但找不到。很高兴知道我可以从 VBA 中提取它。
  • 要使用 GUI 查看正在使用的样式:显示样式窗格 (Alt+Ctrl+Shift+S),单击选项,将“选择要显示的样式”设置为“正在使用”。您应该知道 InUse 属性可能不可靠,例如如果您循环浏览了 Styles 集合,它们都会显示为正在使用中。

标签: regex vba ms-word


【解决方案1】:

您可以使用以下宏来删除文档中所有未使用的用户定义样式(链接样式除外),并清理您提到的各种 H1 等样式:

Sub CleanUpStyles()
Application.ScreenUpdating = False
Dim Doc As Document, bDel As Boolean, bHid As Boolean
Dim Rng As Range, StlNm As String, i As Long
bHid = ActiveWindow.View.ShowHiddenText
ActiveWindow.View.ShowHiddenText = True
Set Doc = ActiveDocument
With Doc
  For i = .Styles.Count To 1 Step -1
    With .Styles(i)
      If .BuiltIn = False And .Linked = False Then
        bDel = True: StlNm = .NameLocal
        For Each Rng In Doc.StoryRanges
          With Rng
            With .Find
              .ClearFormatting
              .Format = True
              .Style = StlNm
              .Execute
            End With
            If .Find.Found = True Then
              If StlNm Like "[Hh]*#" Then
                If StlNm <> "Heading " & Right(StlNm, 1) Then
                  .Style = "Heading " & Right(StlNm, 1)
                  bDel = True
                End If
              Else
                bDel = False
              End If
              Exit For
            End If
          End With
        Next
        If bDel = True Then .Delete
      End If
    End With
  Next
End With
ActiveWindow.View.ShowHiddenText = bHid
Application.ScreenUpdating = True
End Sub

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2021-04-28
    • 2019-05-11
    • 2020-08-31
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多