是否有类似于vba中的toString()函数的实现函数?

时间:2019-05-15 14:04:29

标签: excel vba

我想在一个集合中获取一个对象作为字符串,而不用为其调用函数。 例如。: 在Java中,我可以

System.out.print(objVarXY)

并且编译器将自动调用objVarXY.toString()函数(如果已实现)

在VBA中是这样的

Debug.Print parameterListe.LList.Item(1)

将导致错误。

Debug.Print parameterListe.LList.Item(1).toString
如果我实现了toString子函数,

将起作用。 但是,如果我不知道LList集合中将包含哪种对象?

2 个答案:

答案 0 :(得分:3)

Debug.Print将隐式尝试将给定的值表达式强制转换为String以便输出。

当您Debug.Print对象时,VBA会尝试Let将对象强制为一个值-如果对象没有默认成员,最终会产生一个可以隐式转换为String的值,那么如果类没有默认成员,则会出现运行时错误438“对象不支持此属性或方法”

如果对象是用户代码(即您自己的类模块),并且这样做有意义,则您可以自己添加一个默认成员,并让该类负责知道如何将自己表示为{{1 }}(请注意,VB属性隐藏在VBE代码窗格中,并且必须在VBE外部进行编辑-除非您使用Rubberduck,在这种情况下,您可以简单地添加String注释和同步注释/属性):

@DefaultMember

但是,所有这些操作通过隐式成员调用,使该类实际上具有被视为'@DefaultMember Public Function ToString() As String Attribute ToString.VB_UserMemId = 0 '... End Function 的能力。我将其称为一种滥用语言功能(通过这种机制,String输出应用程序的Debug.Print Excel.Application,或Name输出连接的Debug.Print adoConnection属性),因为正如您指出的,您最好只显式调用该ConnectionString方法。

如果对象不知道如何将自己表示为ToString,则必须某处某处。在Java(IIRC)和.NET中,这实际上是默认的String实现:

ToString

...这是没有用的,但是实际上Debug.Print TypeName(objVarXY) 就是默认情况下的工作。

无论您是在编写Java,C#还是VBA,都需要编写代码来了解如何将ToString表示为objVarXY

遗憾的是,VBA不会执行fantpant模式匹配,因此我们无法像C#中那样String(它只是最近才具备这种功能-不了解Java),并且由于Select Case TypeOf obj不会不是类型安全的,我会选择Select Case TypeName(obj)

If...ElseIf

显然,如果集合始终包含您拥有的类,则更好的解决方案是让每个对象都知道如何将自己表示为Public Function Stringify(ByVal obj As Object) As String If TypeOf obj Is Something Then Dim objSomething As Something Set objSomething = obj ' cast to Something interface Stringify = objSomething.SomeProperty ElseIf TypeOf obj Is SomethingElse Then Dim objSomethingElse As SomethingElse Set objSomethingElse = obj ' cast to SomethingElse interface Stringify = objSomethingElse.AnotherProperty & "[" & objSomethingElse.Foo & "]" 'ElseIf TypeOf obj Is ... Then ' ... Else ' we don't know what the type is; return the type name. Stringify = TypeName(obj) End If End Function 值。

但是,让用户类在其默认界面上公开String方法是不理想的:由于我们不知道从集合中获得什么类型,因此我们具有ToString和一个后期绑定调用-并且没有编译时保证该类实现了Object方法,并且如果我们尝试调用ToString也没有编译器警告。

解决方案是ToStrnig放在类的默认接口上,并使用某些ToString类模块来将行为形式化,如下所示:

IString

是的,这就是整个课堂。

现在需要以字符串表示的用户类可以执行以下操作:

Option Explicit
Public Function ToString() As String
End Funtion

现在我们可以尽早保证对象具有Option Explicit Implements IString Private Function IString_ToString() As String ' todo: implement the method! End Function 方法:

ToString

一天结束时,无论您使用哪种语言,都没有魔力。

答案 1 :(得分:1)

VBA中不存在类似的东西,例如只有CStr()之类的Type conversion functions才能转换。 Integer变成String

如果您需要将Collection转换为Array,则需要使用一个函数。


  

但是,如果我不知道我的LList集合中将包含哪种对象

,该怎么办?

然后,您将需要确定它是哪个对象(您可能希望有5个可能的对象),并对每种不同的对象类型执行类似Select Case的操作,以将其转换为String