我尝试尽可能高效地将4列加载到数组。
我尝试过
dim ar
ar = sheet1.Range("C2:C2681,G2:G2681,J2:J2681,T2:T2681")
但是只有第一列被加载到数组中。
我也尝试过
ar = .Range("C2:T" & lastRow)
ar = Application.Index(ar, , Array(1, 5, 19))
但是这给了我一个类型不匹配的错误。
为此目的有任何巧妙的把戏吗?
答案 0 :(得分:2)
带有Preserve的ReDim仅允许您修改最后一个等级,但您可以首先移动数组元素的值。
dim ar as variant, i as long
ar = sheet1.Range("C2:T2681").value
for i=lbound(ar, 1) to ubound(ar, 1)
ar(i, 2) = ar(i, 5) 'move column G to 2nd
ar(i, 3) = ar(i, 8) 'move column J to 3rd
ar(i, 4) = ar(i, 18) 'move column T to 4th
next i
redim preserve ar(lbound(ar, 1) to ubound(ar, 1), lbound(ar, 2) to 4)
答案 1 :(得分:2)
您始终可以将这些列存储在jagged array(一个数组数组)中。在VBA中,语法实际上非常容易。您可以将一个范围的所有.Value
(以数组的形式)存储在另一个(以前是暗淡的)数组中。
当您使用包含多个子范围(连续或不连续)的范围时,可以通过循环访问该范围的.Areas
property来分别访问它们。
您唯一需要注意的是索引,因为语法有点时髦,在您的特定示例中,您不必从第一行开始。
Option Explicit
Sub NonContiguousRanges()
Dim rng As Range
Set rng = Range("C2:C20, G2:G20, J2:J20, T2:T20")
Dim jagged As Variant
ReDim jagged(1 To rng.areas.count)
Dim i As Long
For i = 1 To rng.areas.count
jagged(i) = rng.areas(i).Value2
Next i
'=-~ examples of accessing the values ~-='
'first value, C2
MsgBox jagged(1)(1, 1)
'last value, T20
MsgBox jagged(4)(19, 1)
MsgBox jagged(UBound(jagged))(UBound(jagged(UBound(jagged))), 1)
End Sub
我的意思是只看所有UBound
......把它弄对我有点头疼!