在VBA中重新调整可变维数

时间:2015-07-08 06:26:51

标签: arrays excel vba excel-vba multidimensional-array

我在Excel宏(VBA)中有一个案例,我想在一个数组中标注维度的数量和每个维度的边界在运行时确定。我通过为每个选项类型创建一个列并填写下面的可能性,让用户指定一系列组合选项。通过检查工作表,在运行时确定列数和选项数。

某些代码需要遍历每个组合(每列中有一个选项),并且我希望将结果存储在多维数组中。

尺寸的数量可能在2到6之间,所以如果必须的话,我总是可以回到一堆if else块,但感觉应该有更好的方法。

我认为如果我可以在运行时将Redim语句构造为字符串并执行字符串,那么可能会这样做,但这似乎不可能。

有没有办法动态Redim具有不同数量的维度?

3 个答案:

答案 0 :(得分:1)

我很确定在单ReDim语句中无法做到这一点。 Select Case可能比“一堆If...Else块”略微整洁,但你仍然写出了很多单独的ReDim

使用VBA中的数组,你事先不知道它们有多少维度是PITA的一点点 - 以及ReDim不是很灵活,也没有简洁的测试方法一个数组,看看它有多少维度(你必须循环尝试访问更高维度和陷阱错误,或者在底层内存结构中进行攻击 - see this question)。因此,您需要跟踪维度的数量,并在每次需要访问数组时编写长Case语句,因为语法会有所不同。

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

答案 1 :(得分:0)

  

“某些代码需要贯穿每个组合(从中选择一个)   每列)我想将结果存储在多维中   阵“。

首先,我将转换所需的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

然后你可以遍历这个数组,找到你需要的大小和数据,你可以将它保存到你需要的数组(带有维度)。

小背景:

  

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

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

更新:明确显示允许的内容以及Redim下的内容。

enter image description here

每次使用Redim时,将原始Array对象重置为您接下来要定义的维度。

有一种方法可以使用Redim Preserve来保存您的数据,但这只能让您更改多维数组的最后一个维度,其中第一维仍然是原始维度。

答案 2 :(得分:0)

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

因此,请查看:Excel VBA- Finding the last column with data

使用Redim更改阵列的大小。如果您想保留某些条目,请使用Redim Preserve