巨大的switch语句听起来有点残忍给我,但是这就是你在,如果你必须调用程序是真正不可修改的是什么。在VBA中,这是一条Select Case
声明。不要忘记,VBA阵列可以有任意的索引,所以除非你确定你的序列参数来自哪里,否则你必须测试LBound
和UBound
。
如果你可以编写自己的例程,有一种方法可以主要做你想做的。您可以指定数组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
'UnModifiableSub Array(sequence)'是否有效? – 2014-09-19 01:37:20
没有那个进一步嵌套它。然后'bar(0)(0)= sequence' – cheezsteak 2014-09-19 14:31:22