Question 204

Comment référencer une variable dynamiquement par son nom ?

Visual Basic, au contraire de certains langages de scripting, ne permet pas directement de référencer une variable par son nom. Cependant, il est possible d’obtenir ou de simuler cette fonctionnalité. Cet article présente une série de méthodes utilisables dans ce but.

Variables indicées et tableaux

Dans la majorité des cas, les variables sont traitées comme faisant partie d'un ensemble ordonné, c'est à dire un ensemble dans lequel chaque élément peut se voir attribuer un numéro unique. Typiquement, les tableaux permettent de traiter ce genre de cas.

L'exemple suivant illustre un cas classique où l’utilisation d’un tableau permet l’écriture d’un code simple et efficace. Dans cet exemple, le but est d’écrire une fonction réalisant le comptage des résultats de jets d’un dé à 6 faces.

Le code ci-dessous est un exemple de ce qu’il ne faut PAS faire (utilisation de 6 variables) :

'Exemple de MAUVAISE implémentation
'
Public Sub Lance( _
   n As Long, _
   ByRef Face1 As Long, ByRef Face2 As Long, _
   ByRef Face3 As Long, ByRef Face4 As Long, _
   ByRef Face5 As Long, ByRef Face6 As Long)

    Dim Face As Long
    Dim i As Long
    
    For i = 1 To n
        'Genere un nombre aleatoire
        Face = Int(Rnd() * 6)
        
        'Augmente de 1 la face correspondante
        If (Face = 0) Then
            Face1 = Face1 + 1
        ElseIf (Face = 1) Then
            Face2 = Face2 + 1
        ...
        End If
    Next i
End Sub

On préfèrera :

'Exemple de meilleure implémentation
'
Public Function Lance(n As Long) As Long()
    Dim Resultat(0 To 5) As Long
    Dim Face As Long
    Dim i As Long
    
    For i = 1 To n
        'Genere un nombre aleatoire
        Face = Int(Rnd() * 6)
        
        'Augmente de 1 la face correspondante
        Resultat(Face) = Resultat(Face) + 1
    Next i
    
    'Retourne le tableau de resultat
    Lance = Resultat
End Function

'Exemple d'utilisation
Public Sub test()
    Dim t() As Long
    Dim i As Long
    
    t = Lance(10)
    
    'Affiche le resultat pour chaque face
    For i = 0 To 5
        MsgBox "Nombre de " & i & ": " & t(i)
    Next i
End Sub

Les tableaux peuvent soit contenir un nombre fixe (statique) d'entrées, comme c'est le cas dans notre exemple, ou avoir un nombre d'entrées variable durant l'exécution. Les différences entre ces deux types de tableaux sont décrites dans l'article "Comment choisir entre utiliser un tableau de taille fixe (statique) et un tableau dynamique ?".

Collections et nom d'éléments

Les Collections permettent d'attacher un nom à chacune des entrées qu'elles contiennent ; Ceci réalise en pratique la référence à une variable par une chaîne de caractères. L'article traitant de l'utilisation des collections explique ceci en détail.

Contrôles dynamiques

Les contrôles gérés dynamiquement sur une feuille sont un cas particulier de l'utilisation des collections, et en particulier de la collection Controls d'un objet Form. L'article traitant des contrôles dynamiques présente ceci en détail.

Evaluation dynamique d'expressions

Dans un souci d’exhaustivité, il faut mentionner la possibilité de référencer une variable globale par son nom, à l'aide de l'API VB6, et de sa fonction EbExecuteLine. Ceci est présenté dans l'article traitant de l' évaluation d'expressions mathématiques. Néanmoins, cette méthode n'est ni supportée, ni documentée et son utilisation peut mener à des résultats inattendus. De plus, un programme d'installation ne peut légalement redistribuer l'API requise. Son utilisation est donc fortement déconseillée.

Voir aussi :

Date de publication : 24 janvier 2009
Dernière modification : 24 janvier 2009
Rubriques : Généralités
Mots-clés : variable, nom, dynamique, collection, tableau, multiple, var, dim, dynamiquement, référence