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 :

Enumération en cascade et Variable Indirect


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut Enumération en cascade et Variable Indirect
    Bonjour à tous,

    J'ai 2 problèmes imbriqués dans mon code mais qui peuvent être traiter distinctement.

    1/Je stocke mes noms et positions de colonne dans une énumération et j'aimerai pouvoir identifier des blocs de colonnes. J'ai pensé à faire des Enum en cascade mais ça ne marche pas

    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
    Public Enum ColData 'Position des colonnes de InitData
        Inv = 1
        Equip
        Zone
        Room
        Com
        Crit
        MP 'Première colonne d'un bloc de 5 colonnes
        Metro = 12 'Première colonne d'un bloc de 5 colonnes
    End Enum
     
    Public Enum CS 'Soit ColonneService, qu'on additionne sur l'appel des blocs des différents services (MP et Metro)
        Start
        Freq
        Last
        Statut
        SDate
    End Enum
    Voilà mon code qui fonctionne bien mais que je trouve un peu inesthétique, car si je veux appeler une colonne du Bloc MP ou du bloc Metro ça donne ceci :
    Et j'aurai clairement Préféré quelque chose du genre
    Est-ce possible?

    2/Le problème suivant découle un peu de ça. Une variable stService de type String stocke "MP" ou "Metro" suivant différentes conditions.
    Je voudrais pouvoir appeler mes deux variables du point 1 grâce à la valeur de stService.
    Sous excel la fonction INDIRECT existe mais je ne trouve pas d'équivalent sous VBA.

    aussi est-ce possible?

  2. #2
    Membre expérimenté

    Homme Profil pro
    Technical Account Manager
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technical Account Manager

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Billets dans le blog
    1
    Par défaut
    Si tu souhaites utiliser la fonction indirect, tu peux utiliser cette option de VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("ta feuille").Cells(indice-ligne, indice-colonne).Formula = "=Indirect(" & "ton instruction" & ")"
    L'option Formula te permet d'écrire une formule dans une cellule (ou plage) choisi.
    La valeur ajoutée sera une chaine de caractère contenant ta formule.
    Alors fait attention à bien ajouter le "&" pour la concaténation de ta formule avec de possibles variables.

  3. #3
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Salut Xela,

    ce n'est absolument pas ma question

    Je souhaite appeler une variable en VBA dont le nom serait le résultat d'une (ou plusieurs) autre variable(s). A la manière de la formule indirect() de excel.
    On parle bien ici de variables internes à un projet qui n'ont pas vocation à être renvoyer dans une page excel (je ne cherche pas à concaténer une formule).

    Je sais pas si c'est beaucoup plus clair

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'a absolument rien compris!
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Public Type CS 'Soit ColonneService, qu'on additionne sur l'appel des blocs des différents services (MP et Metro)
        Start As Variant
        Freq As Variant
        Last As Variant
        Statut As Variant
        SDate As Variant
    End Type
     
    Public Type ColData 'Position des colonnes de InitData
        Inv As Variant
        Equip As Variant
        Zone As Variant
        Room As Variant
        Com As Variant
        Crit As Variant
        MP As CS  'Première colonne d'un bloc de 5 colonnes
        Metro As Variant  'Première colonne d'un bloc de 5 colonnes
    End Type
     
    Sub test()
    Dim toto(10) As ColData,titi As ColData
    toto(0).MP.Start
    toto(1).MP.Start
    toto(2).MP.Start
    toto(3).MP.Start
    toto(4).MP.Start
    toto(5).MP.Start
    toto(7).MP.Start
    toto(8).MP.Start
    toto(9).MP.Start
    toto(10).MP.Start
     
    titi.MP.Start
    End Sub

  5. #5
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut C'est où la sortie?
    mârde je crois que je suis nul pour expliquer mes problèmes... du coup je ne mérite pas ma signature.

    Je vais essayer de travailler avec ce que tu m'as envoyé déjà et je vous reformule tout ça autour de lundi si ça marche tjs pas.

    merci

  6. #6
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Non allez je me couragise à 2 mains avant le we :

    1/ça c'est mon tableau InitData :
    Nom : Sans titre.JPG
