引用数组中的范围

时间:2014-07-02 20:31:15

标签: arrays excel vba range

我有一个代码,如果它们是灰色的,则将单元格变为白色,并将该范围存储在数组中。然后我检查该数组中的每个范围,看它是否为空,图案是否为实色(白色)。如果是,那我把它变成浅灰色。我目前正在测试的代码是

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)) 

部分不起作用,我不确定原因。

2 个答案:

答案 0 :(得分:1)

我怀疑IsEmpty总是返回False,因为只有当变量未初始化时它才会返回True

您需要执行其他操作,例如根据您的数据与零或空字符串进行比较。你最好检查这个

Prev(Counter) = 0

假设您正在处理数字量。这应该有用。


回顾新代码,这里有两点。 Redim Preserve会保留所有全局数据,因此在完成工作后需要将其刷新为空(Redim为0元素)。

其次,你应该尝试设置

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

答案 1 :(得分:0)

请勿使用 IsEmpty()而是使用:

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

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