Range.Interior.Color Excel 2007 年及以后的差异

Range.Interior.Color Different Between Excel 2007 and Later

我看到 Range.Interior.Color returns 在某些情况下相同的颜色有不同的数字,这取决于它是 Excel 2007 中的 运行,还是 Excel 2010 或 2013.

这是预期的吗?我很惊讶。

Range.Interior.Color 是单元格的背景颜色 ("Fill Color")。在即时窗格中,您可以这样阅读:

?ActiveCell.Interior.Color

然后这样设置:

ActiveCell.Interior.Color = 10921638

示例:

示例 1:

(虽然 Range.Interior.Color 不同,但颜色相同。)

示例 2:

示例 3:

有什么建议吗?现在,我正在使用条件编译为一个数字或另一个数字设置常量,具体取决于 VBA 常量 VBA7,returns True 对于 Excel 2010 或更高版本和Excel 2007 及更早版本为假:

#If VBA7 Then
    'Excel 2010 or later:
    Const NO_SHADING_COLOR As Long = 16777215
    Const MAIN_HEADER_COLOR As Long = 10921638 'dark gray [in xl2007 s/b 10855845]
    Const SUB_HEADER_COLOR As Long = 14857357 'light blue [in xl2007 s/b 14922893]
    Const SUBSUB_HEADER_COLOR As Long = 14277081 'medium gray [in xl2007 s/b 14211288]
#Else
    'Excel 2007 or earlier:
    Const NO_SHADING_COLOR As Long = 16777215
    Const MAIN_HEADER_COLOR As Long = 10855845 'dark gray
    Const SUB_HEADER_COLOR As Long = 14922893 'light blue
    Const SUBSUB_HEADER_COLOR As Long = 14211288 'medium gray
#End If

更新:

是的,我知道可以使用 RGB 代替 Range.Interior.Color,并且可以从 Range.Interior.Color 中提取 RGB 数字。但是我们可以整天这样做,并且仍然根据 Excel 版本获得不同的 RGB 数字集,这有效地将我们带回了原始问题。

对于任何给定的 Range.Interior.Color 数字,是的,它等同于一组特定的 RGB 数字。但关键是,根据 Excel 版本,在某些情况下,您会在不更改单元格颜色的情况下为同一个单元格获得不同的 Range.Interior.Color 数字。如果您将该数字提取为 RGB 数字,那么根据 Excel 版本,您将拥有不同的 RGB 数字集,这并不比根据版本拥有不同的 Range.Interior.Color 数字更好。

这些单元格颜色由用户设置,使用 Excel 的用户界面来设置单元格的 "Fill Color"。此项目中的 VBA 代码未设置颜色。 VBA 代码仅获取颜色,并根据在正在处理的单元格中找到的颜色进行分支。

除了像 Application.Version 这样明显的例外情况,对象属性在不同版本之间像这样随机更改是不正常的。版本之间对象属性的一致性是允许 VBA 代码跨不同版本工作的重要部分。如果不是这样,我们将不得不条件编译几乎所有 Excel VBA 代码。

您可以使用 RGB() 函数代替这些数字,例如

   Activecell.Interior.Color = RGB(200,150,230)

如果你想要常量,那么

    Const RED = 200
    Const GRN = 150
    Const BLU = 230
    ......
    Activecell.Interior.Color = RGB(RED, GRN, BLU)

至于 "Is it expected?",这里是这样的:Color = 10921638RGB(165, 165, 165)Color = 10855845RGB(166, 166, 166)。我目前无法访问 Excel 2007,但如果在这两种情况下您的颜色值确实是系统的 "dark grey",那么 Microsoft 已在 [=25= 之间更改了 "dark grey" 的值] 版本。我怀疑你不关心或无法看到两者之间的区别......我想你可以考虑在所有版本中使用相同的颜色。

如果您搜索“Excel 颜色代码”,您将找到列出 Excel 的 56 种“官方”颜色的网站。您不会在官方列表中找到您列出的任何号码。

您列出的数字的红色、绿色和蓝色值是:

             Red   Green   Blue 
10855845     165     165    165
10921638     166     166    166
 9868950     150     150    150  Grey 40%

