2014-09-18 47 views
2

给定一个未知大小的数组和一个接受参数数组的过程,如何在不修改过程的情况下将数组作为参数数组传递?在VBA中将数组解压缩为ParamArray

Sub Example(sequence() As String) 
    UnModifiableSub sequence 
End Sub 

Sub UnModifiableSub(ParamArray bar()) 
    ' bar(0) = sequence not bar = sequence 
End Sub 

我在寻找类似Python的拆包

def foo(*args): # identical to ParamArray 
    print(args) 

x = [1,2,3,4] 
foo(*x) # what VBA can't do 

我知道有没有内置的解决方案就像在Python,但任何残忍的实现比长switch语句可以接受的其他行为。

+0

'UnModifiableSub Array(sequence)'是否有效? – 2014-09-19 01:37:20

+0

没有那个进一步嵌套它。然后'bar(0)(0)= sequence' – cheezsteak 2014-09-19 14:31:22

回答

2

巨大的switch语句听起来有点残忍给我,但是这就是你在,如果你必须调用程序是真正不可修改的是什么。在VBA中,这是一条Select Case声明。不要忘记,VBA阵列可以有任意的索引,所以除非你确定你的序列参数来自哪里,否则你必须测试LBoundUBound

如果你可以编写自己的例程,有一种方法可以主要做你想做的。您可以指定数组Variant类型的变量,像这样:

Sub tryThis(v) 
    Debug.Assert IsArray(v) 
    Debug.Print v(LBound(v)) 
End Sub 

Sub Example(sequence() As String) 
    tryThis sequence 
End Sub 

Sub test() 
    Dim s() As String 

    ReDim s(1 To 2) 
    s(1) = "a" 
    s(2) = "b" 

    Call Example(s) 
End Sub 

tryThis()需要你UnModifiableSub的地方。如果您在立即窗口中运行test()你得到这样的输出:

call test 
a 

我认为这是你想要的行为。 (无论如何,没有人想要任意数组索引。)当然,与Python相比,这是有限的。值得注意的是,如果你想打电话tryThis(),你必须把你的“参数”放到一个数组中。有些涉及到做权衡了在这个答案和家长的问题讨论:

What is the benefit of using ParamArray (vs a Variant array)?

还有一些其他的问题也是如此。例如,你不能只通过的ParamArray的内容tryThis()

'Doesn't work... 
Sub gotcha(ParamArray pa()) 

    'Can't do it this way! "Invalid ParamArray use" 
    Call tryThis(pa) 
End Sub 

你必须要转移到明确的变量:

Sub gotchaFixed(ParamArray pa()) 
    Dim v 
    v = pa 

    Call tryThis(v) 
End Sub 

Sub test2() 
    Call gotchaFixed("a", "b") 
End Sub 

...

call test2 
a