VBA中具有多个非连续列的范围索引

时间:2015-10-08 08:01:07

标签: vba excel-vba excel

考虑以下VBA MWE

Sub test()

Dim rng As Range
Set rng = Range("A:A, C:C")

Dim rRow As Range

For i = 1 To 5
    Set rRow = Intersect(rng, rng.Cells(i, 1).EntireRow)
    rRow.Value = 1
    rRow.Cells(, 2).Value = 2
Next
End Sub

产生类似于此的输出

1   2   1
1   2   1
1   2   1
1   2   1
1   2   1

正如我们所看到的,行rRow.Value = 1将第一列和第三列中的单元格设置为1.现在,我无法理解为什么rRow.Cells(1,2)不会出现问题。 t访问第三列,使输出

1       2
1       2
1       2
1       2
1       2

并将第二列留空,因为这似乎是行rRow.Value = 1中发生的情况。有人可以向我解释这个逻辑吗?

编辑:

评论rRow.Cells(,2).Value = 2,使代码读取

Sub test()

Dim rng As Range
Set rng = Range("A:A, C:C")

Dim rRow As Range

For i = 1 To 5
    Set rRow = Intersect(rng, rng.Cells(i, 1).EntireRow)
    rRow.Value = 1
    'rRow.Cells(, 2).Value = 2
Next


End Sub

产生以下输出

1       1
1       1
1       1
1       1
1       1

其中列A和C用1填充,而列B单独留下。

1 个答案:

答案 0 :(得分:3)

使用Range对象的CellsRange属性(而不是更常见的Worksheet),提供相对于左上角单元格的范围的引用原始范围。它不以任何方式限制在原始范围内的细胞。 因此:

Range("A1").Range("B2")

指的是右边一列和A1下面一行的单元格。这样做:

Range("A1:A10").Range("B2")

请注意,它仍然只引用一个单元格,即使原始范围是10个单元格。 Cells的工作方式完全相同(就像使用Worksheet父级一样)。所以这个:

Range("A1").Cells(2, 2)

和此:

Range("A1:A10").Cells(2, 2)

均指B2。