Excel 2007和更高版本中的Range.Interior.Color不同

我发现在某些情况下,Range.Interior.Color会返回相同颜色的不同数字,具体取决于它是在Excel 2007还是Excel 2010或2013中运行。

这是预期的? 我很惊讶。

Range.Interior.Color是单元格的背景颜色(“填充颜色”)。 在“即时”窗格中,可以像这样读取它:

?ActiveCell.Interior.Color

并设置它像这样:

ActiveCell.Interior.Color = 10921638

例子:

例1:

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

  • Excel 2007:10855845
  • Excel 2010/2013:10921638

例2:

  • Excel 2007:14922893
  • Excel 2010/2013:14857357

例3:

  • Excel 2007:14211288
  • Excel 2010/2013:14277081

有什么build议么? 现在,我使用条件compliling来为一个数字或其他数据设置常量,具体取决于VBA常量VBA7,该值返回True for Excel 2010或更高版本,False for 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的intead,并且可以从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代码。

如果您search“Excel颜色代码”,您会发现列出Excel的56“官方”颜色的网站。 你不会在官方列表中find你列出的任何号码。

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

  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存储对单元格的颜色索引,因为:

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

也就是说,2003年,你可以有56种颜色,但只有56种不同的颜色。

在2003年以前,我创build了一个新的工作手册。 在调色板上,我切换了红色和蓝色,我用RGB(167,167,167)replace了Indigo,RGB(51,51,163)。 这不是一个标准的Excel颜色,但如果是的话,它将被命名为Grey 30。我使用这些颜色为几个单元格着色。

我在2007年打开了这个工作簿,并保存为一个xlsm文件。 工作表上的颜色没有变化。 我select了一个新的单元格,并定义了RGB的自定义颜色(167,167,167)。 从视觉上看,新的细胞与我从2003年import的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年的一个bug在2010年得到修复。

我相信问题是使用非标准的颜色。 2007年可能有一个更大的标准调色板,但RGB(167,167,167)不在其上。 我没有2010年或2013年,但怀疑我会得到不同的结果,如果我与他们任何一个尝试这个实验。

我相信你必须使用标准颜色对所有使用这些自定义颜色的单元格重新着色。 您可以报告两种自定义的灰色阴影和淡蓝色的自定义变化。 当然,2007年,2010年和2013年提供足够的标准色调和颜色?

更新:

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

FWIW,这个工作簿是由另一个人发给我的,那个人在Windows上是用于Macintosh的Excel,所以在一个平台上创build工作簿,然后在另一个平台上使用工作簿可能是腐败的一个因素(即使这应该很好)。

我一直在做一些项目的工作,并且遇到了一些可能有助于解决整个问题的方法。 我一直在使用Excel 2010(目前还无法访问更多版本),但发现有多种方法可以引用3 x 8位颜色。 虽然我们都熟悉RGB(红 – 绿 – 蓝)参考文献,但遇到了使用BGR(蓝绿 – 红)的人,并且以与原文相似的方式感到困惑。 我记得很久以前在XL2003上做的工作,发现颜色是“正确的”,所以我怀疑MS没有告诉大家(他们的文档状态为RGB)改变了引用。

您可以使用RGB()函数而不是这些数字,例如

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

那么如果你想要常量的话

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

至于“是否预期?”,这是这样的: Color = 10921638RGB(165, 165, 165) Color = 10921638 RGB(165, 165, 165)Color = 10855845RGB(166, 166, 166) Color = 10855845 RGB(166, 166, 166) 。 我目前无法访问Excel 2007,但是如果在这两种情况下,您的颜色值确实是系统的“深灰色”,那么Microsoft已经更改了Excel版本之间“深灰色”的值。 我怀疑你不在乎或看不出两者之间的区别…你可能会考虑在所有版本中使用相同的颜色,我想。