如何使用VBA设置动态范围的单元格?

时间:2015-08-11 11:36:04

标签: excel vba

假设我写了一个循环,但是需要设置很多范围才能生效。如何设置一个范围以包含分散在工作表中的单元格。假设在每一行中,我想从列J,列S,列T中选择单元格....一直到列GB(每列之间有5列)。我的伪脚本是这样的:

Sub CountPubs()


    Dim i, j As Long
    Dim Quant As Range

    i = 2
    j = 5
    While i <= 400

    Set Quant=Cells("I" & i),("I+j" & i),("I+2j" & i)... 

所以Set系列非常糟糕。每次满足条件时,循环本身都会增加,但是我希望在定义的第i行中展开的36个单元也会增加。如何以这样的方式完成Set Quant系列?

编辑:在我的测试中,我甚至无法获得更简单的版本。如果我只是想把它推到T,我想这个剧本将是:

Sub CountPubs()
    Dim Count As Range
    Dim i As Long
    Dim Publications As Range
    i = 2
    Set Count = Range("C" & i)
    Set Publications = Range("I" & i), ("O" & i), ("T" & i)

但是这给了我一个编译错误,错误的参数数量或无效的属性赋值。我在这里错误地定义了最后一个范围吗?

3 个答案:

答案 0 :(得分:3)

您可以使用Union method创建一系列不相邻的单元格。

在您的方案中,您可以使用以下内容:

Sub unionCells()
    Dim i, j As Long
    Dim Quant As Range

    i = 2
    j = 5
    While i <= 400
        Set Quant = Union(Cells(9, i), Cells(9 + j, i), Cells(9 + 2 & j, i))
    Wend
End Sub

您还可以查看有关使用union的this answer

答案 1 :(得分:2)

您将要使用Union method来构建Quant范围。

Dim i As Long, rw As Long, Quant As Range

With ActiveSheet
    rw = 2  'this will work on row 2 from J to GB
    Set Quant = .Cells(rw, "J") 'seed the target range
    'Set Quant = .Cells(rw, "J").Resize(400, 1) 'optional 400 rows deep

    For i = .Columns("J").Column To .Columns("GB").Column Step 5
        Set Quant = Union(Quant, .Cells(rw, i))
        'Set Quant = Union(Quant, .Cells(rw, i).Resize(400, 1)) 'optional 400 rows deep
    Next i

    Debug.Print Quant.Address(0, 0)
End With

我已经包含400行深的选项行。

答案 2 :(得分:1)

union函数的另一种方法是创建一个Ranges数组,在你的循环中,将每个新单元格添加为数组中的下一个项目。

有一些明显的缺点,例如您无法将Range作为一个整体引用,并且您需要在开始向其添加项目之前首先确定数组的大小。但是,它确实有一个好处,它允许您通过引用单个索引号来引用每个单元格。如果您按顺序跟踪单元格,并且您只想通过引用该顺序一次引用单元格1,这可能很有用。这将如下工作[从@Jeeped上面偷来的一些片段]:

Dim i As Long, rw As Long, Quant() As Range, QuantSize As Long

With ActiveSheet

    For i = .Columns("J").Column To .Columns("GB").Column Step 5
        QuantSize = QuantSize + 1 'builds in the size of the array
    Next i

    ReDim Quant(1 To QuantSize) 'Resizes the array to match the total length above

    rw = 2  'this will work on row 2 from J to GB

    For i = .Columns("J").Column To .Columns("GB").Column Step 5
        Set Quant(i) = .Cells(rw, i)
    Next i

End With