VBA循环遍历数组的所有维度?

时间:2016-01-11 14:00:27

标签: arrays vba multidimensional-array

是否可以遍历数组的所有维度? 我找到了一个解决方法来获取数组的维数。但现在我希望能够迭代这个。不知道运行前的确切维数

示例:如果要迭代二维数组。你已经知道了dims的数量。因此,您将编写类似的代码:

var = MyArray(1,2)

或迭代var:

For n = 1 to Ubound(vArray)
    For n2 1 to Ubound(vArray, 2)
        var = MyArray(n, n2)
    Next n2
Next n

但在我的情况下,我不知道运行前的确切维数。它可能只有一个,两个甚至更多。那我怎么写命令呢?

For d = 1 to NumberOfDimensions
    For n = 1 to Ubound(vArray, d)
        var = MyArray(???)
    Next n
Next d

我的目标是迭代该数组所有维度中的所有元素。

有什么想法吗?提前致谢。 :)

3 个答案:

答案 0 :(得分:1)

了解维度数量 - 您可以在Microsoft的支持文章https://support.microsoft.com/en-us/kb/152288中阅读该文章。

一旦你有了维数 - 你可以使用一个递归函数,在每次调用自身时深入到数组的一个级别并处理数据(如果数据是一个数组 - 再次调用函数,如果不是 - 处理当前项目)

有些事情要注意:数组大小限制,正确检查对象类型等。

祝你好运!

答案 1 :(得分:1)

正如FunkSoulBrother所说,这可以使用Recursion完成。

在类C语言中,代码看起来像这样,应该很容易转换为VBA:

    void IterateRec(Array arry)
    {   
        int numberOfDimensions = GetNumberOfDimensions();

        for(i = 0; i < numberOfDimensions; i++)
        {
            if(IsArray(arry[i]))
            {
                // Item is an array so we delve one level deeper.
                IterateRec(arry[i]);

            }
            else
            {
                // TODO: Process the current item here.
            }       
        }   
    }

函数的调用将在你的情况下:

Sub Main()
    var MyArray = ...
    IterateRec(MyArray)
End Sub

请注意,如果递归太深,则可能会出现StackOverflow异常(或VBA中的类似错误)。在这种情况下,您必须创建Stack类并修改代码才能使用它。

答案 2 :(得分:0)

回答我自己的问题:是的,这是可能的。

示例:

Dim vMyArray({1, 2}, {3, 4}, {5, 6}) As Variant
Dim vArrItem as Variant

For Each vArrItem In vMyArray
    Debug.Print vArrItem
Next vArrItem

这将产生:

1 2 3 4 5 6 

在直接窗口中。

但这只是我的一个问题。主要目标是为VBA编写“RedimAnyDimension”函数。 现在我找到了解决方案。正如我之前提到的。我使用一种解决方法来绕过vba语法。

您可以在此处下载zip存档:RedimAnyDim.zip(希望。如果不能正常工作请注意。)

它使用两个模板文本文件在运行时创建新的vba代码。它包含功能代码的主体。将此代码保存在活动工作簿路径中的新* .bas文件中,然后将新函数导入活动项目。执行代码并收到结果。最后,新导入的模块已被删除。

项目文件需要引用“Microsoft Visual Basic for Applications Extensibility 5.3”才能导入和删除代码。

还有一些事情要做。正如Jaroslav Svestka之前提到的那样,我并不关心记忆的大小或它是否溢出。虽然这只适用于非对象数组项(数字或字符串)。使用后可以删除生成的代码文件。

这可能就像用大锤敲打坚果一样。但是在创造它的过程中我很开心。 :) 现在我可以重新定义任何数组的第一个维度。如果向数据数组中添加行但不想编写所有这些循环以将数据传递给临时创建的数组,那么它非常有用。

我确信还有很多其他事情可以调整。我很感激任何想法。