【问题标题】:MS Word VBA Style and Pagebreak CleanupMS Word VBA 样式和分页清理
【发布时间】:2021-03-10 22:57:25
【问题描述】:

我公司的工作流程目前包括一个流程,我们从存储库中导出文档,稍微清理一下,然后将其发送到下线以供审核/批准。 “稍微清理一下”涉及运行一个宏,该宏除其他外,对样式进行查找/替换,以将它们从存储库中的内容更改为我们的文档模板指定的内容。因此,例如,存储库为我们提供了“p_body”的样式,我们需要它是“body”。这个宏工作得很好,除了一些我想看看我们是否可以完善的东西。

第一个问题是,当涉及到它提供的样式时,存储库的行为往往有些不可预测。要使用上面的示例,不是以该样式标记所有“p_body”文本,而是返回“p_body”、“p_body_1”、“p_body_1_1”等。目前,宏中的样式切换都是硬编码的,所以要让宏修复某些东西,它必须知道它的存在。因此,如果存储库吐出一种不在宏中的样式,它就不会得到修复。我知道,如果我正在处理 HTML 文档,我可以使用正则表达式来查找“p_body”样式的所有版本,并将它们替换为“body”。有没有办法使用这种更智能的查找/替换版本,而不是对每个需要替换的样式进行硬编码?

第二个问题需要一个单独的问题来解决,所以现在被删掉了。

对于后代,以下是宏查找/替换块之一的样子:

Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("p_body")
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles("body")
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindAsk
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

【问题讨论】:

  • 您应该使用范围对象而不是选择对象。
  • 需要有关此分页问题的更多信息。我在您共享的代码中没有看到任何删除分页符的内容。您可能会考虑将其作为一个单独的问题并共享您拥有的代码。当然,如果您这样做,请通过删除有关分页符的段落来更新此问题。
  • 如果替换样式删除了分页符,则表明原始样式之前包含分页符,但替换样式没有。

标签: vba ms-word


【解决方案1】:

为了处理 p_body 和其他人的样式名称变化,试试这个。您用要查找的名称填充 StyName1 数组,并在 StyName2 数组中放置替换名称。这必须是一对一的比赛。

这只是编码它的众多方法之一。

Sub StyleNames()
    Dim StyName1 As Variant, StyName2 As Variant
    StyName1 = Array("p_body", "p_bold")
    StyName2 = Array("body", "bold")
    
    Dim i As Long
    Dim findStyName As String, replaceName As String
    
    For i = LBound(StyName1) To UBound(StyName1)
        findStyName = StyName1(i)
        replaceName = StyName2(i)
        FindAndReplaceStyles findStyName, replaceName
    Next
    
End Sub

Private Function FindAndReplaceStyles(ByRef findStyName As String, ByRef replaceName As String)
    Dim sty As Word.Style, aStory As Word.Range
    For Each sty In ActiveDocument.Styles
        If InStr(1, sty.NameLocal, findStyName) Then
            For Each aStory In ActiveDocument.StoryRanges
                With aStory.Find
                    .ClearFormatting
                    .Format = True
                    .Forward = True
                    .MatchWildcards = False
                    .Style = sty.NameLocal
                    .Text = ""
                    .Wrap = wdFindStop
                    .Replacement.ClearFormatting
                    .Replacement.Style = replaceName
                    .Replacement.Text = ""
                    .Execute Replace:=Word.wdReplaceAll
                End With
            Next
            Exit For
        End If
    Next
End Function

【讨论】:

  • 这行得通,但我需要一个类似的链来了解我们模板中涵盖的所有不同样式。将这些链接在一起的最佳方式是什么?
  • 这恐怕是退步了;如果我们有源源不断的起始样式可供使用,我可以硬编码一组查找/替换语句,如上所示,我们就准备好了。
  • 更新 我回到最初的建议并设法让它适用于多种样式!不确定这次我做了什么以前没有做过的事情,但是……这有可能奏效。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多