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 :

Combobox multi-colonnes et tableau structuré [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut Combobox multi-colonnes et tableau structuré
    Bonjour le Forum,

    Je souhaiterais alimenter les items d'une zone de liste modifiable à partir de certaines colonnes d'un tableau structuré.
    Pour ce faire, j'ai envisagé plusieurs solutions

    1ère solution: Alimentation par variable tableau.

    Ici, je déploie Listcolumns afin d'utiliser un bloc With, en lieu et place de l'écriture habituelle Range("letablo[lacolonne]")

    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
    Option Explicit
     
    Public Sub gestion_famille_1()
     
    Dim i As Long
     
    With Sht_Famille.ListObjects("T_Famille")
          ReDim montablo(1 To 3, 1 To .ListRows.Count) As Variant
          For i = 1 To .ListRows.Count
                montablo(1, i) = .ListColumns("Prénom").DataBodyRange.Cells(i, 1).Value
                montablo(2, i) = .ListColumns("Ville").DataBodyRange.Cells(i, 1).Value
                montablo(3, i) = .ListColumns("Vacances").DataBodyRange.Cells(i, 1).Value
          Next i
    End With
     
    With Usf_famille
          With .Cbx_équipe
                .Clear
                .ColumnCount = 3
                '.Width = 200
                .ColumnWidths = "45;55;465"
                .List = Application.WorksheetFunction.Transpose(montablo)
                'Valeur du combobox après sélection
                .TextColumn = 1
                'Nombre de lignes affichées lors de la sélection
                .ListRows = UBound(montablo, 2)
                '1er item sélectionné
                .ListIndex = 0
          End With
          .Show 0
    End With
     
    Erase montablo
     
    End Sub
    Or, j'évite tant que possible les boucles.

    J'ai donc envisagé une astuce

    2ème solution: masquer une colonne de la Combobox en lui affectant une largeur égale à 0.

    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
    ublic Sub gestion_famille_2()
     
    With Usf_famille
          With .Cbx_équipe
                .Clear
                .ColumnCount = Range("T_Famille").ListObject.ListColumns.Count
                '.Width = 200
                .ColumnWidths = "45;55;0;65"
                .List = Range("T_Famille").Value
                'Valeur du combobox après sélection
                .TextColumn = 1
                'Nombre de lignes affichées lors de la sélection
                .ListRows = Range("T_Famille").ListObject.ListRows.Count
                '1er item sélectionné
                .ListIndex = 0
          End With
          .Show 0
    End With
     
    End Sub
    Ma question:
    Sans cette astuce.
    Peut-on alimenter une par une chaque colonne de la Combobox en lui affectant directement une colonne du tableau?
    L'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .List(,1) = Range("T_Famille[Prénom]").Value
    me retournat un message d'erreur.

    Par avance, merci pour vos lumineuses lumières

    Bonne journée à tous.

  2. #2
    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 Marcel,

    La propriété List d'un combobox est en fait un array. Du coup, on doit la manipuler comme un array, et il n'est pas possible de valoriser d'un coup une "colonne" d'un array.

    Nom : 2021-10-12_115323.png
Affichages : 106
Taille : 6,1 Ko



    Je ne vois donc pas d'autre solution qu'une boucle pour des colonnes de tableaux structurés disjointes.

    Bien sûr, on peut passer des colonnes jointes. Avec Tableau1 contenant les colonnes A, B, C, D, E, F, ... on pourrait utiliser ComboBox1.List = Range("tableau1[[a]:[d]]").Value

    Comme je l'ai dit dans cette discussion
    , il peut être intéressant de ramener toutes les colonnes du tableau dans le combobox, quitte à en masquer certaines.
    "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...
    ---------------

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Pierre,

    La propriété List d'un combobox est en fait un array. Du coup, on doit la manipuler comme un array,
    C'est ce que je pensais après plusieurs essais infructueux, d'autant que le paramétrage de cette propriété s'effectue en 2 dimensions.

    Merci à toi.

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

Discussions similaires

  1. Renseigner des ListBox/ComboBox multi-colonnes - Récupérer la sélection
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/09/2007, 13h42
  2. [VB.NET]ComboBox Multi-Colonnes
    Par Golzinne dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/03/2006, 18h55
  3. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  4. Affichage ComboBox multi-colonnes
    Par dough29 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/12/2005, 12h28

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