【发布时间】: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 集合,它们都会显示为正在使用中。