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

VBA Discussion :

VBA Récupérer le nom d'une variable


Sujet :

VBA

  1. #1
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut VBA Récupérer le nom d'une variable
    Bonjour,

    Je suis confronté à un problème que je n'arrive pas à résoudre malgré mes recherches :

    J'aimerai récupérer le nom d'une variable (string, double, integer...) dans une autre variable string comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim toto as Integer
    Dim nomToto as String
     
    nomToto = NomDeLaVariable(toto)
    nomToto doit contenir "toto". Ceci doit fonctionner pour tout type de variable (string, integer, double).

    Merci pour vos réponses.
    Contrec

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Bonjour,

    j'ai un doute, cherches-tu à récupérer la valeur d'une variable ou son nom ?

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim piou as String
    piou = "Pioupi"
    tu veux trouver "piou" ou bien "Pioupi" ?

    S'il s'agit du premier, je ne comprends pas l'intérêt ou l'objectif
    S'il s'agit du second, un simple
    suffira
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Je veux récupérer "Piou", le nom de la variable et non sa valeur. Puisque tu te demandes quel interêt j'y apporte, je te réponds, peut-être auras-tu une meilleure solution à mon problème, je n'ai pas de contraintes :

    Je possède des modules de classe dont voici un exemple simple, module mModuleTest :

    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
    Private mPath As String
    Private mNumber As Integer
     
    Property Get Path() As String
        Path = mPath
    End Property
     
    Property Let Path(Path As String)
        mPath = Path
    End Property
     
    Property Get Number() As Integer
        Number= mNumber
    End Property
     
    Property Let Number(Number As Integer)
        mNumber = Number
    End Property
    Je voudrai faire un système permettant de sortir une collection de cet objet pour aire du débug dans un fichier Excel. Par exemple, j'ai une collection de cet objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim moduleTestList as Collection
    Elle contient 3 objets mModuleTest :

    1) - "Toto"
    - 34

    2) - "Tata"
    - 45

    3) - "Titi"
    - 72

    Je voudrai sortir ces 3 résultats dans un fichier excel avec comme nom de colonne "Path" et "Number". Pour faire cela, il ne me manque plus qu'à récupérer le nom des 2 variables et m'en servir pour les colonnes. Cette méthode doit s'adapter à tous les objets que j'ai (pas seulement à mModuleTest).

    Voici le résultat final à sortir dans l'excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Path    Number
    Toto     34
    Tata     45
    Titi       72
    Voilà
    Contrec

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    hum, pas convaincu, mais si le résultat attendu dans Excel est celui indiqué, il suffirait de faire une boucle for each + utilisation de mpath et mnumber.

    Mis à part cela, pas la moindre idée
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je suis aussi perplexe que jpcheck (Salut JP)...

    Si tu charges une collection d'objets, tu recherches l'objet sur sa clé d'entrée dans la collection puis tu exprimes ses propriétés, ou tu itères sur les objets de la collection...

    Peux-tu préciser?
    "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 averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    En général je fais une boucle for each monObjet in moduleTestList.

    Pour le contenu il n'y a pas de problème mais c'est pour les entêtes de colonne qu'il me faut récupérer le nom des variables membres de l'objet ("Path" et "Number" à mettre sur la première ligne de l'excel).

    J'ai l'impression que l'on ne peut pas faire ce que je veux...
    Contrec

  7. #7
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Ok... Je commence à comprendre...

    Tu veux pouvoir itérer sur toutes les propriétés de l'objet sans en connaitre les noms...?

    Je pense que ce n'est possible que si la classe met une propriété de type "Properties" à disposition.
    "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...
    ---------------

  8. #8
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Exact, d'une part je voulais itérer sur tous les membres (propriétés VBA) de mon objet, récupérer le nom des variables membres pour créer mes futurs noms de colonnes Excel.

    Pas possible en VBA hein ?
    Contrec

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    voilà deux pistes pour toi.

    1) Tu peux aller lire le module de class de tes objets en récupérant le nom du module par un TypeName() sur une instance de l'objet.

    2) Insérer dans chaque module de class une fonction WhoAmI renvoyant les noms de colonnes de l'objet.

  10. #10
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Merci de ta réponse, le TypeName va m'être bien utile, par contre le but était de ne pas avoir à écrire un code spécifique à chaque module, que tout soit dynamique quel que soit le module de classe.
    Si ce n'est pas possible, possédant plus de 50 modules, ce sera trop lourd à écrire.
    Contrec

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    c'est bien le but de mes propositions.
    Le problème est que si tu ne connais pas le nom des colonnes; comment comptes-tu accèder à leur contenu ?

    Voici un exemple de fonctions qui affiche le nom des colonnes d'un objet contenu dans la collection passé en paramètre. La fonction recherche les procédures Porperty Get en tant que libellé de colonne.

    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
    Public Function GetObjColName(Listing As Collection)
        Dim cbdVBComp As VBComponent, IsFound As Boolean, CurLigne As Long
        Dim ClsModule As CodeModule, ClsObjName As String, LibColonne() As String, colonne As Long, Message As String
    'Si la collection est vide sortir
        If Listing.Count = 0 Then Exit Function
        ClsObjName = TypeName(Listing(1))
        Message = "Collection d'Objets : " & ClsObjName
    'Rechercher le module de class des objets de la collection
       IsFound = False
       For Each cbdVBComp In Application.VBE.ActiveVBProject.VBComponents
        If cbdVBComp.Name = ClsObjName Then IsFound = True: Exit For
       Next
    'Si le module de class est introuvable sortir
       If Not IsFound Then Exit Function
       Set ClsModule = Application.VBE.ActiveVBProject.VBComponents(ClsObjName).CodeModule
    'Lire le module et rechercher les procédures Property Get
        With ClsModule
            colonne = 0
            CurLigne = .CountOfDeclarationLines + 1
            Do While CurLigne <= .CountOfLines
                If InStr(.Lines(CurLigne, 1), "Property Get") = 1 Then
                    colonne = colonne + 1
                    ReDim Preserve LibColonne(1 To colonne)
                    LibColonne(colonne) = .ProcOfLine(CurLigne, vbext_pk_Get)
                    Message = Message & vbCrLf & "Colonne " & colonne & ": " & LibColonne(colonne)
                    CurLigne = CurLigne + .ProcCountLines(.ProcOfLine(CurLigne, vbext_pk_Get), vbext_pk_Get)
                End If
                CurLigne = CurLigne + 1
            Loop
        End With
       MsgBox Message
    End Function

  12. #12
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Je crois «commencer» à comprendre cette fois-ci.

    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
    ' Ajouter une référence à Typelib information
    Dim clsTLI As New TLI.TLIApplication
     
     
    Sub EnumMemberClasse(uneClass As Object)
        Dim IInf As InterfaceInfo, m As MemberInfo
     
        Set IInf = clsTLI.InterfaceInfoFromObject(uneClass)
     
        For Each m In IInf.Members
            ' exemple de traitement
            Debug.Print m.Name, m.ReturnType
        Next
     
    End Sub
    S'il s'agissait de classes contenues dans une librairie, il faudrait passer par Typelibinfofromfile ou Typelibinfofromregistry.

    Utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        Dim clsMyClass As New myClass   ' myClass : La classe à analyser
     
        EnumMemberClasse clsMyClass
    End Sub
    C'est ce que tu recherches ?

  13. #13
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Merci pour vos réponses, c'est bien cela que je cherche. J'ai adapté votre code pour que ça fonctionne dans mon cas précis.

    Il ne me reste plus que la difficulté à boucler sur les valeurs des membres de l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ' Création d'un objet pour l'exemple.
    Dim myObject as new cTest
     
    ' L'objet test a 2 variables membres Id en Integer et Name en string.
    myObject.Id = 5
    myObject.Name = "Toto"
    Peux-ton faire un truc comme cela pour récupérer les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Msgbox(myObject.Cols(1).Value()) ' (Qui contient l'Id 5).
     
    Msgbox(myObject.Cols(2).Value()) ' (Qui contient le nom "Toto").
    Contrec

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    bonjour,
    Oui on peut avec l'instruction CallByname (object,procname,proctype)

    Voici un exemple de code qui affiche par un msgbox les entêtes et les valeurs de chaque objet contenu dans la collection passé en paramètre.

    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
    Public Function GetObjInList(Listing As Collection)
        Dim TLIObj As New TLI.TLIApplication, MyObjImp As TLI.MemberInfo
        Dim LibColonne() As String, Message As String
        Dim colonne As Long, i As Long, ligne As Long
        Dim ListingItem As Object
     
    'Si la collection est vide sortir
        If Listing.Count = 0 Then Exit Function
        colonne = 0
        Message = "Collection d'Objets : " & TypeName(Listing(1)) & " " & Listing.Count & IIf(Listing.Count > 1, " items", " item")
    'Récupération de l'entête des colonnes
        For Each MyObjImp In TLIObj.InterfaceInfoFromObject(Listing(1)).Members
    'Recherche des membres Property Get en tant qu'entête de colonne
            If MyObjImp.InvokeKind = 2 Then
                colonne = colonne + 1
                ReDim Preserve LibColonne(1 to colonne)
                LibColonne(colonne) = MyObjImp.Name
                Message = Message & IIf(colonne = 1, vbCrLf & vbCrLf, "") & vbTab & LibColonne(colonne)
            End If
        Next
    'Si aucune colonne trouvée sortir
    If colonne = 0 Then Exit Function
    'Récupération des valeurs des colonnes pour tous les objets de la collection
        For Each ListingItem In Listing
            Message = Message & vbCrLf
            ligne = ligne + 1
            For i = 1 To colonne
                Message = Message & IIf(i = 1, ligne, "") & vbTab & CallByName(ListingItem, LibColonne(i), VbGet)
            Next i
        Next
        MsgBox Message
    End Function

  15. #15
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Message = Message & IIf(i = 1, ligne, "") & vbTab & CallByName(ListingItem, LibColonne(i), VbGet)
    C'est exactement ça que je recherche, j'essaye tout ça ce matin et je vous tiens au courant, merci beaucoup.
    Contrec

  16. #16
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Ilank ,
    Comme quoi avec VB/VBA il est difficile de dire "ce n'est pas possible".

  17. #17
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    J'aurai encore appris quelque chose de bien utile... Merci!
    "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...
    ---------------

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

Discussions similaires

  1. Récupérer le nom d'une variable
    Par marsupilami34 dans le forum Général VBA
    Réponses: 1
    Dernier message: 11/03/2009, 23h07
  2. Récupérer le nom d'une variable
    Par hector2 dans le forum Scilab
    Réponses: 8
    Dernier message: 15/10/2008, 16h15
  3. [Tableaux] Récupérer le nom d'une variable
    Par Tchupacabra dans le forum Langage
    Réponses: 4
    Dernier message: 20/05/2008, 17h55
  4. [VBA]Stocker le nom d'une variable dans une autre variable
    Par strike57 dans le forum VBA Access
    Réponses: 6
    Dernier message: 23/04/2007, 19h09
  5. [Tableaux] Récupérer le nom d'une variable
    Par lem dans le forum Langage
    Réponses: 6
    Dernier message: 06/02/2007, 10h21

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