通过以下方式访问行的单元格有什么区别:

   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


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

最佳答案

我稍微更改了您的过程,并添加了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)相对于aRow指的是第2列这是C,因为范围以B开头,而不是A

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

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

边注:
我建议不要假设工作表完全符合您的单元格/范围,因此您始终会看到这些单元格相对于哪个范围。

关于excel - 访问行单元格的两种方法之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44255677/

10-11 05:08