【问题标题】:several non contiguous columns into array几个不连续的列到数组中
【发布时间】:2019-02-23 18:25:15
【问题描述】:

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

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

有什么聪明的办法可以达到这个目的吗?

【问题讨论】:

  • 将它们放入 4 个不同的数组中。如果你想循环它们并将它们放在一个数组中。
  • 确实简单高效。
  • @ScottCraner 你能回答吗?
  • 在会议中,在我的手机上。反正我更喜欢吉普的回答。
  • @ScottCraner 我明白了,添加了一个你想要的答案类型

标签: arrays excel vba


【解决方案1】:

您始终可以将这些列存储在 jagged array 中,这是一个数组数组。语法在 VBA 中实际上非常简单;您可以将一个范围(以数组的形式)的所有.Values 存储在另一个(以前变暗的)数组中。

当您使用包含多个子范围(连续或不连续)的范围时,您可以通过在该范围的 .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

我的意思是看看所有那些 UBounds... 只是让我有点头疼!

【讨论】:

    【解决方案2】:

    ReDim with Preserve 只允许您修改最后一个排名,但您可以先移动数组元素的值。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2016-08-26
      相关资源
      最近更新 更多