2011-01-14 5 views
1

J'essaye de créer une fonction pour excel-VBA. Cette fonction est utilisée pour calculer l'index d'une certaine chaîne dans une zone de liste déroulante ou une zone de liste. Je voudrais que la fonction d'avoir la signature suivante:Superclasse commune VBA Combobox et Listbox

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

Ma question est de savoir s'il y a une superclasse commune à Combobox et Listbox donc je peux remplacer ??? avec un peu de classe.

Peut-être existe-t-il une autre façon de faire IndexOf. Les suggestions sont les bienvenues mais je veux que cela se fasse dans une fonction séparée commune.

Quelqu'un at-il une suggestion sur la façon de résoudre ce problème?

Merci à l'avance /Patrik

Répondre

4

Il n'y a pas d'héritage dans VBA (ou VB 6), donc, malheureusement, il n'y a pas une telle chose comme une superclasse.

Vous bénéficiez cependant d'un typage très lâche. Vous pouvez déclarer la variable sous la forme Variant, qui est un type de données universel pouvant contenir n'importe quel type de valeur, y compris un contrôle. Généralement, vous devriez essayer et éviter en utilisant le type Variant si possible, mais dans ce cas, vous avez peu de choix.

Vous pouvez déclarer votre fonction comme ceci:

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


Bien sûr, se rappelant qu'un type de données Variant peut vraiment tenir tout type de valeur, et que le type est connu avant l'exécution -temps, un bon programmeur défensif vérifierait pour s'assurer que le type spécifié n'est pas un Integer ou un String ou même un contrôle qui n'expose pas les mêmes membres publics qu'un contrôle ComboBox ou ListBox (cassant ainsi le code que vous avez écrit en attendant celui qui fait).

Vous pouvez déterminer le type réel d'un Variant lors de l'exécution à l'aide de la fonction TypeName. Donc, vous pouvez simplement modifier la fonction ci-dessus pour inclure une clause de sauvegarde pour protéger contre tout autre qu'un contrôle ComboBox ou ListBox étant passé dans:

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 
+0

-vous pas dire 'TypeName (liste)'? – systemovich

+0

@Geoffrey: Bien sûr que je le fais; bonne prise. Je suppose que vous pouvez dire ce que je nommerais cette variable. C'est réparé. –

+0

Merci fonctionne parfaitement – PKeno

Questions connexes