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

Ans*_*Ans 2 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
Run Code Online (Sandbox Code Playgroud)

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

Pᴇʜ*_*Pᴇʜ 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
Run Code Online (Sandbox Code Playgroud)

说明ː
aRow$B$3:$P$3原始范围之外的一个子范围(),B3:P10它只包含一行(但不是你假设的工作表的整行)所以aRow.Cells(1, 2)引用第2列相对于aRow它是C因为范围是B从不开始的A.

Cells(aRow.Row, 2)与写入完全相同,ActiveSheet.Cells(aRow.Row, 2)并且相对于第2列引用的ActiveSheetB因为工作表的范围是从A.

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

旁注:
我建议不要假设工作表并完全限定您的单元格/范围,以便始终查看单元格相对于哪个范围.