Excel VBA Worksheets.Cells返回值而不是范围

时间:2018-05-24 08:42:13

标签: excel vba excel-vba

以下行无效:

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

其中" ReferenceCellColorPlanned"是公式

中的用户输入范围

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

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

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

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

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

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

编辑:我总是尝试过workheets.Range(Cells()),它也不起作用

2 个答案:

答案 0 :(得分:1)

Excel和VBA通常是用户友好的。因此,对象Cell返回一些对用户有意义的东西 - 它的值,而不是像对象的地址那样有点无用的东西,这对于使用的人来说是期望的(参见{ {3}}):

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

如果您熟悉What's the simplest way to print a Java array?,请考虑对象Cells已实施__repr__方法,该方法会返回其值 -

Difference between __str__ and __repr__?中,使用 默认会员 属性实现__repr__

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

Public Sub TestMe()

    Debug.Print Worksheets(1).Cells(1, 1).Interior.Color
    Debug.Print Worksheets(2).Range("A10").Interior.Color

End Sub

答案 1 :(得分:0)

即使Cell在通过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