我在Excel宏(VBA)中有一个案例,我想在一个数组中标注维度的数量和每个维度的边界在运行时确定。我通过为每个选项类型创建一个列并填写下面的可能性,让用户指定一系列组合选项。通过检查工作表,在运行时确定列数和选项数。
某些代码需要遍历每个组合(每列中有一个选项),并且我希望将结果存储在多维数组中。
尺寸的数量可能在2到6之间,所以如果必须的话,我总是可以回到一堆if else块,但感觉应该有更好的方法。
我认为如果我可以在运行时将Redim
语句构造为字符串并执行字符串,那么可能会这样做,但这似乎不可能。
有没有办法动态Redim
具有不同数量的维度?
答案 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下的内容。
每次使用Redim
时,将原始Array对象重置为您接下来要定义的维度。
有一种方法可以使用Redim Preserve
来保存您的数据,但这只能让您更改多维数组的最后一个维度,其中第一维仍然是原始维度。
答案 2 :(得分:0)
据我了解,您的用户可以通过填写excel表来指定尺寸和抓取。这意味着您必须获取包含值和最后一列的最后一行。
因此,请查看:Excel VBA- Finding the last column with data
使用Redim
更改阵列的大小。如果您想保留某些条目,请使用Redim Preserve