【问题标题】:Setting colors in Hex and Decimal behaving differently以十六进制和十进制设置颜色表现不同
【发布时间】:2012-09-28 17:10:37
【问题描述】:

我正在尝试通过以下方式设置橙色:

WorkSheet.Range("A1:A5").Interior.color = 49407

WorkSheet.Range("A1:A5").Interior.color = &HC0FF 'Hex value of 49407

这两个不应该是完全等价的吗? 设置的颜色不同。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我相信 Gimp 和 Johannes 的回答都忽略了关键问题。

    计算机屏幕上的颜色是通过指定您需要多少红色、蓝色和绿色来定义的。对于这三种颜色中的每一种,您都可以指定一个介于 0 和 255 之间的数字。这三个数字通常通过连接三个单独的数字来指定为一个数字。使用 Html,您可以将颜色指定为 #RRGGBB,其中 RR、GG 和 BB 是十六进制数字,或者您可以将 RRBBGG 替换为等效的十进制数字。在 Excel 中,序列是相反的,所以 &HBBGGRR 或等效的十进制数。

    49407 是 00C0FF 的十进制等值,对于 Excel 表示蓝色 = 0、绿色 = 192 和红色 = 255。

    但是 &HC0FF 或 &H00C0FF 是 -16129 或蓝色 = 255,绿色 = 192 和红色 = 255。这似乎是 &H 转换中的一个缺陷。无论如何我都找不到将 C0FF 转换为 49407 的方法。

    如果你坚持使用 &H 转换,我能提供的最好的方法是:

     Range("A1:A5").Interior.color = &H01C0FF
    

    这是蓝色 = 1、绿色 = 192 和红色 = 255,我无法区分蓝色 = 0、绿色 = 192 和红色 = 255。

    但我会推荐:

    Range("A1:A5").Interior.color = RGB(255,192,0)
    

    因为 RGB 函数总是返回一个正数,你不必担心 Excel 的逆序。

    【讨论】:

    • 是的,你不能跳过前面的 0……关于 int 大小的答案很酷,但这非常实用
    • 这是真正的答案。使用您自己的“标准”Microsoft 的方式。
    【解决方案2】:

    不,这些值不相等:&HC0FF 是 -16129,而 &HC0FF& 是 49407。

    VBA,作为一种相当古老的语言,默认使用 16 位整数。在这个时代,您几乎总是想要 long 而不是 int,但您必须向 VBA 询问它们。

    &HC0FF 是一个从十六进制定义一个 16 位常量的结构。因为当解释为 16 位值时,此值中的符号位被设置(开,负),因此转换为 -16129。我们可能会认为这很糟糕,但这不是一个错误!当您使用 -16129(作为有符号整数)时,在 32 位形式中,1 会传播到整个前 16 位,这会导致蓝色值 255。

    您真正想要的是一个 32 位十六进制常量:&HC0FF&。 最后额外的 & 告诉 VBA 这是一个长常量而不是 int。以 32 位解释,这是一个正值,因此给出您要查找的十进制等效值。

    简而言之,请求带有尾随 & 的长十六进制常量。

    顺便说一句,当使用十进制常量时,VBA 对 16 位的这种倾向也会影响我们,例如在表达式 16000 * 16000 中,这会溢出 16 位算术。因此,有时也需要在十进制常量上使用尾随 &(或先将一个分配给 long)。

    【讨论】:

    • 太棒了!正是我想要的。
    • 惊人的答案。我看到了负面差异,但在阅读您的答案之前不知道为什么会发生这种情况。信息量很大!
    【解决方案3】:

    这会将您拥有的十六进制格式颜色转换为 Office 用于 RGB 颜色的 RGB Long:

    Function HexToLongRGB(sHexVal As String) As Long
        Dim lRed As Long
        Dim lGreen As Long
        Dim lBlue As Long
    
        lRed = CLng("&H" & Left$(sHexVal, 2))
        lGreen = CLng("&H" & Mid$(sHexVal, 3, 2))
        lBlue = CLng("&H" & Right$(sHexVal, 2))
    
        HexToLongRGB = RGB(lRed, lGreen, lBlue)
    
    End Function
    

    【讨论】:

    • +1,还允许从 f.ex 复制十六进制值。 Photoshop 或颜色选择器直接进入数据库表。
    【解决方案4】:

    颜色代码通常由三个值组成,RED、GREEN、BLUE。您的 Hexcode 缺少三者之一,而 excel 正在使用 FF 自动填充它。所以你的颜色 C0FF 被转换为 FFC0FF。

    这是一个示例程序,您可以查看它的运行情况,制作一张新工作表并执行它。

    ' C0FF will be changed to be FFC0FF
    Range("A1").Interior.Color = &HC0FF
    Range("A1").Select
    ActiveCell.FormulaR1C1 = Range("A1").Interior.Color
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
    
    ' 49407 is actually 00C0FF
    Range("B1").Interior.Color = 49407
    Range("B1").Select
    ActiveCell.FormulaR1C1 = Range("B1").Interior.Color
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
    
    ' Use RGB to have better control over your results
    ' Switch the order when doing so: 00C0FF => 00 Blue C0 Green FF Red
    Range("C1").Interior.Color = RGB(&HFF, &HC0, &H0)
    Range("C1").Select
    ActiveCell.FormulaR1C1 = Range("C1").Interior.Color
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
    

    编辑:添加了第三个示例来说明按照不同答案中的建议切换颜色。

    【讨论】:

    • 这清除了很多。谢谢!我已经切换到单独指定 RGB 值,但我想知道是否可以让 excel 直接将其读取为00C0FF
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2019-10-29
    • 2019-06-16
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多