2014-09-21 35 views
2

我想找到一种实用的方法,直接将值分配给VBA中的多维数组而不进行迭代。我用Google搜索的解决方案哪种作品,但是当我尝试与变量结合使用它失败..VBA - 直接使用括号分配多维数组

这工作:

Sub SomeSub() 
    Dim vArray As Variant 
    Dim iCounter As Integer 
    vArray = [{"Zip", "22150";"City", "Springfield"; "State", "VA"}] 

    For iCounter = LBound(vArray, 1) To UBound(vArray, 1) 
     Debug.Print vArray(iCounter, 1), vArray(iCounter, 2) 
    Next iCounter 
End Sub 

然而,这不和提出了一个“类型不匹配“错误。不同的是,我试图(和希望),而不是使用恒定的值的变量:

Sub SomeSub() 
    Dim vArray As Variant 

    Dim iZip As Integer 
    Dim sCity As String 
    Dim sState As String 

    iZip = 22150 
    sCity = "Springfield" 
    sState = "VA" 

    Dim iCounter As Integer 
    vArray = [{"Zip", iZip;"City", sCity; "State", sState}] 

    For iCounter = LBound(vArray, 1) To UBound(vArray, 1) 
     Debug.Print vArray(iCounter, 1), vArray(iCounter, 2) 
    Next iCounter 
End Sub 

我发现这种方法用于分配阵列很少或根本没有资料,所以我希望有人有一些有识之士报价。

谢谢!

回答

1

VBA还有一个名为Array的内置函数。您可以使用Array函数中的Array来使其“多维”。

Sub SomeSub() 
    Dim vArray As Variant 

    Dim iZip As Integer 
    Dim sCity As String 
    Dim sState As String 

    iZip = 22150 
    sCity = "Springfield" 
    sState = "VA" 
    vArray = Array(Array("Zip", iZip), Array("City", sCity), Array("State", sState))  

    Dim iCounter As Integer 

    For iCounter = LBound(vArray, 1) To UBound(vArray, 1) 
     Debug.Print vArray(iCounter, 1), vArray(iCounter, 2) 
    Next iCounter 
End Sub 

尽管上述代码确实回答了OP,但我正在编辑此答案并提供更多信息。从技术上讲,这不是“多维的”。相反,它是“锯齿状的”。它是单维数组的一维数组的变体。在VBA中,当你定义一个真正的多维数组,你可以使用这个语法:

Sub someSub() 
    Dim vArray(5, 5) As Long 
    vArray(0, 1) = 5 
    vArray(0, 2) = 3 
    vArray(1, 3) = 4 
    Debug.Print vArray(1, 3) 'Prints 4 
End Sub 

另一个Stackflow用户建议此校正技术,我想纳入知识到答案。

+1

很好玩,我的朋友..很好玩。 – 2014-09-22 22:19:34

1

[...]语法是Application.Evaluate()的快捷方式,当你发现它仅适用于运行时间常量表达式,你可以用它来Application.Evaluate()一个真正的呼叫传递dynamc字符串,但(* IMO)那是相当哈克。

替代方案:

  • 创建一个接受的参数的paramarray()工厂功能,使用模计数器弄清楚分配到什么层面通过它一步。

  • 作为第一维似乎是一个固定的字符串用一个用户定义的类型,以允许udt_var.City = "XXX"/udt_var.Zip = 12345 ...

  • 使用集合(或字典),其上面的不同是可迭代(由键后者)。

+0

谢谢您的澄清。我决定使用ParamArray编写一个函数来组装数组..我并不喜欢使用Application方法。 – 2014-09-21 15:41:57