给定一个未知大小的数组和一个接受参数数组的过程,如何在不修改过程的情况下将数组作为参数数组传递?
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那样的内置解决方案,但是除了一个长开关语句之外,任何残酷的实现都是可以接受的。
发布于 2014-09-20 00:35:12
这个巨大的开关声明听起来有点残忍,但如果你必须调用的例程确实是不可修改的,那就是你要做的。在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
发布于 2014-09-19 15:14:20
我认为作为ParamArray
传递参数是不可能的,从本质上讲,您不是要将参数分配给ParamArray
本身,而是要映射到ParamArray
的元素。
调用方传递的每个参数都映射到ParamArray变量中的一个元素。因此,ParamArray变量将具有与调用语句传递的参数相同的元素。
https://stackoverflow.com/questions/25922190
复制相似问题