如何使用WordOpenXML中的颜色编号在Word文档中查找着色

时间:2017-11-08 13:26:14

标签: vba colors ms-word

我必须将每个阴影BackgroundPatternColor更改为Highlight(不要问“为什么?”,我必须) 逐个字符改变非常非常慢。 最快的方法是使用.Find方法。

但是在文档中可以有很多不同的着色颜色(24位颜色)。 在WordOpenXML中是......像这样:

  <w:shd w:val="clear" w:color="auto" w:fill="8064A2">

从这个xml中,我知道文档中使用了“8064A2”着色颜色 - “8064A4”编号是十六进制RRGGBB掩码,其均值RGB(128, 100, 162) - 十六进制“80”是十进制128等。

但是......函数RGB(128, 100, 162)返回10642560。 我正在寻找的阴影返回-687800321

Debug.print Selection.Range.Shading.BackgroundPatternColor

为什么呢?以及如何从RGB接收-687800321号码(因为Selection.Find.Shading.BackgroundPatternColor = -687800321效果很好)

2 个答案:

答案 0 :(得分:0)

我认为这篇文章解释了发生了什么:http://www.wordarticles.com/Articles/Colours/2007BuildSet.php

简而言之,您正在处理主题颜色以及它们似乎从十六进制转换为RGB的原因是因为它们被“亮度 - 黑暗”修改了。口音。

文章介绍了颜色系统的工作原理 - 据我所知,正如您所知,您正在寻找的数字:-687800321,当用HEX编写时:&amp; HD 7 00FFFF (不是RGB);相反,这个符号代表主题颜色&#34;数字7&#34; FFFF的亮度 - 黑暗。

我认为这实际上意味着你需要创建/找到某种转换表来存储在你的转换宏中(或弄清楚所有的主题颜色是什么,做鬼鬼祟祟的事情,见下文)。

Gah,令人讨厌的是,我刚刚意识到情况变得更糟 - 请阅读: http://www.wordarticles.com/Articles/Colours/2007.php

无论如何,基于MS Word存储RGB但仍坚持使用主题信息来查找阴影的理解存在一种解决方案。因此,对于一个简单的2字文档,您有:

<w:r>
    <w:rPr>
        <w:shd w:val="clear" w:color="auto" w:fill="C0504D" w:themeFill="accent2"/>
    </w:rPr>
    <w:t>Red</w:t>
</w:r>
...
<w:r>
    <w:rPr>
        <w:shd w:val="clear" w:color="auto" w:fill="E5B8B7" w:themeFill="accent2" w:themeFillTint="66"/>
    </w:rPr>
    <w:t>Red-Lighter</w:t>
</w:r>

填充值(C0504D)和&amp; (E5B8B7)是RGB,但您必须使用主题信息进行查找和替换,这很烦人......所以,例如,您必须使用w:themeFill="accent2"&amp; w:themeFillTint="66"

然后您可以使用原始文章中的此功能(请参阅下文)将重音 2 和色调 66 转换为无法确定的晦涩数字。

' All Credit to Tony Jollans - http://www.wordarticles.com/Articles/Colours/2007.php
Function GetThemeColor(ThemeColorIndex As WdThemeColorIndex, TintAndShade As Double) As Long

    Const HexadecimalPrefix As String = "&H"
    Const UseThemeColor     As String = "D"
    Const UnusedZeroByte    As String = "00"
    Const Unchanged         As String = "FF"

    Dim ThemeColor          As String
    Dim LightnessOrDarkness As String

    ThemeColor = Hex$(ThemeColorIndex)

    If TintAndShade >= 0 Then
        LightnessOrDarkness = Unchanged & Right$("0" & Hex$((1 - TintAndShade) * &HFF), 2)
    Else
        LightnessOrDarkness = Right$("0" & Hex$((1 + TintAndShade) * &HFF), 2) & Unchanged
    End If

    GetThemeColor = CLng(HexadecimalPrefix & UseThemeColor & ThemeColor & UnusedZeroByte & LightnessOrDarkness)
End Function

答案 1 :(得分:0)

经过长时间的调查,我几乎找到了解决方案。这是我在其他论坛的第二个主题。 https://social.microsoft.com/Forums/pl-PL/2ea570b5-ce3a-4f37-a37c-9b2100941d39/how-to-find-shading-in-word-document-using-color-number-reciving-from-wordopenxml

所有魔法都在位:)

part 1  part 2       part 3        part 4            part 5
fixed   w:themeFill  don't know    w:themeFillShade  w:themeFillTint
1101    0111         00000000      11111111          11111111    

第1部分。 已修复主题颜色(负数)

第2部分。 w:themeFill是WdThemeColorIndex Enumeration(accent4 == 7 == 0111)

第3部分。 还在看这是什么

第4部分。 w:themeFillShade == 11111111(“FF”)如果在xml中被忽略

第5部分。 w:themeFillTint == 11111111(“FF”)如果在xml中被省略

w:如果使用w:themeFill,则填充对颜色编号没有影响。

*差不多,因为9-16位仍然很神秘。