我正在使用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)
答案 0 :(得分:4)
您正在将 array 传递给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
启用鸭子键入和 late-binding ,并且是合法的COM类型。
这是锤子。只需确保并非所有事情都会成为钉子,那您就会做得很好。
1 VBA会将其他值类型隐式转换为String
,但是不能将数组强制隐式或显式转换为字符串。 < / p>
答案 1 :(得分:1)
似乎您毕竟想要一个字符串数组,但是值得一提的是,您可以声明一个固定宽度的字符串var。
Dim dptData As String * 8
dptData = "abc"
Debug.Print Len(dptData) & "|" & dptData & "|"
'result from Immediate window
'8|abc |
dptData = "abcdefghijk"
Debug.Print Len(dptData) & "|" & dptData & "|"
'result from Immediate window
'8|abcdefgh|