在数组中引用范围

我有一个代码,如果它们是灰色,将单元格变成白色,并将该范围存储在数组中。 然后我检查数组中的每个范围,看看它是否为空,模式是固体(白色)。 如果是这样,那么我把它变成一个较浅的灰色阴影。 我的代码来testing这是目前

Dim Prev() As Range 'I also tried Prev() As Variant and have the same problem Dim PrevCount As Long Dim Counter As Long Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Interior.Pattern = xlGray50 Then Target.Interior.Pattern = xlSolid PrevCount = PrevCount + 1 ReDim Preserve Prev(1 To PrevCount) Set Prev(PrevCount) = Target End If For Counter = LBound(Prev) To UBound(Prev) If IsEmpty(Prev(Counter)) And Prev(Counter).Interior.Pattern = xlSolid Then Prev(Counter).Interior.Pattern = xlGray25 End If Next End Sub 

没有发生错误,但符合两个条件的数组范围都不变为灰色。 我知道这个数组没有什么问题,因为如果我这样做,它就可以工作

 For Counter = LBound(Prev) To UBound(Prev) If Prev(Counter).Interior.Pattern = xlSolid Then Prev(Counter).Interior.Pattern = xlGray25 End If Next 

所以

 If IsEmpty(Prev(Counter)) 

部分不起作用,我不知道为什么。

我怀疑IsEmpty总是返回False ,因为只有在variables没有被初始化的时候它才会返回True

您需要根据您的数据做一些其他的比较零字符或空string。 最好是你检查一下

 Prev(Counter) = 0 

假设你正在处理数字量。 这应该工作。


回顾新的代码,这里有两点。 Redim Preserve保留所有全局数据,所以一旦你的工作完成,它需要被清空(Redim to 0 elements)。

其次,你应该尝试设置

 Dim Test as Integer Test = CInt(Prev(x).Value) if Test = 0 Then .... so on and so forth 

不要使用IsEmpty()而是使用:

 If Prev(Counter) = "" And Prev(Counter).Interior.Pattern = xlSolid Then 

要么

 If cStr(Prev(Counter).Value) = "" And Prev(Counter).Interior.Pattern = xlSolid Then