我有一组数据,其中每个项目都有一个与之对应的二维信息数组。我想创建一个3D数组,其中第一个维度是项目名称,第二个和第三个维度由与项目对应的信息占用。
我可以将每个项目的数据读入2D数组,但我无法弄清楚如何将2D数组读入3D数组。
我知道所有尺寸的尺寸,所以在开始读写过程之前我可以创建一个固定尺寸的数组。
我想通过仅通过项目的名称循环而不循环遍历每个2D数组的每个单元格来实现此目的。
很容易将2D数组读入ArrayList,但我希望能够为这些项命名,并能够将这些项重新读取为excel,并且使用ArrayList似乎很难。
问题是:如何从Excel中读取2D选择到VBA中的3D固定大小的数组?
答案 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。由于我需要其中一个来跟踪条目的数量,我在第二个索引中这样做......不自然。如果您事先知道尺寸,则会跳过这个痛苦的步骤。 数组字典远远少于代码,更优雅。请务必将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
输入数据和结果的图片
要复制的数据(粘贴在B1
)
a b
1 2 3 10 11 12
4 5 6 13 14 15
7 8 9 16 17 18