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.
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 :
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 :
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 :
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
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 :
- La documentation
- Cet article