通过以下方式访问行的单元格有什么区别:
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)
完全相同,并且相对于ActiveSheet
是B
引用第2列,因为工作表的范围从A
开始。aRow.EntireRow.Cells(1, 2).Address
与Cells(aRow.Row, 2).Address
相同,因为现在我们引用从A
列开始的整个行。边注:
我建议不要假设工作表完全符合您的单元格/范围,因此您始终会看到这些单元格相对于哪个范围。
关于excel - 访问行单元格的两种方法之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44255677/