excel - 迭代 Excel 范围时,值每隔一个单元格写入一次

标签 excel vba

我在由.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/

相关文章:

excel - VBA从excel公式检测到特定结果时自动显示日期

VBA循环遍历文件夹找到工作表打开它并将所有选项卡移动到另一个工作簿

vba - Excel VBA - 删除重复项

html表单输入保存数据

python - 识别单元格是否包含 Word 中的方程式

VBA 迭代有 2 列的变体

c# - 设置范围值仅设置第一个值

excel - VBA application.ontime 不工作

excel - 在 B 列中添加多个名称的首字母

sql - 从 excel 中的列创建逗号分隔的字符串数组以用于 VBA sql 查询