假设我写了一个循环,但是需要设置很多范围才能生效。如何设置一个范围以包含分散在工作表中的单元格。假设在每一行中,我想从列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)
但是这给了我一个编译错误,错误的参数数量或无效的属性赋值。我在这里错误地定义了最后一个范围吗?
答案 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