VBA:接受多种类型输入的函数?

sak*_*ew2 1 vba

我有一些用户定义的类型和每个类型的函数,它们接受这些类型并对它们做一些事情。

问题是,我想写一个通用函数,它接受这些类型中的任何一种,然后只是TypeName用来确定它是哪一种,并按照需要处理它。

我该怎么做呢?我尝试将参数作为Function Foo(Param As Object),但是当我尝试将用户定义的类型传入函数时它失败了。

Fun*_*mas 6

用户定义类型 ( UDT ) 不是类(它们类似于StructuresC 或RecordsPascal 中),因此 UDT 的实例不是对象 - 这就是您不能将它们用作函数参数的原因foo

VBA 具有通用数据类型Variant。因此,当您拥有 时Function Foo(Param As Variant),您可以将任何内容传递给该函数,Foo 3Foo ActiveSheet Foo "Hello world"。除了 UDT 之外的任何东西...如果您尝试这样做,您将收到一个编译器错误,指出“只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体转换或传递给后期绑定函数。”

Public Type tMyType
    i As Integer
    s As String
End Type

Sub Test
    Dim bar as tMyType
    ' Compiler complains
    foo bar

    Dim myUniversalVariant as Variant
    ' Compiler complains also
    myUniversalVariant = bar
End Sub
Run Code Online (Sandbox Code Playgroud)

官方文件Variant指出,“变型现在支持用户定义的类型。” ,但是至少在 Excel 2016 上这是行不通的(或者至少我无法这样做)。

最好的办法是使用类。如果你懒惰,只需创建一个类模块(每个类型)并将该类型的所有成员作为公共成员,不需要更多(我不会开始描述gettersetter 的优缺点)。你只需要记住,现在你必须使用New语句来创建和Set来分配一个实例。

在类模块中(我将其命名为clsMyType):

 public i As Integer
 public s As String
Run Code Online (Sandbox Code Playgroud)

在常规模块中:

 Sub Test
    Dim bar as clsMyType
    Set bar = new clsMyType
    foo bar

    Dim myUniversalVariant as Variant
    Set myUniversalVariant = bar
    foo myUniversalVariant 
End Sub
Run Code Online (Sandbox Code Playgroud)

现在,这取决于你的函数希望接收对象或还有其他的东西(如整数或字符串),参数类型可以是变体或对象

Function foo(Param as Object) 
    Debug.Print TypeName(Param)
End Function 
Run Code Online (Sandbox Code Playgroud)