我在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)
不起作用。
有解决方法吗?
答案 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 Coleman和Vegard提供一个非常有用的功能,位于下面的帖子。
尽管对于使用Excel工作表的人们来说,所有这些看起来都是合乎逻辑的和琐碎的,但是当您更习惯于矩阵操作时,情况并非如此,我认为建议使用此Transpose函数应该具有一定的精度。 / p>