我看到Range.Interior.Color在某些情况下会返回相同颜色的不同数字,具体取决于它是在Excel 2007或Excel 2010或2013中运行。
这是预期的吗?我很惊讶。
Range.Interior.Color是单元格的背景颜色(“填充颜色”)。在“立即”窗格中,您可以这样阅读:
?ActiveCell.Interior.Color
并设置如下:
ActiveCell.Interior.Color = 10921638
示例:
示例1:
(虽然它们的Range.Interior.Color不同,但颜色相同。)
示例2:
示例3:
有什么建议吗?现在,我正在使用条件编译来为一个数字或另一个设置常量,具体取决于VBA常量VBA7,对于Excel 2010或更高版本返回True,对于Excel 2007及更早版本返回False:
#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的用户界面设置单元格的“填充颜色”。此项目中的VBA代码未设置颜色。 VBA代码只获取颜色,并根据正在处理的单元格中找到的颜色进行分支。
除了像Application.Version这样的明显异常之外,对象属性从版本到版本随机改变是不正常的。版本之间对象属性的一致性是允许VBA代码跨不同版本工作的重要部分。如果不是这样,我们必须对所有Excel VBA代码进行条件编译。
答案 0 :(得分:2)
如果您搜索“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%
在每个子表中,前两行显示您的颜色编号。虽然组合数字非常不同,但您会注意到单独的值几乎相同,因此两种替代颜色在屏幕上看起来相同。第三行显示最接近的官方Excel颜色及其名称。
您需要调查的问题是:这些非标准颜色编号来自何处?这些颜色是由程序设置还是用户对调色板进行了微妙的更改?我发现很难相信微软在这个州发布了Excel 2007,2010和2013.
新版
我一直在玩Excel颜色,我确信你的问题与调色板和非标准颜色的使用有关。
我没有对2003和2007进行过实验的各种版本。
2003年有56种颜色的调色板和颜色索引,值为1到56.我相信Excel会将颜色索引存储在单元格中,因为:
也就是说,2003年你可以有56种颜色但只有56种颜色。
2003年,我创建了一个新工作簿。在调色板上,我切换了红色和蓝色,我用RGB(167,167,167)替换了Indigo,RGB(51,51,163)。这不是标准的Excel颜色,但是,如果它是,它将被命名为Grey 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年提供足够的标准色调和颜色?
答案 1 :(得分:0)
更新
我还没有能够在新工作簿中重现此问题,因此可能是工作簿损坏。通常,Range.Interior.Color在各种版本中都是可靠的,适用于所有颜色。
FWIW,这个工作簿是由另一个人发送给我的,当我在Windows上时,那个人在Excel上用于Macintosh,因此在一个平台上创建工作簿然后在另一个平台上使用它可能是腐败的一个因素,如果有的话(即使它应该可以正常工作)。
答案 2 :(得分:0)
我一直在为一个项目做一些工作,并且遇到了一些可能对整个问题有帮助的事情。我一直在研究Excel 2010(目前暂时无法访问任何版本),但发现有多种方法可以引用3 x 8位颜色。虽然我们都熟悉RGB(红 - 绿 - 蓝)参考,但我遇到了一个使用BGR(蓝 - 绿 - 红)的人,并且以与原始帖子类似的方式感到非常困惑。我记得很久以前在XL2003上做过工作,发现颜色是"正确",所以我怀疑MS在没有告诉所有人的情况下更改了引用(他们的文档说明了RGB)。
答案 3 :(得分:-1)
您可以使用RGB()函数代替这些数字,例如
Activecell.Interior.Color = RGB(200,150,230)
如果你想要常数,那么
Const RED = 200
Const GRN = 150
Const BLU = 230
......
Activecell.Interior.Color = RGB(RED, GRN, BLU)
至于#34;是否可以预期?",此处为:Color = 10921638
为RGB(165, 165, 165)
而Color = 10855845
为RGB(166, 166, 166)
。目前我无法访问Excel 2007,但如果您的颜色值确实是系统的"深灰色"在这两种情况下,微软都改变了"深灰色" Excel版本之间。我怀疑你并不关心或能够看到两者之间的差异...我认为你可能会考虑在所有版本中使用相同的颜色。