IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Faire préfixer toutes les enumérations


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut Faire préfixer toutes les enumérations
    Bonjour,

    J'ai un certains d'énumérations que je souhaiterais faire préfixer de enums.

    Je les avais initialement mises dans un module enums.bas, mais ça ne passait pas quand je définissais une énumération, par exemple Dim pState As enums.state en ayant l'erreur user-type not defined. Du coup, je les ai "rangées" dans une classe statique enums.cls, c'est-à-dire avec Attribute VB_PredeclaredId = True, mais ça ne passe quand même pas. J'ignore un peu ce qu'il en est des autres attributs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "enums"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable =  False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Attribute VB_Description = "This class module defines custom enumerations."
    Option Explicit
     
    '
    Public Enum state
        NOT_DEFINED = -1
        IDLE
        RUNNING
        PENDING
        POSTPONED
        EXITING
        [_First] = IDLE
        [_Last] = EXITING
    End Enum
    Biensûr, si je pourrais sous-décliner les énumérations comme Dim pState As enums.external.current.state, ça serait encore mieux...

    Prenneur d'idées et merci par avance !

  2. #2
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Bonjour:
    Qu'est ce que c'est ?
    Une déclaration enum ne peut être encapsulé de cette façon.
    Le type de la déclaration Enum foo est d'ores et déjà un alias du type int (si l'on peut s'exprimer ainsi), qui voudrait ne recevoir que les membres nommées qui y sont spécifiées:

    L'utilisation que tu voudrais en faire n'est possible que dans le jeu UDT. une variable de ce type peut avoir une sous variable du type de l'enum declare.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum foo
        ...
    end enum
     
    type anyvar
        state as foo
    end type
     
    dim enums  as anyvar
    ...

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    Merci pour ces précisions. A vrai dire, j'avais par la suite lu que les déclarations enum se situent à niveau du "scope" du projet VBA.

    Je vais quand même réfléchir à ces type. Mais du coup, est que le fait que l'on peut par exemple écrire vbRed, VBA.vbRed et VBA.colors.vbRed reflètent cette remarque ? J'ignore aussi si l'on peut avoir des énumérations "plus profondes / classées"... (désolé si je ne suis pas très clair)

  4. #4
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Tout dépend de la portée, comme tu as pu le comprendre.
    La nécessite de préfixer, ne sert qu'a éviter les conflits de résolution de nom, quand plus d'une déclaration de portée égale porte le même nom.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je pense qu'écrire des énumérations du type VBA.vbRed n'est pas possible en VBA. Il n'est pas possible de créer des constantes publiques de classe personnalisée en VBA.

    Perso, je créerais les enum dans un module standard. Si tu y tiens, tu les préfixes de enum pour t'aider de la saisie semi-automatique. Perso, j'utilise juste e (eChoice pour le générique, eChoiceNone, etc...) Tu peux attribuer un entier long aux constantes du Enum que tu crées. Si tu ne spécifies rien, VBA commence à 0 et incrémente de 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Enum enumChoice
      enumChoiceNone
      enumChoiceSave
      enumChoiceDelete
    End Enum
     
    Public Enum enumContactType
      enumContactTypeCustomer = -1
      enumContactTypeSupplier = 5
      enumTest = 1000000
    End Enum
    On ne peut pas non plus préfixer les Enum créés du nom du module standard qui les contient, de sorte qu'une énumération est unique pour tout le projet.


    Tu peux créer des énumérations publiques dans une classe perso pour pouvoir en passer des éléments en arguments de fonctions ou procédures publiques de la classe perso.

    Code d'une classe Classe1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Public Enum eChoice
      echoicenone
      eChoiceSave
    End Enum
     
    Private mChoice As eChoice
     
    Public Sub Init(Choice As eChoice)
      mChoice = Choice
    End Sub
    Code d'un module standard qui utilise cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
      Dim e As New Classe1
     
      e.Init eChoiceSave
    End Sub

    Tu peux bien sûr ne pas répéter le nom de l'énumérateur dans les constantes, mais tu augmentes le risque de conflit avec d'autres variables éponymes. Dans l'exemple suivant, cela signifie que tu ne peux plus utiliser None, par exemple, ailleurs dans ton code comme nom de variable ou de constante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Enum eChoice
      None
      Save
      Delete
    End Enum
     
    Sub test()
      Dim e As eChoice
     
      e = Delete
      e = eChoice.Delete
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Saluts,
    en fait je viens de comprendre l'aspiration en relisant le premier post.
    Citation Envoyé par Orbeaman Voir le message
    Biensûr, si je pourrais sous-décliner les énumérations comme Dim pState As enums.external.current.state, ça serait encore mieux...
    Avec le second msg qui donne un exemple vbRed, VBA.vbRed, ...
    Les vbRed, vbXyz sont des declations de type Public const et non des Enum.

    C'est possible avec les déclarations Const mais pas les Enum, qui bien que déclarés dans un module donné, n’apparaîtront pas dans la bibliothèque de type du module. L'utilisation du point (qui est un opérateur d’accès a un sous membre), échouera a trouver ce membre enum dans un module quelconque. Ce qui explique ce qu'a dit Pierre. Il ne peut y avoir deux noms identiques dont l'un est de type Enum dans un meme projet.

    Objectivement, je ne vois pas d’utilité a cette rallonge d’écriture pour un type Enum.

    La nécessite peut venir de cas rares ou tu aurais deux déclarations identiques avec des valeurs différentes dans 2 projets distincts. Et si le code voudrait forcer la priorité de résolution sur l'autre projet, il ne doit aller le chercher au delà du niveau projet.. C'est mieux ainsi.

    Voici un exemple pour ce cas donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Enum FormShowConstants
        mpModal
        mpModeless
    End Enum
     
     
    Dim source As VBA.FormShowConstants
    Dim clone As FormShowConstants
    sub xEnum
       source = vbModeless
       clone = trois
    End sub

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/09/2019, 16h14
  2. Réponses: 18
    Dernier message: 22/11/2018, 09h11
  3. Réponses: 1
    Dernier message: 26/04/2018, 09h49
  4. Réponses: 0
    Dernier message: 12/04/2015, 18h06
  5. faire defiler toutes les photos
    Par ediziz dans le forum Flash
    Réponses: 11
    Dernier message: 05/02/2007, 22h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo