在VBA中使用2D数组填充3D数组

时间:2015-06-03 22:21:25

标签: arrays excel vba excel-vba

我有一组数据,其中每个项目都有一个与之对应的二维信息数组。我想创建一个3D数组,其中第一个维度是项目名称,第二个和第三个维度由与项目对应的信息占用。

我可以将每个项目的数据读入2D数组,但我无法弄清楚如何将2D数组读入3D数组。

我知道所有尺寸的尺寸,所以在开始读写过程之前我可以创建一个固定尺寸的数组。

我想通过仅通过项目的名称循环而不循环遍历每个2D数组的每个单元格来实现此目的。

很容易将2D数组读入ArrayList,但我希望能够为这些项命名,并能够将这些项重新读取为excel,并且使用ArrayList似乎很难。

问题是:如何从Excel中读取2D选择到VBA中的3D固定大小的数组?

1 个答案:

答案 0 :(得分:1)

以下是每种方法的示例:数组数组或数组Dictionary。如果你想要的是键控查找值,那么字典方法比数组数组容易。在其他情况下,数组数组可能有优点。

这是虚拟代码,没有任何实际意义,只是为了展示一些东西:抓取单个值和一组值。我正在通过抓取一些简单且2D的Range数据来构建二维值数组。从那里我构建了这些值的数组,然后将它们放入相关的数据结构中。然后我捅了一下数据结构,从中获取了一些值。

首先显示

数组数组方法(并在图片的左侧显示输出)。

Sub ArraysOfArrays()

    Dim arrA() As Variant
    Dim arrB() As Variant

    'wire up a 2-D array
    arrA = Range("B2:D4").Value
    arrB = Range("F2:H4").Value

    Dim arrCombo() As Variant
    ReDim arrCombo(2, 1) As Variant

    'name and give data
    arrCombo(0, 0) = "arrA"
    arrCombo(1, 0) = arrA

    'add more elements
    ReDim Preserve arrCombo(2, 2)

    arrCombo(0, 1) = "arrB"
    arrCombo(1, 1) = arrB

    'output a single result
    'cell(2,2) of arrA
    Range("B6") = arrCombo(1, 0)(2, 2)

    Dim str_search As String
    str_search = "arrB"

    'iterate through and output arrB to cells
    Dim i As Integer
    For i = LBound(arrCombo, 1) To UBound(arrCombo, 1)
        If arrCombo(0, i) = str_search Then
            Range("B8").Resize(3, 3).Value = arrCombo(1, i)
        End If
    Next i
End Sub

在这里结合关键点:

  • 您只能使用ReDim展开数组。与ReDim一起使用时,Preserve非常特别,change the last dimension of the array。由于我需要其中一个来跟踪条目的数量,我在第二个索引中这样做......不自然。如果您事先知道尺寸,则会跳过这个痛苦的步骤。
  • 我的最后一个数组是一个2xN数组,其中2包含一个名称和一个YxZ数据数组。
  • 为了在混合中找到给定的数组,你必须遍历它们。

数组字典远远少于代码,更优雅。请务必将VBA编辑器中的引用Tools->References添加到Microsoft Scripting Runtime。

Sub DictionaryOfArrays()

    Dim dict As New Scripting.Dictionary

    'wire up a 2-D array
    arrA = Range("B2:D4").Value
    arrB = Range("F2:H4").Value

    dict.Add "arrA", arrA
    dict.Add "arrB", arrB

    'get a single value
    Range("F6") = dict("arrB")(2, 2)

    'get a array of values
    Range("F8").Resize(3, 3) = dict("arrA")

End Sub

输入数据和结果的图片

data and results

要复制的数据(粘贴在B1

a               b       
1   2   3       10  11  12
4   5   6       13  14  15
7   8   9       16  17  18