14922893     141     180    227
14857357     141     180    226
16764057     153     204    255  Pale blue

14211288     216     216    216
14277081     217     217    217
12632256     192     192    192  Grey 25%   

在每个子table中,前两行显示您的颜色编号。尽管合并后的数字非常不同,但您会注意到单独的值几乎相同,因此两种替代颜色在屏幕上看起来是一样的。第三行显示最近的官方 Excel 颜色及其名称。

你要调查的问题是:这些不标准的色号是从哪里来的?这些颜色是由程序设置的还是用户对调色板进行了非常微妙的更改?我很难相信微软在这种状态下向你发布了 Excel 2007、2010 和 2013。

新栏目

我一直在玩 Excel 种颜色,我相信您的问题与调色板和使用非标准颜色有关。

我没有你的版本范围,所以用 2003 和 2007 进行了试验。

2003 有一个 56 种颜色的调色板和一个值为 1 到 56 的颜色索引。我相信 Excel 将颜色索引存储在一个单元格中,因为:

  • 如果使用 VBA 将单元格设置为非调色板颜色,Excel 会立即将其更改为调色板颜色。
  • 如果您更改调色板上的颜色,工作簿中每次使用该颜色都会立即更改。

也就是说,对于 2003,您可以拥有任何 56 种颜色,但只有 56 种不同的颜色。

2003年,我新建了一本练习册。在调色板上,我切换了红色和蓝色,并将靛蓝、RGB(51、51、163) 替换为 RGB(167、167、167)。这不是标准的 Excel 颜色,但如果是,它将被命名为灰色 30。我使用这些颜色为一些单元格着色。

我用2007打开了这个工作簿,并保存为xlsm文件。工作表上的颜色看起来没有变化。我选择了一个新单元格并定义了自定义颜色 RGB(167, 167, 167)。从视觉上看,新单元格(在我看来)与从 2003 年导入的 RGB(167, 167, 167) 着色的单元格相同。然后我通过调色板和 VBA:

检查了这些单元格
Colour I    Appearance   Number according      Number according
had set     on screen    to palette            to VBA
255,0,0       Red        0,0,255 Blue          255,0,0
0,0,255       Blue       255,0,0 Red           0,0,255
167,167,167   Grey 30    51,51,153 Indigo      167,167,167      Imported from 2003
167,167,167   Grey 30    167,167,167 Grey 30   167,167,167      Created with 2007

最后一行的含义是,如果在 2007 年内定义,2007 可以正确处理自定义颜色,但会与导入的自定义颜色无可救药地混淆。

我的理解是,2007 年到 2010 年到 2013 年涉及增量改进,但 2003 年到 2007 年是完全重写。我猜 2007 年的一个错误在 2010 年得到修复。

我认为问题在于使用了非标准颜色。 2007 可能有更大的标准调色板,但 RGB(167, 167, 167) 不在上面。我没有 2010 或 2013,但我怀疑如果我用它们中的任何一个尝试这个实验,我会得到不同的结果。

我相信您必须将使用这些自定义颜色的所有单元格重新着色为标准颜色。您报告了两种定制的灰色阴影和一种定制的淡蓝色变体。 2007 年、2010 年和 2013 年是否提供了足够的标准色调和颜色?

更新:

我无法在新工作簿中重现此问题,因此可能是工作簿损坏。通常 Range.Interior.Color 跨版本可靠,代表所有颜色。

FWIW,这个工作簿是另一个人发给我的,那个人在 Excel for Macintosh 而我在 Windows,所以在一个平台上创建工作簿然后使用它另一个可能是腐败的一个因素,如果有的话(即使那应该可以正常工作)。

我一直在做一些项目工作,遇到了一些可能有助于解决整个问题的东西。我一直在研究 Excel 2010(目前无法访问任何更多版本),但发现有不止一种方法可以引用 3 x 8 位颜色。虽然我们都熟悉 RGB(红-绿-蓝)参考,但我遇到了使用 BGR(蓝-绿-红)的人,并且以与原始 post 类似的方式感到非常困惑。我记得很久以前在 XL2003 上工作,发现颜色是 "correct",所以我怀疑 MS 在没有告诉所有人的情况下更改了引用(他们的文档状态为 RGB)。