Word VBA - 通过样式应用备用字体颜色不适用于已应用直接格式(字体颜色)的文本

问题描述 投票:0回答:1

我已经创建了一个模板(一系列许多类似模板之一),它将分发给多个用户,用于创建(音频和数字文件)的成绩单。成绩单包括许多将专门用于格式化文本的样式。

该模板包括一系列宏,这些宏临时更改每个自定义样式的字体颜色,以帮助快速校对格式,然后另一个宏将它们全部更改为黑色/自动字体颜色。

只要在任何自定义样式中没有字体颜色的直接格式化,此过程就可以顺利运行。但是,我正在考虑某些用户可能选择选择所有文本并使用直接格式化方法将临时颜色字体恢复为黑色的可能性。如果他们这样做,它会渲染所有以颜色为中心的宏(变为颜色,变回黑色)无用。

这可能是非常有问题的,因为这些用户产生的成绩单最终将提交给分包商,分包商可能希望在将最终成绩单提交给她的客户之前自己使用以颜色为中心的宏进行额外的校对。但如果用户已应用字体颜色的直接格式化,它们将不再有效。

我能够通过使用“清除格式”选项手动和通过宏删除直接格式化字体颜色,然后重新应用样式。但这不是这个难题的实际解决方案,因为任何给定的段落可能包含其他属性,如粗体,下划线或斜体文本,在应用“清除格式”选项时会丢失。我打算将字符样式应用于这些属性,但我无法保证用户会使用它们,因此在尝试处理潜在的字体颜色问题时仍有丢失属性的风险。

我已经在Word中进行了详尽的实验,并在Google上搜索了大量的帮助文件,我找不到任何有助于删除相对于字体颜色的直接格式化的信息,同时保留其他直接格式化属性,以便我可以使用用于更改样式中字体颜色的宏。

我错过了森林的树木,并且这一切都错了吗?或者我的宏代码中是否有一个小元素可以解决这个问题?

我已经复制了下面两个主要的以颜色为中心的宏。实际上有8个额外的宏属于同一类别,因为我还给用户提供了更改单个样式的字体颜色以及QUESTION和ANSWER样式的选项(同时不更改任何其他样式)。但它们只是下面显示的代码的相同片段,配对以处理个别风格。

在此先感谢您的帮助!

将所有样式更改为其他颜色:

    Sub STYLES_AllColors()

        With ActiveDocument.Styles("#CENTERED (DS)")
                .Font.ColorIndex = wdGray50
        End With

        With ActiveDocument.Styles("#FLUSH LEFT (DS)")
                .Font.ColorIndex = wdDarkYellow
        End With

        With ActiveDocument.Styles("#PARENTHETICAL")
                .Font.ColorIndex = wdViolet
        End With

        With ActiveDocument.Styles("#QUESTION (looped)")
                .Font.ColorIndex = wdRed
        End With

        With ActiveDocument.Styles("#ANSWER (looped)")
                .Font.ColorIndex = wdBlue
        End With

        With ActiveDocument.Styles("#QA2 (continuing paragraph)")
                .Font.ColorIndex = wdTurquoise
        End With

        With ActiveDocument.Styles("#QA (plain format)")
                .Font.ColorIndex = wdDarkRed
        End With

    End Sub

将所有样式更改回黑色/自动:

    Sub STYLES_AllBlack()

        With ActiveDocument.Styles("#CENTERED (DS)")
                .Font.Color = wdColorAutomatic
        End With

        With ActiveDocument.Styles("#FLUSH LEFT (DS)")
                .Font.Color = wdColorAutomatic
        End With

        With ActiveDocument.Styles("#PARENTHETICAL")
                .Font.Color = wdColorAutomatic
        End With

        With ActiveDocument.Styles("#QUESTION (looped)")
                .Font.Color = wdColorAutomatic
        End With

        With ActiveDocument.Styles("#ANSWER (looped)")
                .Font.Color = wdColorAutomatic
        End With

        With ActiveDocument.Styles("#QA2 (continuing paragraph)")
                .Font.Color = wdColorAutomatic
        End With

        With ActiveDocument.Styles("#QA (plain format)")
                .Font.Color = wdColorAutomatic
        End With

    End Sub
vba ms-word word-vba
1个回答
0
投票

我现在可能已找到答案,或者至少是一个合适的解决方法。

经过更多的实验,似乎即使直接格式化(字体颜色)已经应用于文本,如果我使用find / replace方法搜索单个样式并更改字体,宏生成的字体更改将起作用,而不是像我一样直接将字体更改应用于样式(在宏内)。这导致了许多额外的格式化样式,但我可以为用户提供指令和工具来防止和/或消除格式化窗格上的混乱。

因此,除非有人提供更优雅的解决方案,否则我现在就会采用这种解决方案。这是个人风格代码的片段。我将不得不扩展它以涵盖所有样式,并创建一个伴随宏来删除所有颜色。

     Selection.Find.ClearFormatting
        Selection.Find.Style = ActiveDocument.Styles("#QUESTION (looped)")
        Selection.Find.Replacement.ClearFormatting
        Selection.Find.Replacement.Style = ActiveDocument.Styles( _
            "#QUESTION (looped)")
        With Selection.Find.Replacement.Font
        .Color = wdColorRed
        End With
        With Selection.Find
            .Text = ""
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
© www.soinside.com 2019 - 2024. All rights reserved.