我到处搜索过,但是我们无法弄清楚为什么范围变量能够引用指定范围之外的单元格。
例如,如果我写下面的代码:
Dim Rate as Range
Set Rate = Range("A1:A5")
For Each Cell In Rate
Debug.Print Cell.Value
Next Cell
Range("H6").Value = Rate(6).Value
Range("H7").Value = Rate(7).Value
上述例程只打印出" A1:A5"中的5个值。 - 但最后两个语句会导致" A6"和" A7"存储在" H6"和" H7"。
由于变量" Rate"仅被分配到" A1:A5",为什么它能够引用A列中的其他单元格(即" A6"&" A7")?
我做错了吗?任何见解将不胜感激!
答案 0 :(得分:1)
没有错,它只是它的工作原理。我个人喜欢这个"功能"。
如果您更喜欢错误,那么您可以使用类似
Range("H6").Value = Rate.Value2(6, 1) ' .Value2 because .Value(6, 1)
因为Rate.Value2
将提供5 x 1变体数组。或者使用.Value
数组而不是Range:
Dim Rate ' as Variant
Rate = Range("A1:A5").Value ' Variant/Variant(1 To 5, 1 To 1)
Debug.Print Rate(5, 1) ' ok
Debug.Print Rate(6, 1) ' Run-time error '9': Subscript out of range
或
Dim Rate as Variant
Rate = Application.Transpose(Range("A1:A5")) ' Variant/Variant(1 To 5)
Debug.Print Rate(5) ' ok
Debug.Print Rate(6) ' Run-time error '9': Subscript out of range
在您的情况下,Rate(6)
是Rate.Cells(6, 1)
的缩写,类似于.Offset
。例如:
Debug.Print Range("C3:D4")( 1, 1).Address ' prints "$C$3"
Debug.Print Range("C3:D4")(-1, -1).Address ' prints "$A$1"
我能想到使用Range获取错误的唯一方法是改为使用区域:
Dim Rate As Areas
Set Rate = Range("a1,a2,a3,a4,a5").Areas
Debug.Print Rate(5) ' ok
Debug.Print Rate(6) ' Run-time error '9': Subscript out of range