Redim可变数量的维度在VBA中

我有一个Excelmacros(VBA)的情况下,我想维数组维数和维度的边界在运行时确定。 我让用户通过为每个选项types创build一个列并填写下面的可能性来指定一系列组合选项。 运行时通过检查纸张来确定列数和选项数量。

一些代码需要运行每个组合(从每列中select一个),我想将结果存储在一个multidimensional array中。

维度的数量可能在2到6之间,所以如果必须的话,我总是可以回到一堆其他的块中,但是感觉应该有一个更好的方法。

我在想,如果我可以在运行时将Redim语句构build为string并执行string,那么可以这样做,但这似乎不可能。

有没有办法dynamic地用不同数量的维度来进行Redim处理?

我很确定在单个ReDim语句中没有办法做到这一点。 Select Case可能比“一堆If...Else块”稍微整齐,但是你仍然写出很多单独的ReDim

使用VBA中的数组,事先并不知道他们将拥有多less维度的PITA,以及ReDim不太灵活,也没有一种简洁的方式来testing一个数组,看看有多less维度它有(你必须循环尝试访问更高维度和陷阱错误,或者在底层内存结构中进行攻击 – 请参阅此问题 )。 因此,您需要跟踪维度的数量,并且每次需要访问数组时都需要编写长的Case语句,因为语法会有所不同。

我build议创build一个你认为需要的维数最多的数组,然后将任何未使用的维度中的元素数量设置为1 – 这样每次访问数组时总是有相同的语法,如果你需要你可以使用UBound()来检查这个。 这是Excel开发人员为Range.Value属性所采取的方法 – 即使对于一维Range ,也总是返回一个二维数组。

据我了解,您的用户可以通过填写Excel表单指定尺寸和抓取。 这意味着你必须得到最后一行包含一个值和最后一列。

因此,请看: Excel VBA – 查找带有数据的最后一列

使用Redim来改变数组的大小。 如果你想保留某些条目使用Redim Preserve

“一些代码需要遍历每一个组合(每列有一个select),我想将结果存储在一个multidimensional array中。”

首先,我会将所需的Range对象转置为Variant。

 Dim vArray as Variant '--as per your defined Sheet, range 'this creates a two dimensional array vArray = ActiveWorkbook.Sheets("Sheet1").Range("A1:Z300").Value2 

然后你可以遍历这个数组来find你需要的大小和数据,你可以把它保存到一个你需要的数组(需要维)。


小背景:

Redim:重新分配数组variables的存储空间。

如果最初使用Dim语句定义数组,则不允许Redim数组。 (例如Dim vArray(1 to 6) As Variant )。

更新 :显示什么是允许的,什么不是在Redim下。

在这里输入图像说明

每次使用Redim都会将原始Array对象重置为接下来定义的尺寸。

有一种方法可以使用Redim Preserve保留数据,但只允许您更改multidimensional array的最后一个维度,其中第一个维度保留为原始维度。