【问题标题】:Excel vba: possible bug when creating a range as a sub-range of another rangeExcel vba:将范围创建为另一个范围的子范围时可能出现错误
【发布时间】:2012-06-27 12:25:23
【问题描述】:

我创建了以下 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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    很奇怪~

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

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

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

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

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

    【讨论】:

    • 我发现如果您删除“单元格”之前的点而不是“范围”之前的点,它也可以工作。我原以为这样做会迫使 vba 使用属于活动工作表的那些单元格,而不是 r 或 rSub。我考虑了一下,我认为它在计算范围时使用了 .Row 和 .Column 值。因此对于 rsub 的 .Cells(1, 1),Row 值为 2。范围的开始也是 2。所以它必须执行类似“CellRow - RangeStartRow + 1”的操作,因此它得出 3
    【解决方案2】:

    这很有趣。

    我认为括号内的 .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`
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多