访问行的单元格的两种方式之间的差异

时间:2017-05-30 07:05:36

标签: excel vba excel-vba

以这些方式访问行的单元格之间的区别是什么:

   Sub test6()
        Dim wRange As Range
        Set wRange = Range("B3:P10")
        For Each aRow In wRange.Rows
            'need to get this row's second column (B)
            Cells(aRow.Row, 4).value = aRow.Cells(1, 2).Address
            Cells(aRow.Row, 5).value = Cells(aRow.Row, 2).Address
        Next
    End Sub

我得到奇怪的结果,取决于范围。此外,我有一个更复杂的程序,在使用这两种方法时也会产生不同的结果。

3 个答案:

答案 0 :(得分:5)

我稍微改变了你的程序并添加了Debug.Print的输出作为评论,以更好地解释为什么这是预期的结果:

Option Explicit 'in the first line of your modules: Ensures you need to declare all variables

Sub test6()
    Dim wRange As Range, aRow As Variant
    Set wRange = Range("B3:P10")

    For Each aRow In wRange.Rows
                                                ' Outputs of the first loop run:
        Debug.Print aRow.Address                ' $B$3:$P$3
        Debug.Print aRow.Cells(1, 2).Address    ' $C$3
        Debug.Print Cells(aRow.Row, 2).Address  ' $B$3
    Next
End Sub

<强>解释
aRow是原始范围$B$3:$P$3中的子范围(B3:P10),其中只包含一行(但不是您假设的工作表的整行),因此aRow.Cells(1, 2)指的是到{2}相对于aRow的{​​{1}},因为范围从C开始,而不是B

A与撰写Cells(aRow.Row, 2)完全相同,并且引用相对于ActiveSheet.Cells(aRow.Row, 2)的第2列ActiveSheet,因为工作表的范围从{{开始1}}。

BA相同,因为现在我们引用从aRow.EntireRow.Cells(1, 2).Address列开始的整行。

旁注:
我建议不要假设工作表并完全限定您的单元格/范围,这样您总能看到单元格相对于哪个范围。

答案 1 :(得分:1)

您的结果并不奇怪,因为aRow.Cells().Address会返回相对于B列的地址,因为wRange的第一列也是B。

所以在你的情况下,你需要这一行:

        ...
        'need to get this row's second column (B)
        Cells(AROW.Row, 4).Value = AROW.Cells(1, 1).Address
                                                '^ relative index
        ...

当你使用没有对象限定符的这个属性时(只需Cells()) - 这会给你一个相对于整个活动工作表的结果!

The RowIndex and ColumnIndex arguments are relative offsets

答案 2 :(得分:0)

Cells(aRow.Row,4)是指ActiveSheet的单元格。 aRow.Cells(1,2)指的是一个范围内的单元格。