Excel vba:将范围创建为另一个范围的子范围时可能出现的错误

时间:2012-05-23 23:16:26

标签: excel-vba vba excel

我创建了以下子项来简单地说明问题。我将活动工作表的范围A2:E10分配给范围变量。然后,到另一个范围变量,我分配这个范围的子范围,单元格(1,1)到(3,3)。

我原本预计这将包括A2到C4的范围(因为A2是第一个col,更大范围的第一行)。但是,当我调用每个范围的.Row方法时 第一个单元格,我得到不同的结果:较大的范围r返回“2”,而较小的范围rSub返回“3”。

(。Row方法返回调用它的范围的绝对行)

我希望这两个调用都返回2,因为它们都应该引用单元格A2。谁能解释为什么不是这样呢?

*编辑:我刚刚更改了sub,以便它调用每个范围的第一个单元格的.Column方法,就像它执行.Row方法一样。如您所料,这两个范围都会返回“1”。

Sub test()
    Dim r As Range
    Set r = Range("A2:E10")

    MsgBox r.Cells(1).Row     '= 2

    Dim rSub As Range
    With r
        Set rSub = .Range(.Cells(1, 1), .Cells(3, 3))
    End With

    MsgBox rSub.Cells(1).Row     '= 3
End Sub

2 个答案:

答案 0 :(得分:1)

很奇怪〜

我从你的代码得到了相同的结果。我想结果来自以下代码:

设置rSub = .Range(。细胞(1,1),。细胞(3,3))

当我在Range之前移除了点时,我得到了我们预期的结果

设置rSub =范围(。细胞(1,1),。细胞(3,3)))

无论如何,我不知道为什么会这样。

答案 1 :(得分:0)

这很有趣。

我认为括号内的.cells(3,3)正在解析为一个地址,它基本上就像一个范围内的偏移量。这是一个更简单的版本,产生类似的结果:

Sub test()
Dim r As Range
Dim rSub As Range

Set r = Range("A2")
Set rSub = r.Range(r.Cells(1).Address) '"A2"
Debug.Print rSub.Cells(1).Address
End Sub

Set rSub = r.Range(r.Cells(1).Address)相当于:

Set rSub = r.Range("A2")解析为“A3”。

您可以通过这种方式在范围定义中使用地址。例如

`? Activesheet.Range("A10:A20").Range("A2").Address` yields `$A$11`

我意识到你没有在你的代码中的任何地方使用“地址”,但就像我说的那样,我认为它解析为一个地址。在我的示例中,如果我删除“地址”,我会收到运行时错误。