Excel VBA 工作表.单元格返回值而不是区域



以下行不起作用:

If Worksheets(Specialist).Cells(projectrow, WeekLoop + 4).Interior.Color = ReferenceCellColorPlanned.Interior.Color Then

其中"ReferenceCellColorPlanned"是公式中的用户输入范围

其中"专家"是一个字符串(工作表确实存在(

其中"projectrow"和"WeekLoop"是整数

问题是它总是通过"如果"标准,无论实际背景是什么。所以我尝试调试并设置以下内容(简化代码,只取出所需的位(

Dim Cel1 as Range
Set Cel1 = Worksheets(Specialist).Cells(projectrow, WeekLoop + 4)
If Cel1.Interior.Color = ....

然后我注意到的是 Cel1 实际上返回了一个字符串值,该值是单元格的值,而不是范围值(我觉得这很奇怪,因为据我了解,"Cells"默认情况下是一个范围对象,我将 Cel1 声明为范围变量(。

请帮助我理解为什么 worksheets.cells 返回字符串而不是范围,以及如何让它返回范围,以便我可以检查其背景颜色。谢谢!

编辑:我一直在尝试工作表。范围(单元格(((也是如此,它也不起作用

Excel和VBA通常是用户友好的。因此,对象Cell返回一些对用户有意义的东西 - 它的值,而不是像对象地址这样有点无用的东西,这是使用 Java 的人所期望的(参见:打印 Java 数组的最简单方法是什么?(:

int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(intArray);     // prints something like '[I@3343c8b3'

如果你熟悉 Python,请考虑对象Cells实现了一个__repr__方法,该方法返回其值 - __str__ 和 __repr__ 有什么区别?

在 VBA 中,__repr__是使用"默认成员">属性实现的:

  • 默认成员 (CPearson(
  • "值"实际上是 Range 对象的默认属性吗?
  • VBA 属性 - 高端 VBA (我的网站(
  • VB属性 - 它们是什么以及我们为什么要使用它们(ChristopherMcClellan(

关于.Interior.Color属性,您可以像这样轻松访问它并查看您正在比较的值:

Public Sub TestMe()
Debug.Print Worksheets(1).Cells(1, 1).Interior.Color
Debug.Print Worksheets(2).Range("A10").Interior.Color
End Sub

即使通过 MsgBox 打印时单元格返回其值,您仍然应该能够比较单元格颜色,因为变量本身仍然是范围对象。

以下示例代码对我来说效果很好。

Sub test()
Dim Cel2 As Range
Dim Cel3 As Range
Set Cel2 = Worksheets(1).Cells(1, 1)
Set Cel3 = Worksheets(1).Cells(2, 2)
If Cel2.Interior.Color = Cel3.Interior.Color Then
MsgBox ("YES")
Else
MsgBox ("NO")
End If
End Sub

最新更新