我有以下(表面上很简单)任务:
使用 VBA 将电子表格中多列的值复制到二维数组中。
为了让生活更有趣,这些柱子并不相邻,但它们的长度都是一样的。显然,可以通过依次遍历每个元素来做到这一点,但这似乎非常不雅。我希望有一个更紧凑的解决方案 - 但我很难找到它。
以下是我认为“一种简单方法”的一些尝试——为简单起见,我将范围设置为A1:A5, D1:D5
——两个范围内总共有 10 个单元格。
Private Sub testIt()
Dim r1, r2, ra, rd, rad
Dim valString, valUnion, valBlock
Set r1 = Range("A1:A5")
Set r2 = Range("D1:D5")
valString = Range("A1:A5,D1:D5").Value
valUnion = Union(r1, r2).Value
valBlock = Range("A1:D5").Value
End Sub
当我查看这些变量中的每一个时,前两个具有维度(1 To 5, 1 To 1)
,而最后一个具有(1 To 5, 1 To 4)
. 我期待获得(1 To 5, 1 To 2)
前两个,但事实并非如此。
如果我可以一次遍历一列数据,并将一列中的所有值分配给数组中的一列,我会很高兴——但我也不知道该怎么做。就像是
cNames = Array("A", "D")
ci = 1
For Each c in columnNames
vals( , ci) = Range(c & "1:" & c & "5").Value
ci = ci + 1
Next c
但这不是正确的语法。我想得到的结果将通过
cNames = Array("A", "D")
ci = 1
For Each c in columnNames
For ri = 1 To 5
vals(ri , ci) = Range(c & "1").offset(ri-1,0).Value
Next ri
ci = ci + 1
Next c
但这很丑陋。所以这是我的问题:
是否可以将“复合范围”(多个非连续块)的值放入数组中 - 一次全部或一次列?如果是这样,我该怎么做?
对于额外的奖励积分 - 谁能解释为什么返回的数组testIt()
是有尺寸的Base 1
,而我的 VBA 设置为Option Base 0
?换句话说——他们为什么不(0 To 4, 0 To 0)
呢?这只是微软方面的又一个不一致之处吗?