Excel VBA:范围和单元格的意外结果

时间:2016-03-04 09:40:10

标签: excel-vba range cells vba excel

我正在使用Excel 2013.在我的代码中,我提到我必须在Excel工作表中操作典型数据。例如:

    **Names**  
       Ann  
       Jim  
       Tom  
       Liz  

在引用我的数据集中的特定单元格时,我不想在代码中包含 +1

即,要获得“Ann”,我宁愿使用

Cells(1,1)

大于

Cells (1+1,1)

所以我定义了一个不包括标题的范围:

Set R = Range(Cells(2,1),Cells(5,1)

现在这句话是指“安”

R.Cells(1,1)

接下来我想引用我的范围 R 中的“子范围”:

    R.Range(R.Cells(2,1), R.Cells(3,1))

但令人惊讶的是,现在,而不是预期的“吉姆”和“汤姆”(我的范围内的第二到第三个细胞 R ),我得到了“安”和“吉姆”(第二到第三)在 Excel表格)中。

任何人都可以提供一些关于我在这里缺少什么的见解吗?

由于

1 个答案:

答案 0 :(得分:1)

这是一个不传递继承父母的经典案例。 Cells中的R.Range(Cells(2,1), Cells(3,1))不知道它们属于R所以它们默认为ActiveSheet property,这可能是也可能不是R所属的工作表on( Subscript超出范围错误的问题更多)。

with R
    debug.print .Range(.Cells(2,1), .Cells(3,1)).address
end with

With ... End With statement是传递继承父级的最简单方法。请注意,.Cells而非Cells用于传递引用。它也可以写成,

    debug.print R.Range(R.Cells(2,1), R.Cells(3,1)).address

示例子:

Sub Unexpected_result_with_Range_and_Cells()
    Dim R As Range

    Set R = Range(Cells(2, 1), Cells(5, 1))
    Debug.Print R.Address
    Debug.Print R.Cells(1, 1).Value

    With R
        Debug.Print .Range(.Cells(2, 1), .Cells(3, 1)).Address
        Debug.Print .Cells(2, 1).Value
        Debug.Print .Cells(3, 1).Value
    End With

End Sub

VBE立即窗口的结果:

$A$2:$A$5
Ann
$A$4:$A$5
Jim
Tom