【问题标题】:Excel VBA: Copying color from Cell.Interior.Color to MSForms.Label.BackColorExcel VBA:将颜色从 Cell.Interior.Color 复制到 MSForms.Label.BackColor
【发布时间】:2013-01-09 16:16:57
【问题描述】:

我在 Excel 2003 中有一个用户表单,其中包含一些 MSForms.Label 控件。我想设置每个控件的 .BackColor 属性,使它们与工作表上某些单个单元格的颜色相匹配。

为此,我正在读取这些单元格的 .Interior.Color 属性,将其转换为十六进制并使用该值来设置 Label 对象的 .BackColor 属性。

我的问题是来自 .Interior.Color 的值在第一次读取时几乎总是不正确。我已经通过在 VBA 编辑器即时窗口中运行以下命令对此进行了测试:

Print Hex([sourceCell].Interior.Color)

这个命令在第一次几乎总是给出错误的值,但从第二次开始给出正确的值。如果我更改 [sourceCell] 的填充颜色并再次运行命令,它将执行相同的操作,即第一次错误值,第二次正确值。

有问题的单元格都填充了图表线条/填充颜色选择中的颜色(即,您可以在 Excel 的“模式”选项卡下的“单元格格式”对话框中看到的底部两行)。这些颜色已被我修改为提供一组自定义颜色,并且很明显,“错误”值似乎与 Excel 的自定义颜色选择范围的默认值相匹配(即,当您开始时获得的默认图表线/填充颜色)新工作簿)。

有其他人经历过这种行为/有解决方法吗?当我尝试在运行时读取两次值时,它不起作用,即它没有切换到正确的值。必须停止代码并重新加载用户表单以强制输出“正确”值。

【问题讨论】:

  • 如果没有成为 QA 专家 +1 就无法通过这个 - 很好!顺便问一下,您尝试过其他 Excel 版本吗?
  • 恐怕这里无法访问任何其他版本:(

标签: excel vba colors userform backcolor


【解决方案1】:

通过 Application.OnTime 组合/解决方法。

如果我运行用户表单准备代码以设置标签对象的背景色并隐藏用户表单,然后将主代码设置为从即时 OnTime 事件运行(确保重新运行准备代码作为 OnTime 的一部分)然后我可以在显示表单时强制 Excel 给我正确的“第二轮”值。

【讨论】:

  • 进一步说明:此行为不限于用户窗体,它是读取颜色值的问题。从例如复制颜色时一个细胞到另一个细胞,我发现了完全相同的行为。 ColorIndex OTOH 第一次可靠工作(但不适合用户表单,所以我仍然需要上面的原始 OnTime 解决方案)。
【解决方案2】:

这对我有用:

MyForm.MyControl.BackColor = Range(myrange).Interior.Color

.Interior.Color 返回一个 Variant,其中包含采样范围的 RGB。

.Interior.ColorIndex 总是返回 -4140 或一些奇怪的东西,可能是因为 .ColorIndex 是 Excel2003 的颜色限制所特有的。

【讨论】:

  • 我实际上并没有使用.ColorIndex。问题出在.Color 属性上,并不是该方法本身不起作用,而是它第一次不起作用。
猜你喜欢
  • 1970-01-01
  • 2023-02-08
  • 2023-01-28
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多