首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在VBA中将数组解压缩为ParamArray

在VBA中将数组解压缩为ParamArray
EN

Stack Overflow用户
提问于 2014-09-18 20:58:05
回答 2查看 2.1K关注 0票数 4

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

代码语言:javascript
运行
复制
Sub Example(sequence() As String)
    UnModifiableSub sequence
End Sub

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

我正在寻找类似Python解压的行为

代码语言:javascript
运行
复制
def foo(*args):  # identical to ParamArray
    print(args)

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

我知道没有像Python那样的内置解决方案,但是除了一个长开关语句之外,任何残酷的实现都是可以接受的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-20 00:35:12

这个巨大的开关声明听起来有点残忍,但如果你必须调用的例程确实是不可修改的,那就是你要做的。在VBA中,这是一个Select Case语句。不要忘记VBA数组可以有任意的索引,所以您必须同时测试LBoundUBound,除非您确定了序列参数来自何处。

如果你能写你自己的例行公事,有一种方法可以做你想做的事。可以将数组分配给Variant类型的变量,如下所示:

代码语言:javascript
运行
复制
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(),将得到以下输出:

代码语言:javascript
运行
复制
call test
a

我想这就是你想要的行为。(无论如何,多少有点。没有人想要任意的数组索引。)当然,与Python相比,这是有限的。特别要注意的是,如果要调用tryThis(),则必须自己将“参数”放入数组中。在这个答案和父问题中讨论了与做这件事有关的一些权衡:

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

还有其他一些问题。例如,不能只将ParamArray的内容传递给tryThis()

代码语言:javascript
运行
复制
'Doesn't work...
Sub gotcha(ParamArray pa())

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

您必须显式地将此转换为变量:

代码语言:javascript
运行
复制
Sub gotchaFixed(ParamArray pa())
    Dim v
    v = pa

    Call tryThis(v)
End Sub

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

..。

代码语言:javascript
运行
复制
call test2
a
票数 2
EN

Stack Overflow用户

发布于 2014-09-19 15:14:20

我认为作为ParamArray传递参数是不可能的,从本质上讲,您不是要将参数分配给ParamArray本身,而是要映射到ParamArray的元素。

调用方传递的每个参数都映射到ParamArray变量中的一个元素。因此,ParamArray变量将具有与调用语句传递的参数相同的元素。

cases/1005%20ParamArray.shtml

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25922190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档