Affichages : 491
Taille : 63,4 Ko

    Je souhaite identifier chaque colonne pour pouvoir à la fois facilité la lecture de mon code et pouvoir déplacer facilement mes colonnes. j'utilise donc une énumération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Enum ColData 'Position des colonnes de InitData
        Inv = 1
        Equip
        Zone
        Room
        Com
        Crit
        MP 'Première colonne d'un bloc de 5 colonnes
        Metro = 12 'Première colonne d'un bloc de 5 colonnes
    End Enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(ActiveRow, ColData.Inv)= "Poney"  'Je sais à la simple lecture du code que je suis positionné dans la colonne "Inventaire" du tableau InitData (soit la colonne 1)

    Le problème c'est pour me balader dans le bloc de "MP" ou de "Metro"

    J'aimerais pouvoir écrire quelque chose comme Pour me positionner dans la colonne Féquence du bloc MP (la 2éme du bloc)
    ou encore Pour me positionner dans la colonne Statut du bloc Metro (la 3éme)

    Pour l'heure, en ajoutant ce bloc si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Enum CS 'Soit ColonneService, qu'on additionne sur l'appel des blocs des différents services (MP et Metro)
        Start 
        Freq 
        Last 
        Statut 
        SDate 
    End Enum
    Je n'arrive que à me positionner sur la première colonne du bloc choisi, auquel j'additionne la position dans le bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ColData.MP+CS.Freq 'on identifie la colonne fréquence du bloc MP
    Ça fonctionne bien pas de souci mais je trouve pas ça très esthétique. (en faite j'ai pas vraiment de souci, je cherche à paufiner mon art VBA ^^)

    2/ Plus tard parce que là je dois y aller :p

  7. #7
    Invité
    Invité(e)
    Par défaut
    bonjour,
    le problème est que tu veux chaîner des énumérateur, un énumérateur encapsule des constante numérique! hors par définition un énumérateur n'est pas un numerique

    énumérateur.énumérateur.énumérateur ce n'est pas possible;

    en revanche le type si Type.typ.type mais il faut les Initialiser.

    tu peux chainer de module de classe

    bien sur il faut les initialiser également mais tu dispose d'un événement Initialize pour faire ça

    Class.class.class
    voila à quoi pourrait ressembler ton module de classe
    Code Classe1 : 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
     
    Public Inv As Integer
    Public Equip As Integer
    Public Zone As Integer
    Public Room As Integer
    Public Com As Integer
    Public MP As New Classe2
    Public Crit As Integer
    Public Metro  As Integer      'Première colonne d'un bloc de 5 colonnes
    Private Sub Class_Initialize()
    Inv = 1
    Equip = 1
    Zone = 1
    Room = 1
    Com = 1
    Crit = 1
    Metro = 1
    MP.Start = 1
    MP.Freq = 1
    MP.Last = 1
    MP.SDate = 1
    End Sub
    Code Classe2 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Start  As Integer
    Public Freq    As Integer
    Public Last As Integer
    Public Statut As Integer
    Public SDate As Integer
    Code Sub test : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    Dim ColData As New Classe1
    Debug.Print ColData.MP.Freq
    End Sub
    Dernière modification par Invité ; 20/02/2016 à 11h51.

  8. #8
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Ok merci

    Je vais celle qui me convient le mieux

  9. #9
    Invité
    Invité(e)
    Par défaut
    pour ta question 2
    ColData.stService
    il faut que tu m'en dise plus!

    un module de classe est très puissant tu peux créer des propriétés!

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Public Inv As Integer
    Public Equip As Integer
    Public Zone As Integer
    Public Room As Integer
    Public Com As Integer
    Public MP As New Classe2
    Public Crit As Integer
    Public Metro  As New Classe2    'Première colonne d'un bloc de 5 colonnes
    Private Sub Class_Initialize()
    Inv = 1
    Equip = 1
    Zone = 1
    Room = 1
    Com = 1
    Crit = 1
    
    Metro.Start = 1
    Metro.Freq = 1
    Metro.Last = 1
    Metro.SDate = 1
    MP.Start = 1
    MP.Freq = 1
    MP.Last = 1
    MP.SDate = 1
    
    End Sub
    Public Property Get service(strService As String) As String
        If strService = "MP" Then
            service = MP.Freq
        Else
            service = Metro.Freq
        End If
    End Property
    
    Property Let service(ParamArray Value() As Variant, Valeu2 As Variant)
     If Trim("" & Valeu2(0)) = "MP" Then
             MP.Freq = Valeu2(1)
        Else
             Metro.Freq = Valeu2(1)
        End If
    End Property
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
    Dim ColData As New Classe1
    Debug.Print ColData.MP.Freq
    Debug.Print ColData.service("MP")
    ColData.service = Array("MP", "2")
    End Sub
    Dernière modification par Invité ; 22/02/2016 à 17h15.

  10. #10
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Bonjour rdurupt,

    Désolé pour le temps de réponse un peu long. En réalité j'ai retouché pas mal de chose et du coup la question ne se pose plus...

    Jusqu'à présent je n'ai jamais eu besoin d'utiliser de module de classe, tout du moins je n'en ai pas ressenti l'utilité mais je sais que je passe à côté d'un gros morceau et il faudra un jour que je me forme à ça.

    Merci encore

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    oui les module de classe on une puissance phénoménal!

    il encapsule des propriétés et des méthodes! un module de classe c'est un véritable programme sous forme de variable!

    tu réalise un programme en hiérarchisant tes classe et tu passe des ordres d'une instance de la classe à l'autres sens plus te soucier de ce qui ce passe de dans!

    mais au début c'est un grand moment de solitude et de dépaysement!

    il existe des tutoriels, mais personnellement je ne les trouve pas suffisamment abouti! facile de dire ça je ne sais pas ce que ça donnerait si je m'y collai!

    je rêve dans créer un autour d'un projet et de tous ses aspect, j'ais déjà une idée de sujet, mais comme je suis un peut fou, je me demande le temps que ça vas prendre!

    un détail, j'ai toujours pas compris comment publier un tuto!

  12. #12
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    j'avoue que le peu de fois où je me suis penché sur le sujet, j'ai rapidement été dépassé et que j'ai du mal à voir quelle applications concrètes je pourrais en tirer. Les modules de base m'ont toujours permis d'arriver proprement à mes fins.

    Cela dit je travaille sur un projet assez poussé (pour moi) en ce moment et je pense que je commence à frôler la nécessité du module de classe.

    la suite au prochain épisode

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2008, 16h47
  2. [trigger] Indirection Des Variables De Liens
    Par stephDeZ dans le forum Administration
    Réponses: 6
    Dernier message: 27/03/2007, 22h46
  3. [Cookies] Variables en cascade
    Par gaeil dans le forum Langage
    Réponses: 6
    Dernier message: 20/01/2007, 23h51
  4. Fonction INDIRECT avec variable sur n° de colonne
    Par mat.guillaume dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/08/2006, 18h04
  5. Appel ou affectation indirects de variables
    Par BARRIN dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/11/2005, 18h17

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