迭代Excel范围时,值将写入每个第二个单元格

我遍历由.UsedRange()确定的范围中的每一行的列“A”,并将行号写入单元格。 我看到的奇怪的行为是当行号写入单元格时,连续的行号只写入每个第二个单元格:

(1,1)=“1”

(2,1)=空

(3,1)=“2”

(4,1)=空

(5,1)=“3”

(6,1)=空

(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 

我哪里错了?

尝试使用这些方法之一分配循环中的值,避免使用索引/计数器variables。

 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.Row 之外对象/范围。当以这种单索引方式使用时,它看起来有点类似于Offset方法。

例如, Range("B2").Cells(2,1)等于Range("B2").Offset(1,0)等于Range("B3") ,所以通过使用行索引在行本身之外,就是让它跳到下一行:)

通过Chip Pearson的网站有更多关于这方面的信息 :

单元格不需要在这个范围内以便被这样引用。 …没有logging的是,这种引用的方法继续下去的工作表; 范围(“A1:B2”)(5)是指单元格A3,范围(“A1:B2”)(14)是指单元格B7等

尝试:

 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 

这里是我如何理解你的关注:

 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 

希望这是你所需要的。