Les énumérations en VBA

Pour regrouper des constantes entières

En programmation, les énumérations sont un moyen de regrouper des constantes ayant un sens commun.

Ces constantes, alors appelées variables d’énumération, doivent être entières en VBA. Si vous avez déjà programmé via ce langage, vous en avez sans doute déjà utilisé. Par exemple, xlCalculationAutomatic, xlCalculationManual et xlCalculationSemiautomatic, correspondant chacune à une option de calcul, sont membres de l’énumération XlCalculation d’Excel.

Rassembler ainsi des valeurs simplifie aussi bien la conception que le développement.

Au cours de ce billet, nous allons voir comment fonctionnent les types énumérés en VBA.

C’est parti !

Pour ce billet, nous nous placerons dans l’environnement Microsoft Office.

Définition

En introduction, nous avons dit que les énumérations permettent de regrouper des constantes entières en VBA.

Par exemple, nous pourrions vouloir gérer le statut de publication d’un contenu tel que sur Zeste de Savoir.

Sans énumération, cela donnerait :

Public Const STATUT_CONTENU_BROUILLON As Integer = 0
Public Const STATUT_CONTENU_BETA As Integer = 1
Public Const STATUT_CONTENU_VALIDATION As Integer = 2
Public Const STATUT_CONTENU_PUBLIE As Integer = 3

Et avec énumération ?

Déclaration d’une énumération

Voyons cela.

Syntaxe

Pour définir un type énuméré, il faut utiliser l’instruction Enum en indiquant un niveau de visibilité (Public par défaut), un nom et des constantes qui seront alors de type Long.

En reprenant le même exemple avec énumération, cela donnerait :

Public Enum EStatutContenu
    eBrouillon
    eBeta
    eValidation
    ePublie
End Enum

Cette déclaration crée à la fois un type énuméré EStatutContenu mais aussi des constantes eBrouillon, eBeta, eValidation et ePublie.

Emplacement

Il faut déclarer ses types énumérés en tête de fichier au risque de rencontrer des erreurs de compilation dans le cas contraire.

Zone "Déclarations"
Zone "Déclarations"

Il est possible de déclarer des énumérations dans n’importe quel type de fichier, y compris les classes, mais les énumérations déclarées dans ces dernières ne sont pas considérées comme membres de la classe.

Nous pouvons constater que les énumérations sont listées à part à travers l’explorateur d’objets (raccourci F2) pour le projet en cours :

Explorateur d'objets et types énumérés
Explorateur d’objets et types énumérés

Nommage

Concernant le nommage, une solution répandue est de préfixer le nom de l’énumération par E et les membres de celle-ci par e. Cela peut être un identifiant de bibliothèque aussi.

Quant aux variables d’énumération, certaines reprennent une partie du nom de l’énumération dans le leur (XlCalculation vu en introduction par exemple), d’autres non (XlDisplayUnit par exemple).

Vous pouvez regarder des exemples à travers l’explorateur d’objets.

L’important c’est d’avoir des noms parlants et d’éviter les conflits de nommage.

Affectation de valeurs aux variables d’énumération

Voyons maintenant comment gérer les valeurs des membres.

Valeurs par défaut

Par défaut, des valeurs incrémentées à partir de zéro sont affectées aux variables d’énumération :

Public Enum EStatutContenu
    eBrouillon ' 0
    eBeta ' 1
    eValidation ' 2
    ePublie ' 3
End Enum

Affectation partielle ou intégrale

Bien sûr, nous pouvons choisir partiellement ou intégralement les valeurs. Les valeurs non décidées sont déduites des précédentes via l’incrémentation encore une fois.

Public Enum EStatutContenuAffectationPartielle
    eStatutContenuAffectationPartielleBrouillon = -2 ' -2
    eStatutContenuAffectationPartielleBeta ' -1
    eStatutContenuAffectationPartielleValidation = 5 ' 5
    eStatutContenuAffectationPartiellePublie ' 6
End Enum

Public Enum EStatutContenuAffectationComplete
    eStatutContenuAffectationCompleteBrouillon = -20 ' -20
    eStatutContenuAffectationCompleteBeta = -10  ' -10
    eStatutContenuAffectationCompleteValidation = 0 ' 0
    eStatutContenuAffectationCompletePublie = 10.7 ' 11
End Enum

Remarquez que nous pouvons utiliser des valeurs négatives et que les nombres flottants sont automatiquement arrondis.

Utilisation de constantes

Il est aussi possible d’utiliser des constantes :

Public Enum EStatutContenuAvecConstantes
    eStatutContenuAvecConstantesBrouillon = STATUT_CONTENU_BROUILLON ' 0
    eStatutContenuAvecConstantesBeta = STATUT_CONTENU_BETA ' 1
    eStatutContenuAvecConstantesValidation = STATUT_CONTENU_VALIDATION ' 2
    eStatutContenuAvecConstantesPublie = STATUT_CONTENU_PUBLIE ' 3
End Enum

Cas des membres d’énumération masqués

Comme nous le verrons par la suite, il est faisable d’itérer sur des valeurs d’une énumération. Mais les noms peuvent changer. Et puis, des constantes peuvent être ajoutées ou supprimées en cours de route, impactant notre programme. Ce n’est pas pratique.

C’est un intérêt des membres masqués.

