【问题标题】:Ask for comment on passing array element to a function in VBA询问有关将数组元素传递给 VBA 中的函数的评论
【发布时间】:2018-09-29 07:31:40
【问题描述】:

我有以下 VBA 代码:

Function InputElmt(element As Double) As Variant
    InputElmt = element
End Function

Sub runInputElmt()
    Dim arr() As Variant, Firstelmt As Double
    arr = Array(1, 2)

    Debug.Print InputElmt(arr(0) * 1)   ' 1st call

    Firstelmt = arr(0)
    Debug.Print InputElmt(Firstelmt)    ' 2nd call

    Debug.Print InputElmt(arr(0))       ' 3rd call: error
End Sub

sub 调用函数InputElmt 3 次。前两个产生正确的结果,而最后一个会导致错误(请参阅compile error)。

我的解释是第三次调用将arr(0) 的字符串传递给函数,而不是对其求值。相反,在前两个调用中,arr(0) 被评估。

我的问题是

1) 我的解释正确吗?和

2) 此错误是否与错误消息所指示的 ByRef 或 ByVal 相关?

【问题讨论】:

  • 第三次调用不传字符串,加一个Debug.Print TypeName(arr(0))。所以严格来说,恕我直言,第一个问题的答案是否定的。第二个问题(我不太明白)的答案是 原因是 VBA 默认通过引用传递变量,这意味着数据类型必须在调用者和被调用者之间完全匹配。另见documentation

标签: excel vba


【解决方案1】:

你有两个选择

第一

Function InputElmt(ByVal element As Double) As Variant
    InputElmt = element
End Function

第二

Debug.Print InputElmt((arr(0)))       ' 3rd call: no error with parentheses

注意括号

将参数放在自己的括号中强制评估 把它当作一个表达式。

如需了解更多信息,请查看documentation

【讨论】:

    【解决方案2】:

    您的第二个变量是double,但第三个变量是变量。您的用户定义函数需要double 变量,并且在该过程中,应用变体将导致不匹配错误。

    【讨论】:

    • ? typename(arr(0)) 是整数; arr(0) 显示为变量/整数。我很困惑哪一个是它的真实类型
    • @XianhaoZHU TypeName 仅在调用 Variant 时才有意义。它告诉您哪个子类型存储在变体中。因此,实际类型是Variant/Integer
    • @XianhaoZHU,因为我们在Sub runInputElmt()中定义了类型为Dim arr() As Variant,问题是自定义函数InputElmt()中调用的变量double和variant不一致元素为双)
    • @Dy.Lee 我明白了。基本上,arr 是一个所有元素都是变体的数组。 `arr(0)' 本质上是一个存储整数的变体。
    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2014-12-17
    相关资源
    最近更新 更多