我正在使用Windows 7,Excel 2010,VBA。我收到错误消息“ ByRef参数类型不匹配”。我假设这是我的变量类型有问题。我发现了很多类似我的问题,但是找不到任何能帮助我解决问题的东西。
变量声明
'Force explicit variable declaration
Option Explicit
Private dptData(8) As String
Private TSdata(8) As String
Private fiscalYear(8) As String
通话功能
parseUserData fiscalYear, dptData, TSdata
称为函数原型
Function parseUserData(fiscalYear As String, dptDataAs String, TSdata As String)
您正在将数组传递给String
。更改函数的签名以接受Variant
。
Public Function parseUserData(fiscalYear As Variant, dptDataAs Variant, TSdata As Variant)
Debug.Assert IsArray(fiscalYear) And IsArray(dptDataAs) And IsArray(TSdata)
一个String
参数永远只能接受一个String
参数1。Variant
另一方面,可以接受任何内容-包括数组-但随后您将需要Assert
处理数组,这样就可以避免执行(并防止错误)。
使用类型化数组可以工作,但是不能从Variant
参数强制类型化数组-这意味着:
Public Sub DoSomething(ByRef args() As String)
...无法使用本来是完全有效的字符串数组来调用:
DoSomething Array("string1", "string2", "string3") ' can't pass a variant array!
更改签名以DoSomething(ByRef args As Variant)
使其起作用。您需要做的就是在变量数组参数中使用有意义的,描述性的,复数形式的名称,以便在调用该过程时显示IntelliSense时,该名称告诉您所有您需要知道的内容。
与许多其他语言一样,VBA中的类型安全本质上是冒烟的。Variant
是一个非常强大的工具,确实有它的用处-当您不能意味着学会它的存在时就不要使用它。使用它在过程之间传递数组引用不会损害代码的可读性,可维护性或稳定性。Variant
启用鸭子类型和后期绑定,并且是合法的COM类型。
这是锤子。只要确保并非一切都成为钉子,那您就做得很好。
1 VBA会将其他值类型隐式转换为String
,但是不能将数组隐式或显式强制转换为字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句