我正在尝试为 excel-VBA 创建一个函数。该函数用于计算某个字符串在组合框或列表框中的索引。我希望该函数具有以下签名:
Public Function MyIndexOf(list As ???, str As String) As Integer
我的问题是 Combobox 和 Listbox 是否有一个共同的父类(super class),所以我可以替换???与一些类。
也许还有另一种做 IndexOf 的方法。欢迎提出建议,但我希望它在一个共同的单独功能中完成。
有人对如何解决这个问题有建议吗?
提前致谢
/帕特里克
最佳答案
VBA(或VB 6)中没有继承,所以不幸的是没有父类(super class)这样的东西。
但是,您确实受益于非常松散的打字。您可以将变量声明为 Variant
,这是一种通用数据类型,可以保存任何类型的值,包括控件。通常,您应该尽量避免使用 Variant
尽可能输入,但在这种情况下,您别无选择。
所以你可以像这样声明你的函数:
Public Function MyIndexOf(list As Variant, str As String) As Integer
' Do work here...
End Function
当然,请记住
Variant
数据类型实际上可以保存任何类型的值,并且直到运行时才知道类型,一个好的防御性程序员会检查以确保指定的类型不是 Integer
或 String
甚至是不公开与 ComboBox
相同的公共(public)成员的控件或 ListBox
控制(从而破坏您编写的期望代码)。您可以确定
Variant
的实际类型在运行时使用 TypeName
功能。所以你可以简单地修改上面的函数来包含一个保护子句来保护除 ComboBox
之外的任何东西。或 ListBox
传入控制:Public Function MyIndexOf(list As Variant, str As String) As Integer
If (Not TypeName(list) = "ComboBox") And (Not TypeName(list) = "ListBox") Then
MsgBox "Wrong type of list variable was specified."
Else
' Do work here...
End If
End Function
关于VBA Combobox 和 Listbox 通用父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688707/