VBA Combobox и Listbox общий суперкласс - PullRequest
1 голос
/ 14 января 2011

Я пытаюсь создать функцию для Excel-VBA.Эта функция используется для вычисления индекса определенной строки в выпадающем списке или списке.Я хотел бы, чтобы функция имела следующую подпись:

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

Мой вопрос: существует ли общий суперкласс для Combobox и Listbox, чтобы я мог заменить ???с некоторым классом.

Может быть, есть другой способ сделать IndexOf.Предложения приветствуются, но я хочу, чтобы это делалось в отдельной отдельной функции.

У кого-нибудь есть предложения по решению этой проблемы?

Заранее спасибо / Patrik

1 Ответ

4 голосов
/ 14 января 2011

В 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. Таким образом, вы можете просто изменить указанную выше функцию, включив в нее выражение guard, чтобы защитить от чего-либо, кроме передаваемого в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...