几个不连续的列进入数组

时间:2018-09-19 14:27:41

标签: arrays excel vba

我尝试尽可能高效地将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))

但是这给了我一个类型不匹配的错误。

为此目的有任何巧妙的把戏吗?

2 个答案:

答案 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 ......把它弄对我有点头疼!