从被调用的函数调用函数时 VBA byref 参数类型不匹配

Posted

技术标签:

【中文标题】从被调用的函数调用函数时 VBA byref 参数类型不匹配【英文标题】:VBA byref argument type mismatch when calling a function from a function being called 【发布时间】:2015-07-18 10:14:30 【问题描述】:

希望有人可以提供帮助。这是我正在使用的一组代码的简化。我正在调用一个函数,而该函数又调用了另一个函数。变量从调用子传递到第一个被调用函数,从那里它应该被传递到第二个被调用函数以返回一个值。但是,我在第一个函数中的以下“参数”上收到“byref 参数类型不匹配”错误。有什么建议么?谢谢!

' Sub to call function 1
Sub TestFunctionSelect()
    Dim X As Double
    ' X should = the value of the function mShareMMTDaily as called from mFunctionSelect
    X = mFunctionSelect("mShareMMTDaily", "SOL", "2008/02/28", 12)
End Sub

' Function 1 to call function 2 and return a value to the sub
Function mFunctionSelect(FunctionName As String, CompCode As String, CurrentMonth As Date, Parameter As Double) As Double
    Select Case FunctionName
        ' Case Is = "mValue"
            ' mFunctionSelect = mValue(CompCode, CurrentMonth, Parameter)
        Case Is = "mShareMMTDaily"
            ' This function is called
            ' I get the "byref argument type mismatch" error on the below "Parameter"
            mFunctionSelect = mShareMMTDaily(CompCode, CurrentMonth, Parameter)
    End Select
End Function

Function mShareMMTDaily(Code As String, ShareDate As Date, LookBack As Integer) As Double
    ' Do Stuff
End Function

【问题讨论】:

ByRef arugment type mismatch in Excel VBA的可能重复 将表示日期的字符串“2008/02/28”转换为Date类型。更多关于类型转换函数here. 感谢@dee 的提示。将相应地标准化我的代码。 【参考方案1】:

您的 Parameter 变量被声明为 Double 并且您将其传递给需要 Integer 的函数。您应该将其转换为:

mFunctionSelect = mShareMMTDaily(CompCode, CurrentMonth, CInt(Parameter))

顺便说一句,正如@dee 指出的那样-您还在将字符串隐式转换为日期。这会降低您的代码安全性,并依赖于您的代码运行所在主机的语言设置。您应该明确转换日期,或者更好的是,从头开始使用日期而不是字符串。

【讨论】:

谢谢@Apokralipsa。那成功了。变量不同的原因是因为 case 语句将从可用函数列表中进行选择——其中一些采用双参数,一些采用整数参数。我希望有办法解决这个问题。现在,我将标准化所有调用函数以使用 double 类型的参数。

以上是关于从被调用的函数调用函数时 VBA byref 参数类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

vb的函数调用

ByRef 参数类型不匹配 - Excel VBA

VBA 间歇性 ByRef 错误 - 格式函数

VBA Object对象的函数参数传递

VBA ByRef Argument Type Mismatch string into string

在VBA中如何调用过程与函数?