我正在遍历专栏" A"由.UsedRange()确定的范围中的每一行,并将行号写入单元格。我看到的奇怪行为是当行号写入单元格时,连续的行号仅写入每隔一个单元格:
(1,1)=" 1"
(2,1)=空
(3,1)=" 2"
(4,1)=空
(5,1)=" 3"
(6,1)=空
(7,1)=" 4"
...
工作表有10行,列中有空单元格" A&#34 ;,两列中每个单元格中有单个单词" 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
我哪里错了?
答案 0 :(得分:0)
尝试:
Sub IterateAndWrite()
Dim oRange As Range
Dim oRow As Range
Dim lCount As Long
Set oRange = ThisWorkbook.Worksheets(1).UsedRange
For lCount = 1 To oRange.Rows.Count
oRange.Cells(lCount, 1).Value = oRange.Cells(lCount, 1).Row
Next
End Sub
答案 1 :(得分:0)
以下是我对您的关注的理解:
Option Explicit
Sub IterateAndWrite()
Dim oRange As Range
Dim oRow, range_to_write As Range
Set oRange = ThisWorkbook.Worksheets(1).UsedRange
'you need to set the range where you want to write as in below
Set range_to_write = oRange.Offset(, -1).Resize(, 1)
'here instead of rows, use cells since you are to iterate cells
For Each oRow In range_to_write.Cells
oRow.Value = oRow.Row 'oRow is now a range pertaining to a Cell
Next oRow
End Sub
希望这就是你所需要的。
答案 2 :(得分:0)
尝试使用其中一种方法在循环中指定值,这样就无需使用索引/计数器变量。
For Each oRow In oRange.Rows
oRange.Cells(oRow.Row, 1).Value = oRow.Row
Next
或者这也应该有效:
oRow.Cells(1,1).Value = oRow.Row
<强> WHY吗
因为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的更多信息:
单元格不必在此范围内,以便以这种方式引用。 ... 没有记录的是这种引用方法仍在继续 在工作表上;例如,Range(“A1:B2”)(5)指的是Cell A3, 范围(“A1:B2”)(14)指的是Cell B7等。