VBA Combobox和Listbox常见的超类

时间:2011-01-14 07:04:18

标签: vba excel-vba excel

我正在尝试为excel-VBA创建一个函数。此函数用于计算组合框或列表框中某个字符串的索引。我希望该函数具有以下签名:

Public Function MyIndexOf(list As ???, str As String) As Integer

我的问题是,如果Combobox和Listbox有一个共同的超类,那么我可以替换???有些课。

也许还有另一种方法可以做IndexOf。建议是受欢迎的,但我希望它可以在一个共同的单独功能中完成。

有人建议如何解决这个问题?

提前致谢 /帕特里克

1 个答案:

答案 0 :(得分:4)

VBA(或VB 6)中没有继承,所以遗憾的是没有超类这样的东西。

但是,你确实可以获得非常宽松的打字。您可以将变量声明为Variant,这是一种通用数据类型,可以包含任何类型的值,包括控件。一般情况下,如果可能的话,你应该尝试避免使用Variant类型,但在这种情况下,你别无选择。

所以你可以这样声明你的函数:

Public Function MyIndexOf(list As Variant, str As String) As Integer
    ' Do work here...
End Function


当然,记住Variant数据类型可以真正保存任何类型的值,并且直到运行时才知道该类型,一个好的防御程序员会检查以确保指定的类型不是IntegerString,甚至不是与ComboBoxListBox控件不公开相同公共成员的控件(因此会破坏代码你写的期待一个人。)

您可以使用Variant函数在运行时确定TypeName的实际类型。因此,您可以简单地修改上述函数以包含一个保护子句,以防止传入ComboBoxListBox控件之外的任何内容:

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