Ils s’écrivent entre crochets et sont préfixés d’un _, comme ceci :

Public Enum EIndexColonneContenu
    [_Debut] ' 0
    eIndexColonneTitre ' 1
    eIndexColonneDescription ' 2
    eIndexColonneStatut ' 3
    [_Fin] ' 4
End Enum

Ils sont alors masqués dans l’explorateur d’objets et la complétion de code :

Membres non affichés dans l'explorateur d'objets
Membres non affichés dans l’explorateur d’objets

Pendant cette première section, nous avons vu comment définir des énumérations en VBA.

Utilisation

Maintenant que nous avons défini une énumération, nous allons pouvoir voir les façons de l’utiliser.

D’une part, le type énuméré regroupe les différentes constantes. D’autre part, comme son nom l’indique, c’est un type dont nous pouvons nous servir pour des variables, des paramètres ou encore des valeurs de retour.

Accès aux variables d’énumération

Nous accédons aux constantes via la notation NomEnumeration.NomVariableEnumeration ou NomVariableEnumeration tout simplement.

Debug.Print (EStatutContenu.ePublie) ' 3
Debug.Print (ePublie) ' 3

Un avantage de la première approche est l’aide au développement (IntelliSense) quand on ne connait pas forcément les noms :

Aide au développement (IntelliSense)
Aide au développement (IntelliSense)

Utilisation du type énuméré

Nous pouvons utiliser notre nouveau type pour déclarer des variables ainsi que définir le type de paramètres ou retours :

Dim eStatut As EStatutContenu
eStatut = ePublie

Private Function StatutToString(ByVal eStatut As EStatutContenu) As String
    ' ...
End Function

Private Function ChoixStatut() As EStatutContenu
    ' ...
End Function

Itération

L’itération sur les valeurs est rendue possible par la boucle For avec les bornes voulues :

Private Sub Exemple_Iteration()
    Dim eIndexColonne As EIndexColonneContenu
    For eIndexColonne = EIndexColonneContenu.[_Debut] + 1 To EIndexColonneContenu.[_Fin] - 1
        Debug.Print (eIndexColonne)
        ' 1
        ' 2
        ' 3
    Next eIndexColonne
End Sub

Cela ne fonctionne pas s’il y a discontinuité entre les valeurs comme dans notre exemple EStatutContenuAffectationPartielle !

Exemple final

Voici un exemple dans lequel l’utilisateur choisi un code de statut de contenu, ce code de statut est ensuite transposé en texte et les informations sont insérées dans une liste de données :

Public Enum EStatutContenu
    eBrouillon ' 0
    eBeta ' 1
    eValidation ' 2
    ePublie ' 3
End Enum

Private Function StatutsPossibles() As String
    Dim sResult As String
    
    Dim eStatut As EStatutContenu
    For eStatut = eBrouillon To ePublie
        sResult = sResult & CStr(eStatut) & " - " & StatutToString(eStatut) & vbNewLine
    Next eStatut
    
    StatutsPossibles = sResult
End Function

Private Function StatutToString(ByVal eStatut As EStatutContenu) As String
    Select Case eStatut
      Case 0
        StatutToString = "Brouillon"
      Case 1
        StatutToString = "Bêta"
      Case 2
        StatutToString = "Validation"
      Case 3
        StatutToString = "Publié"
      Case Else
        StatutToString = ""
    End Select
End Function

Private Function ChoixStatut() As EStatutContenu
    On Error GoTo GestionErreur
    Dim sMsg As String
    sMsg = "Merci de choisir une valeur de statut parmi la liste suivante :" & vbNewLine & StatutsPossibles
    
SaisieStatut:
    ChoixStatut = CLng(InputBox(sMsg))
    If (ChoixStatut < eBrouillon Or ChoixStatut > ePublie) Then
        Err.Raise vbObjectError + 1000
    End If
    Exit Function
    
GestionErreur:
    sMsg = "/!\ " & sMsg
    Resume SaisieStatut
End Function

Private Sub AjouteLigneContenu(ByVal vContenuLigne As Variant)
    Dim loContenus As ListObject
    Set loContenus = Sheets(1).ListObjects("TableauContenus")
    
    Dim lrLigne As ListRow
    Set lrLigne = loContenus.ListRows.Add
    lrLigne.Range = vContenuLigne
End Sub

Private Sub Main()
    Dim eStatut As EStatutContenu
    eStatut = ChoixStatut()
    
    Dim vContenuLigne As Variant
    vContenuLigne = Array("Un super tuto", "pour apprendre des supers trucs", StatutToString(eStatut))
    
    AjouteLigneContenu (vContenuLigne)
End Sub
Exécution du programme  avec fenêtre saisie code statut
Exécution du programme avec fenêtre saisie code statut
Résultat après plusieurs exécution de Main pour les différents statuts
Résultat après plusieurs exécution de Main pour les différents statuts

Au fil de cette seconde section, nous avons vu comment nous servir des énumérations en VBA.


C’est déjà la fin de ce billet.

Au cours de celui-ci, nous avons vu comment définir et utiliser des énumérations en VBA.

D’autres langages tels que Python offrent davantage de possibilités, comme pouvoir créer des énumérations de chaîne de caractères ou encore accéder aux noms des constantes.

À bientôt !

Quelques ressources :

Aucun commentaire

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte