ReDim现有的第二维数组?

时间:2015-02-23 11:06:33

标签: arrays excel vba excel-vba

我在VBA函数中声明了一个具有动态大小的数组。由于我不能ReDim二维或更多维数组的第一维,我可以在集数组中添加第二维吗?

这是我动态设置数组大小的方法。

Dim nameArray() As String
Dim arrayCount As Long

For i = 1 To 100
    ReDim Preserve nameArray(1 to arrayCount)
    nameArray(arrayCount) = "Hello World"
    arrayCount = arrayCount + 1
Next i

现在我想添加第二个维度。

ReDim Preserve nameArray(1 To arrayCount, 1 To 5)

不起作用。

有解决方法吗?

2 个答案:

答案 0 :(得分:6)

没有任何内置方法可以做到这一点。只需创建一个新的二维数组,并将现有的一维数组的内容传输到该新数组的第一行。

这就是这个功能的作用:

Function AddDimension(arr() As String, newLBound As Long, NewUBound As Long) As String()
    Dim i As Long
    Dim arrOut() As String
    ReDim arrOut(LBound(arr) To UBound(arr), newLBound To NewUBound)
    For i = LBound(arr) To UBound(arr)
        arrOut(i, newLBound) = arr(i)
    Next i
    AddDimension = arrOut
End Function

使用示例:

nameArray = AddDimension(nameArray, 1, 5)

答案 1 :(得分:1)

有一个(也可以删除维度),但是您必须考虑工作表的维度...

使用移调

虽然我非常喜欢Jean-François Corbett中的以前的“手工”方法,并且我不希望依赖Excel内置函数(尤其是此函数!),但我想澄清另一个将来的读者来到这里的方式:


将尺寸添加到一维线矢量(一行)意味着在Excel中对其进行转置


在这里,nameArray(1 to arrayCount)是一行(索引是列号),因此,如果添加维,则由于2d数组的索引为(row,column),它将变成一列。因此,您可以执行以下操作:

nameArray = Application.Worksheetfunction.Transpose(nameArray) 'transforms the array to nameArray(1 To arrayCount, 1 To 1), so then:
redim preserve nameArray(1 To arrayCount, 1 To 5)

没有任何其他操作。

但是要注意非常混乱的Excel的Transpose函数(至少对我来说是这样!):这里的优点是它会自动为您添加维度并为数组重新定义。


它仅按预期工作,因为您使用的是“基于1”索引“ 1d数组”。


如果不是这种情况,则所有索引都将移位1(这是内置Transpose以使其与单元格和范围保持一致的方式)。也就是说:如果您以

开头
nameArray(0 to arrayCount)

您最终会得到

nameArray(1 to arrayCount + 1, 1 to 5)

注意事项

虽然我对此很感兴趣,但是可能涉及很多话题,但是它们在此Transpose函数中的其他陷阱永远都不应该得到足够的警告(更不用说它会浪费更多的时间和资源。比Jean-François Corbett的解决方案):

••如果您正在处理excel 2d数组(一个列)中的“ 1d列”,则该数组为:

nameArray(1 to arrayCount, 1 to 1) [*]

如果将其转置,则列维将被“跳过”,结果将是:

nameArray(1 to arrayCount)

这很有意义,因为您最终将得到一个Excel行(那么为什么还要多加一些暗淡呢?)。但是我不得不说这不是我期望的直观行为,应该更像nameArray(1 to 1, 1 to arrayCount)


请注意,相反,它可用于删除维度并将数组从2d自动重新分配为1d:redim将最后一个维度保留为1 to 1,然后转置!这是上面的结果数组。


•但最后并没有丢失所有内容:假设您转置了1行的数组:

nameArray(0 to 0, 0 to arrayCount)

您正确地获得了1列的数组:

nameArray(1 to arrayCount + 1, 1 to 1)

(差不多)-现在回头看看参考[*] ...


因此,如果您要使用此内置函数,并且,如果您需要更大的尺寸或更差的尺寸,需要组成换位,则可能会变得有些棘手...

对于所有这一切,或者如果您仅需要知道正确的索引编制和数组维数(不仅是列数),我建议用户John ColemanVegard提供一个非常有用的功能,位于下面的帖子。

尽管对于使用Excel工作表的人们来说,所有这些看起来都是合乎逻辑的和琐碎的,但是当您更习惯于矩阵操作时,情况并非如此,我认为建议使用此Transpose函数应该具有一定的精度。 / p>