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

时间:2013-10-01 02:06:11

标签: excel vba

我正在遍历专栏" 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

我哪里错了?

3 个答案:

答案 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等。