VBA 返回文本的 RGB 颜色

标签 vba ms-word

我已经能够在使用自定义颜色选择颜色的 word 文档中返回文本的 RGB 颜色,但在使用标准颜色时则不能。我最初使用以下代码:

Function GetRGBTest(Colour As Long) As String

GetRGBTest = "rgb(" & (Colour Mod 256) & "," & ((Colour \ 256) Mod 256) & "," & ((Colour \ 256 \ 256) Mod 256) & ")"

End Function

Sub TestColour()

MsgBox GetRGBTest(Selection.Font.Color)

End Sub

使用标准颜色时, selection.font.color 返回负值,RGB 值不正确。

我尝试编辑它以具有以下内容(其中 Dict 是 colorindex 和相应 rgb vals 的列表):
Function GetRGBTest(Colour As Long, colInd As Integer) As String

If Colour > 0 Then
    GetRGBTest = "rgb(" & (Colour Mod 256) & "," & ((Colour \ 256) Mod 256) & "," & ((Colour \ 256 \ 256) Mod 256) & ")"
Else
    colInd = LTrim(Str(colInd))
    GetRGBTest = Dict.Item(colInd)
End If
End Function

Sub TestColour()

MsgBox GetRGBTest(Selection.Font.Color, Selection.Font.ColorIndex)

End Sub

虽然我认为 ColorIndex 返回一个与标准颜色无关的值。

有谁知道如何将这些值转换为 RGB vals?

最佳答案

我无法快速在谷歌上搜索引用,但如果我没记错的话,Word 将返回三种可能的数据格式。
RGB 格式
如果高字节为 &H00那么剩下的三个字节代表红、绿、蓝。这是您熟悉并已经处理的格式。
自动颜色
如果值为 &HFF000000也称为 -16777216然后颜色设置为自动,通常是黑色。否则,它采用文档的默认颜色。
神秘的第三负格式
如果高字节的高半字节为 &HD ,也就是说如果数字的十六进制表示的第一个数字是D,那么它使用Word配色方案格式。
例如,您可能会收到 &D500FFFF第二个半字节,&H5在我们的示例中,最多匹配枚举 WdThemeColorIndex 中的一个值。如果您创建一个从该枚举转换为 MsoThemeColorSchemeIndex 枚举的转换表,则您可以在文档的 ActiveDocument.DocumentTheme.ThemeColorScheme 中查找基本颜色。收藏。为什么你问的同一件事有两个具有不同索引号的枚举?好问题!继续...
然而这并不是故事的结局!还有最后三个剩余字节需要担心!下一个,高字的低字节,我觉得很简单。我相信它总是&H00 .如果您遇到该字节的不同值...好吧,祝您好运。
最后两个字节表示使值变暗或变亮(分别)的百分比。哪里&FF或 255 表示没有变化和 &h00表示 100%。与在颜色选择器中看到的内容相同,例如“Accent 2, Lighter 60%”。顺便说一下,这是&HD500FF66 , 5 是 Accent 2 的索引,&H66在较轻的字节中占 60%。
所以这是一个不考虑较亮和较暗值的函数:

Public Function GetBasicRGB(color As Long) As String
  Dim colorIndexLookup
  Dim colorIndex As Integer
  Dim finalColor As Long
  colorIndexLookup = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2, 1, 4, 3)
  colorIndex = colorIndexLookup( _
      ((color And &HF000000) / &H1000000) _
      + LBound(colorIndexLookup))
  finalColor = ActiveDocument.DocumentTheme.ThemeColorScheme(colorIndex)
  GetBasicRGB = "rgb(" & (finalColor And &HFF) & "," & _
      (finalColor / &H100 And &HFF) & "," & _
      ((finalColor And &HFF0000) / &H10000) & ")"
End Function
为了解决更亮和更暗的问题,我相信您必须将 RGB 值转换为 HSL 值,然后通过更亮或更暗的百分比修改 L 分量。最后转换回RGB。但我现在不想弄清楚。

关于VBA 返回文本的 RGB 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614933/

相关文章:

node.js - 用于跟踪 Microsoft Word 更改/查看修订的 API

ruby-on-rails - 用于解析 .doc 文件的 Ruby 库?

java - Doc4j - 使用文档中的表格将 docx 转换为 PDF 时遇到问题

excel - MS Access VBA 格式 Excel 工作表列作为货币

vba - Excel VBA 循环通过工作表失败

vba - ListRows.Add 似乎不起作用

VBA:如何使VBE中当前光标跳转到最后发生错误的行?

excel - 具有最大宽度条件的自动调整列?

c# - 使用 OpenXML 在 Word 2010 和 2003 中嵌入 Excel 图形

java - 如何使用 Java 编辑 MS Word 文档?