excel - 引用范围内单元格值的方式之间的差异

标签 excel vba

我在 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)查询 RangemyRange 的行索引 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)查询 RangemyRange 的第三项.
    再次,项目的含义由 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/

    相关文章:

    c# - 如何使用c#在Excel中读取数据列标题和每个单元格的数据

    excel - Excel VBA - 格式 ("7A", "00") 输出 "00"而格式 ("7B", "00") 导致所需的输出 "7A"。为什么它们不同?

    excel vlookup 有多个结果

    vba - 如何根据列或单元格值复制行

    vba - Excel VBA在自动筛选下拉菜单中选择下一个选项

    mysql - excel vba mysql ado连接

    excel - 如何使用Excel的 "=SUMPRODUCT(--ISNUMBER(SEARCH..."函数排除 'complicated compounded'结果?

    excel - 为什么Excel VBA中 'Row'更改为 'row'

    vba - Excel VBA 创建错误

    arrays - 使用具有多个值的筛选列中的唯一值填充数组