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 :

Référence des colonnes d'un tableau excel dans une macro [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien génie civil
    Inscrit en
    Novembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien génie civil

    Informations forums :
    Inscription : Novembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Référence des colonnes d'un tableau excel dans une macro
    Bonjour,

    Ceci étant ma première interaction sur ce forum, je tiens d'abord à remercier tous et chacun puisque ce site m'apprend et m'apporte une quantité phénoménale de connaissances et de réponses à mes questions et problèmes.
    Je reste malgré tout débutant sur VBA mais je vais tenter de m'expliquer au mieux.

    Mon questionnement est donc (j'ai résumé mon exemple, mon chiffrier est bien plus complexe mais le principe est identique) ;
    J'ai un tableau nommé "Liste" dans un onglet excel nommé "Feuil1".
    Ce tableau contient 2 colonnes nommées "Index" et "Nom", et un nombre indéterminé de ligne.
    Je cherche comment faire référence aux différentes colonnes avec une macro.
    Le problème est qu'au final le nombre de colonne sera variable et évoluera au fil du temps.
    C'est pourquoi je cherche une syntaxe permettant d'utiliser le nom de mes colonnes au lieu d'utiliser leur numéro.
    J’envisageais même de peut-être stocker dans des variables les noms des colonnes, ainsi ceux-ci pourrais être changé dans mon tableau excel sans aucune incidence sur mon code.
    Mais je ne sais pas si tout cela est possible.

    J'ai créé une variable pour mon tableau pour ensuite y faire référence (elle se situe dans module séparé pour être utilisé dans mes autres modules et userforms) :
    Je cherche à faire référence aux différentes colonnes en utilisant leurs noms plutôt que leurs numéros de position, puisque si j'en ajoute une, la colonne 2 devient la colonne 3 et mon code ne fonctionne plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ' Dans un premier module (Module1)
    Global Tableau As ListObject
     
    Public Sub VariableTableau()
     Set Tableau = Worksheets("Feuil1").ListObjects("Liste")
    End Sub
     
    ' Dans un second module (Module2)
    Private Sub ReferenceTableau()
     Call Module1.VariableTableau
     Tableau.Range(2,2).Select
    End Sub
    La colonne 2 étant "Index", comment puis-je faire pour y faire référence avec son nom au lieu de son numéro.
    Cela fait un moment que je fouille partout sur internet sans grand succès, je n'ai peut-être rien compris à certains principes de base.
    Cette syntaxe ne fonctionne pas mais je me demandais si je pouvais obtenir quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau.Range(2,"Index").Select
    Je suis confronté au même genre de problème lorsque je tente de remplir une combobox dans un userform avec ce même tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub UserForm_Initialize()
     Call Module1.VariableTableau
     Combobox1.RowSource = Tableau
    End Sub
    Mais ceci ne considère que la première colonne, c'est la deuxième dont j'ai besoin.
    J'ai palié ce problème avec une boucle mais cela augmente grandement la quantité de code à écrire.
    Et j'ai le même problème du fait que la colonne 2 peut devenir la colonne 3 (certain de mes tableaux auront de nouvelles colonnes ajouté par macro, je ne peut donc pas aller modifier mon code à chaque fois).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub UserForm_Initialize()
     Call Module1.VariableTableau
     Dim I As Long
     Dim NbRow As Long
      NbRow = Range(Tableau).Rows.Count
     For I = 1 To NbRow
      Combobox1.AddItem Tableau.Range(I + 1, 2)
     Next I
    End Sub
    Je sais qu'avec une formule dans une cellule je peux faire référence avec les noms des colonnes tel que ;
    =Liste[[#En-têtes];[Index]]
    Je ne sais donc pas si je peux reproduire le même principe dans une macro.
    Bref, est-ce que quelqu'un aurait une solution, où bien suis-je complètement à côté de la plaque en tentant de faire quelque chose d'impossible.

    Merci beaucoup

    BigBill_125

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    chaque colonne d'un Listobject est un objet appartenant à la collection ListColumns
    L'on peut faire ainsi référence à une colonne via son nom, comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub toto()
    Dim Tablo As ListObject
    Set Tablo = Feuil1.ListObjects(1)
        With Tablo.ListColumns("A")  ' la colonne dont l'en-tête s'appelle "A"
            MsgBox .Index  ' numéro de colonne au sein du tableau
            MsgBox .DataBodyRange.Address ' adresse de la plage de données de cette colonne
        End With
    End Sub

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Si tu veux faire référence à des noms plutôt que des numéros, il te suffit de sélectionner toute la colonne et la nommer dans la zone de nom et ensuite tu peux y faire référence de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range("Nom").Cells(2, 1).Address(0, 0)
    Si la colonne "Nom" est par exemple la colonne D, le code va retourner l'adresse "D2"

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien génie civil
    Inscrit en
    Novembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien génie civil

    Informations forums :
    Inscription : Novembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Avec les propriétés de l'entité ListColumns j'arrive enfin à éviter d'utiliser les numéro.
    J'arrive également à éviter les boucles pour remplir mes combobox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Combobox1.RowSource = Liste.ListColumns("Nom").DataBodyRange.Address
    Pour ce qui est d'une plage nommé, j'utilise les tableaux pour justement éviter de les utiliser. Puisque j'en ai déjà une certaine quantité qui servent à d'autre fin, je fini par me mêler vue que je fini par en avoir une trop grande quantité (mon chiffrier à une taille plus ou moins imposante avec beaucoup d'éléments différent).

    Merci beaucoup
    Vous venez de considérablement réduire la longueur de mon code qui contournais tout cela.

    Au plaisir et bonne journée

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien génie civil
    Inscrit en
    Novembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien génie civil

    Informations forums :
    Inscription : Novembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Simplement pour la postérité de ceux qui liront cette discussion,

    Cette ligne de code pour remplir la combobox implique que l'onglet contenant le tableau excel doit être actif puisque cela utilise l'adresse des cellules au lieu d'en extraire les données directement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Combobox1.RowSource = Liste.ListColumns("Nom").DataBodyRange.Address
    Ce qui me dérangeais puisque je ne voulais pas être limité à changer d'onglet à chaque fois.
    Pour palier à ce problème, j'ai créé une variable range qui me permet d'utiliser ma liste de données peu importe l'onglet actif.
    Et ayant placé cette variable dans un module séparé, je peux ainsi l'utiliser partout.
    (Exemple basé sur le précédent ; Tableau excel nommé "Liste" avec colonne cible "Nom" dans l'onglet "Feuil1" )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'Dans mon Module1
    Global Tableau As ListObject
    Global ListeNom As Range
     
    Public Sub VariableTableau()
       Set Tableau = Worksheets("Feuil1").ListObjects("Liste")
       Set ListeNom = Tableau.ListColumns("Nom").DataBodyRange
    End Sub
     
    'Dans mon Userform
    Private Sub UserForm_Initialize()
       Call Module1.VariableTableau
       Combobox1.List = ListeNom.Value
    End Sub

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour,

    vite fait en passant l'onglet n'a pas besoin d'être actif avec la propriété Address bien utilisée !
    Voir l'aide VBA interne concernant son argument External

    ___________________________________________________________________________________________________________
    Je suis Paris, New-York, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

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

Discussions similaires

  1. [Débutant] tracer des données d'un tableau Excel dans la même page
    Par skander12 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 26/01/2016, 17h32
  2. Réponses: 2
    Dernier message: 25/05/2009, 09h38
  3. Réponses: 6
    Dernier message: 08/12/2006, 13h07
  4. Insérer des données d'un tableau php dans une table mysql
    Par tom43 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 02/08/2006, 09h38
  5. Réponses: 3
    Dernier message: 12/06/2006, 12h04

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