以这些方式访问行的单元格之间的区别是什么:
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
我得到奇怪的结果,取决于范围。此外,我有一个更复杂的程序,在使用这两种方法时也会产生不同的结果。
答案 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}}。
B
与A
相同,因为现在我们引用从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()
) - 这会给你一个相对于整个活动工作表的结果!
答案 2 :(得分:0)
Cells(aRow.Row,4)是指ActiveSheet的单元格。 aRow.Cells(1,2)指的是一个范围内的单元格。