2

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

我原以为这将包括 A2 到 C4 的范围(因为 A2 是第一列,较大范围的第一行)。但是,当我调用每个范围的第一个单元格的 .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
4

2 回答 2

1

好奇怪~

我从您的代码中得到了相同的结果。我猜结果来自以下代码:

设置 rSub = .Range(.Cells(1, 1), .Cells(3, 3))

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

设置 rSub = Range(.Cells(1, 1), .Cells(3, 3)))

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

于 2012-05-24T04:12:25.697 回答
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`

我意识到您没有在代码中的任何地方使用“地址”,但就像我说的,我认为它可以解析为地址。在我的示例中,如果我删除“地址”,则会出现运行时错误。

于 2012-06-27T04:25:23.497 回答