我正在尝试为excel-VBA创建一个函数。此函数用于计算组合框或列表框中某个字符串的索引。我希望该函数具有以下签名:
Public Function MyIndexOf(list As ???, str As String) As Integer
我的问题是,如果Combobox和Listbox有一个共同的超类,那么我可以替换???有些课。
也许还有另一种方法可以做IndexOf。建议是受欢迎的,但我希望它可以在一个共同的单独功能中完成。
有人建议如何解决这个问题?
提前致谢 /帕特里克
答案 0 :(得分:4)
VBA(或VB 6)中没有继承,所以遗憾的是没有超类这样的东西。
但是,你确实可以获得非常宽松的打字。您可以将变量声明为Variant
,这是一种通用数据类型,可以包含任何类型的值,包括控件。一般情况下,如果可能的话,你应该尝试避免使用Variant
类型,但在这种情况下,你别无选择。
所以你可以这样声明你的函数:
Public Function MyIndexOf(list As Variant, str As String) As Integer
' Do work here...
End Function
当然,记住Variant
数据类型可以真正保存任何类型的值,并且直到运行时才知道该类型,一个好的防御程序员会检查以确保指定的类型不是Integer
或String
,甚至不是与ComboBox
或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