我在 VBA 中定义了一个范围变量,它由一个连续的水平单元格组成,比如说,
Dim myRange As Range
Set myRange = Range("A1:H1")
我想引用此范围内第三个位置的值以在计算中使用它(我不需要更改此单元格中的值)。我找到了至少 8 种不同的方法来做到这一点:myRange(1,3)
myRange(3)
myRange(1,3).Value
myRange(3).Value
myRange.Cells(1,3)
myRange.Cells(3)
myRange.Cells(1,3).Value
myRange.Cells(3).Value
这些不同的方法在做什么之间有什么区别吗?哪个(或多个)更可取,为什么?我对执行 myRange.Cells
时发生的事情感到特别困惑- 似乎只会返回 myRange
.我也不完全清楚 myRange(1,3)
返回什么类型的对象。 (或 myRange(3)
等)。
最佳答案
假设您在非引用上下文( without Set
)中使用这些表达式,则有 implicit .Value
在每个没有明确说明的末尾。这给我们留下了:
myRange(1,3).Value
myRange(3).Value
myRange.Cells(1,3).Value
myRange.Cells(3).Value
现在,这些实际上是不同的。myRange(1,3)
查询 Range
即 myRange
的行索引 1、列索引 3 .如果
myRange
恰好有enumeration mode “单元格”,表达式将返回那些坐标处的单元格,但如果 myRange
被枚举为“行”或“列”,你会有一个异常(exception):Dim r As Range
Set r = Me.Range("A1:H1")
Debug.Print r(1, 3).Address ' $C$1
Set r = Me.Range("A1:H1").Columns
Debug.Print r(1, 3).Address ' Run-time error 1004
myRange(3)
查询 Range
即 myRange
的第三项.再次,项目的含义由 enumeration mode 决定。的
myRange
.对于“单元格”,它将返回第三个单元格,从左到右然后从上到下计数。对于“行”或“列”,它将返回整个第三行或列:Dim r As Range
Set r = Me.Range("A1:H10").Columns
Debug.Print r(3).Address ' $C$1:$C$10
Set r = Me.Range("A1:H10").Rows
Debug.Print r(3).Address ' $A$3:$H$3
Set r = Me.Range("A1:H10")
Debug.Print r(3).Address ' $C$1
如果模式是“行”或“列”,并且假设 myRange
包含多个对应维度(“列”或“行”),.Value
将返回一个二维数组。尝试在标量上下文中使用它会引发类型不匹配异常。.Cells
的版本去掉上面描述的不确定性,让你在myRange
的版本上操作这被列举为“细胞”。您现在可以保证获得与“单元格”枚举模式相对应的上述结果。总之,在处理未知来源的范围时,当您想要第一行的第三个单元格时,最安全的做法是
myRange.Cells(1,3).Value
.它也恰好以最清晰的方式表达了意图。
关于excel - 引用范围内单元格值的方式之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63624785/