ReDim从1维到2维

我有一个一维数组:

Dim array1() As Variant array1 = Array("A", "B", "C", "D") 

在概念上看起来像这样:

 A B C D 

我想向这个数组添加第二个维度,保留原始数据。 我想添加两个“列”到这个数组来存储数据。

 Dim lngArrayLength as Long lngArrayLength = UBound(array1, 1) ' Zero-indexed, so now should have 3 columns ReDim Preserve array1(lngArrayLength, 2) 

造成这种情况:

 A NULL NULL B NULL NULL C NULL NULL D NULL NULL 

问题是我的ReDim保留命令会引发运行时错误:“9”:下标超出范围错误。 我无法弄清楚为什么。

这是一个俗气的解决scheme:

 Dim Array1() As Variant, TempArray() As Variant Array1 = Array("A", "B", "C", "D", "E") ReDim TempArray(0 To UBound(Array1), 0 To 2) For i = 0 To UBound(Array1) TempArray(i, 0) = Array1(i) Next i Array1 = TempArray 

ReDim无法将arrays重新调整到更大的级别(维度数量)。

解决这个问题的常见方法是创build一个你想要的等级的新数组,并循环遍历原始数组的所有元素,将它们逐一分配给新数组。

这是一个有趣的替代scheme,并不是广泛的知道,可以完成同样的事情没有VBA循环的元素:

 array1D = Array("A", "B", "C", "D") array2D = Evaluate("{""" & Join(array1D, """;""") & """}&{"""","""",""""}") 

结果:一维数组将被转换为二维(3列宽,来源于第一列)。

结果:两个新列将保持与第一列完全相同的数据,但是当然,您现在可以自由地将所需的任何新值分配给新列。

注意:每个维度的下限将是1。

警告:这是针对文本的数组。 数值数组可以使用类似的方法。

警告:原始数组元素不能包含任何分号。

用上述方法最大的缺陷是VBA的Evaluate()函数可以处理的string的最大长度只有255个字符。 为了绕过这个限制,我们在评估过程中使用了一个函数调用,如下所示:

 Private array1D Public Sub Array1dTo2d() array1D = Array("A", "B", "C", "D") array2D = [transpose(Arr())&{"","",""}] End Sub Private Function Arr() Arr = array1D End Function 

UPDATE

这是实现此方法的一种dynamic方法,因此可以轻松地指定生成的二维数组中的列数。

只需运行TestArrayConversions()例程来查看三个不同的示例:

 Private array_ Public Sub TestArrayConversions() array1 = Array("A", "B", "C", "D") array1 = Array1dTo2d(array1, 3) MsgBox "2D array has:" & vbLf & UBound(array1, 1) & " rows" & vbLf & UBound(array1, 2) & " columns" array1 = Array("A", "B", "C", "D", "E", "F", "G", "H") array1 = Array1dTo2d(array1, 25) MsgBox "2D array has:" & vbLf & UBound(array1, 1) & " rows" & vbLf & UBound(array1, 2) & " columns" array1 = Array("we", "can", "do", "it") array1 = Array1dTo2d(array1, 6) MsgBox "2D array has:" & vbLf & UBound(array1, 1) & " rows" & vbLf & UBound(array1, 2) & " columns" End Sub Public Function Array1dTo2d(arr1D, columns) array_ = arr1D Array1dTo2d = Evaluate("transpose(Arr())&{" & Application.Rept(""""",", columns - 1) & """""}") End Function Private Function Arr() Arr = array_ End Function