2012-05-23 57 views
2

我创建了以下子部分来简单说明问题。我将活动工作表的范围A2:E10分配给范围变量。然后,到另一个范围变量,我将此范围的子范围(单元格(1,1))分配给(3,3)。Excel vba:将范围创建为另一个范围的子范围时可能存在的错误

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

(该.Row方法返回的范围内的绝对排它被要求)

我希望这两个调用返回2,因为他们都应该引用单元格A2。任何人都可以解释为什么这不是这样吗?

*编辑:我刚才已经改变了子,以便它调用每个范围内的第一个单元格的.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 

回答

1

很奇怪〜

我从你的代码相同的结果。我猜的结果来自于下面的代码:

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

当我删除范围之前,我得到了点结果如我们预期

设置RSUB =范围(.Cells(1,1),.Cells(3,3)))

反正我不知道为什么会这样。

+0

我发现,如果你之前的“细胞”,而不是“范围”前的一个取出点,它也适用。我本以为这样做会强制vba使用属于活动工作表的单元格,而不是r或rSub。 我想过了,我认为它在计算范围时使用了.Row和.Column值。因此对于rsub的.Cells(1,1),Row的值是2.范围的开始也是2.所以它必须做一些类似于“CellRow - RangeStartRow + 1”的事情,因此它会出现3 – Swiftslide

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)相当于:“A3”

Set rSub = r.Range("A2")解析为

您可以使用范围定义内部地址这种方式。例如

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

我知道你没有使用“地址”,在你的代码的任何地方,但就像我说的,我觉得它解析为一个地址。在我的示例中,如果删除“地址”,则会出现运行时错误。