我创建了以下子项来简单地说明问题。我将活动工作表的范围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
答案 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`
我意识到你没有在你的代码中的任何地方使用“地址”,但就像我说的那样,我认为它解析为一个地址。在我的示例中,如果我删除“地址”,我会收到运行时错误。