我在由.UsedRange() 确定的范围内遍历每一行的“A”列,并将行号写入单元格。我看到的奇怪行为是当行号写入单元格时,连续的行号只写入每隔一个单元格:
(1,1) = "1"
(2,1) = empty
(3,1) = "2"
(4,1) = empty
(5,1) = "3"
(6,1) = empty
(7,1) = "4"
...
工作表有 10 行,在“A”列中有空单元格,在“B”和“C”列的每个单元格中都有一个单词。当我单步执行代码时,我可以看到行数 (oRow.Row) 像我期望的那样连续迭代,但这些值写在其他地方。我尝试重置 .UsedRange() ,如此处所述:http://www.j-walk.com/ss/excel/tips/tip73.htm但结果没有改变。
我正在使用的代码是:
Option Explicit
Sub IterateAndWrite()
Dim oRange As Range
Dim oRow As Range
Dim lCount As Long
Set oRange = ThisWorkbook.Worksheets(1).UsedRange
For Each oRow In oRange.Rows
oRow.Cells(oRow.Row, 1).Value = oRow.Row
' Reset the range
'lCount = ActiveWorkbook.Worksheets(1).UsedRange.Rows.Count
Next oRow
End Sub
我哪里错了?
最佳答案
尝试使用其中一种方法在循环中分配值,从而避免使用索引/计数器变量。
For Each oRow In oRange.Rows
oRange.Cells(oRow.Row, 1).Value = oRow.Row
Next
或者,这也应该有效:
oRow.Cells(1,1).Value = oRow.Row
为什么?
因为
oRow
是表示 Row
的范围对象,例如,$B$1:$C$1
等。当您使用 .Cells
方法,您传递给它的行参数( oRow.Row
)在 oRow
之外对象/范围。当以这种单索引方式使用时,它似乎有点等价于 Offset
方法。例如,
Range("B2").Cells(2,1)
相当于Range("B2").Offset(1,0)
相当于Range("B3")
,因此,通过使用行本身之外的行索引,您会导致它“跳”到下一行:)有一些关于此的更多信息via Chip Pearson's website :
It is not necessary for the cell to be within the range in order to be referenced this way. ... What is not documented is that this method of referencing continues down the worksheet; e.g., Range("A1:B2")(5) refers to Cell A3, Range("A1:B2")(14) refers to Cell B7, etc.
关于excel - 迭代 Excel 范围时,值每隔一个单元格写入一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106823/