首页 > 解决方案 > 引用范围内单元格值的方式之间的差异

问题描述

我在 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)等)返回什么类型的对象。

标签: excelvba

解决方案


假设您在非引用上下文(没有Set)中使用这些表达式,则在每个没有明确包含它的末尾都有隐含。.Value这给我们留下了:

myRange(1,3).Value
myRange(3).Value

myRange.Cells(1,3).Value
myRange.Cells(3).Value

现在,这些实际上是不同的。

  • myRange(1,3)Range位于 RowIndex 1、ColumnIndex 3的查询myRange

    如果myRange碰巧有“单元格”的枚举模式myRange,则表达式将返回那些坐标处的单元格,但如果枚举为“行”或“列”,则会出现异常:

    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

    item的含义再次由 的枚举模式决定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. 它也恰好以最清晰的方式表达了意图。


推荐阅读