从多维数组

时间:2016-09-05 08:49:18

标签: arrays excel vba excel-vba

我需要一个函数从multidimesion数组中提取2个维度。根据用户的选择提取哪2个维度。以及根据用户选择这两个维度的丢弃尺寸中的索引。

例如,我有一个3维数组v(1到100,1到20,1到10)。我想从v。中提取维度1和维度3,并且丢弃维度2中的索引是11。

sub extract
dim i1 as integer 'for loop through dimension 1
dim i2 as integer 'for loop through dimension 3
dim d1 as integer 'index in dimension 2
d1=11
redim vn(1 to ubound(v,1),1 to ubound (v,3))
for i1 = 1 to ubound(v,1)
    for i2= 1 to ubound(v,3)
        vn(i1,i2)=v(i1,d1,i2)
    next i2
next i1
end sub

如果我知道我需要哪个维度和废弃维度中的索引(d1),我可以从数组中提取维度。但是,我需要将其留给用户来决定。我想要的是这样的功能:

function extract(i1 as integer, i2 as intger, paramarray ov()) as variant

=提取物(the_first_dimension_to_keep,the_second_dimension_to_keep,[index_in_the_first_discard_dimension,index_in_the_second_discard_dimension,...])

请记住,原始数组可以有3个以上的维度,因此列出代码中所有可能性是不可能的。

任何解决方案?

1 个答案:

答案 0 :(得分:0)

最快的方法是使用指针读取数组,并根据维度数和每个元素数量的算法值递增指针值。该站点有一个关于管理数组指针的优秀教程:http://bytecomb.com/vba-internals-getting-pointers。但是,这是一项强大的编码任务 - 只需将rgabounds的{​​{1}}标注为内存读取将是一项任务 - 如果您的数组值为SAFEARRAY,那么它就是是一个数量级更强大。

更简单但无疑更慢的选择是利用Strings循环方法,该方法可以应用于数组。它的循环序列是这样的:

For Each

所以你只需要一个简单的里程表式索引计数器。

你基本上可以迭代数组中的每个元素,如果索引组合符合你想要的,你就可以将元素读入你的提取数组中。那将是一项更容易的任务。下面的代码向您展示了如何在未知维度的多维数组上执行此操作。

arr(1,1)
arr(2,1)
arr(3,1)
arr(1,2)
arr(2,2)
arr(3,2)
etc.