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 :

définir des en-têtes pour une listbox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 32
    Par défaut définir des en-têtes pour une listbox
    Bonjour,

    En parcourant le site j'ai trouvé un excellent tuto pour faire des en-têtes à une listbox -->Un grand Merci à SilkyRoad.
    Mon souci est que je n'ai pas su adapter le code pour définir non seulement la plage (A1;F3000)mais aussi la feuille pour la base de données .
    Help!

    Merci à vous.

    Voici le code:

    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
    Private Sub UserForm_Initialize()
        Dim Plage As Range
        Dim Tableau As Variant
        Dim i As Integer
        Dim Lbl As Control
     
        'Plage de cellules contenant les données:
        'Le contenu de la première ligne (A1:C1) va servir d'en-tête.
        Set Plage = Range("A1:f3000")
        Tableau = ScindePlage(Plage)
     
        With ListBox1
            .ColumnCount = UBound(Tableau, 2)
            'En option (à adapter)
            .Top = 20
            .Width = 92 * UBound(Tableau, 2)
            DoEvents
            .List() = Tableau
        End With
     
     
        For i = 1 To UBound(Tableau, 2)
            Set Lbl = Me.Controls.Add("Forms.Label.1")
            With Lbl
                .Left = ListBox1.Left + 7 + ((i - 1) * 92)
                .Top = ListBox1.Top - 10
                .Width = 92
                .Height = 10
                .Caption = Plage.Cells(1, i)
            End With
        Next i
     
    End Sub
     
    Function ScindePlage(Cible As Range) As Variant
        Dim Pl As Range
     
        Set Pl = Cible.Offset(1, 0).Resize(Cible.Rows.Count - 1)
        ScindePlage = Pl.Value
    End Function

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour que les étiquettes de colonnes apparaissent dans un contrôle ListBox ou ComboBox, il faut utiliser la propriété RowSource du contrôle, donner à la propriété ColumnHeads du même contrôle la valeur True et éventuellement modifier la propriété ColumnCount en lui donnant comme valeur le nombre de colonnes à afficher.
    Si la première cellule de la liste de données commence en A1 et que la première ligne de cette liste contient bien les étiquettes de colonnes, le plus simple est d'utiliser la méthode CurrentRegion et ensuite pour déterminer la partie données de cette liste utiliser les propriétés Offset et Resize
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
    Dim rngData As Range
    Private Sub UserForm_Initialize()
     Set rngData = ThisWorkbook.Worksheets("bd").Range("A1").CurrentRegion
     With rngData
      ComboBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(external:=True) ' Les données
      ComboBox1.ColumnHeads = True
      ComboBox1.ColumnCount = .Columns.Count
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 32
    Par défaut
    Bonjour Philippe,

    Merci pour ta réponse...j'ai fais un mixe des deux codes afin d'obtenir ce que je voulais car le code de silkyroad marchait aussi c'est juste que je n'arrivais pas à préciser la feuille pour la BD ...
    Du coup grâce à ton code j'ai pu y parvenir ce qui marche nickel!!
    Voici le code:
    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
    Private Sub UserForm_Initialize()
        Dim Plage As Range
        Dim Tableau As Variant
        Dim i As Integer
        Dim Lbl As Control
     
        'Plage de cellules contenant les données:
        'Le contenu de la première ligne (A1:C1) va servir d'en-tête.
        Set Plage = ThisWorkbook.Worksheets("Planning-clients").Range("A1:f3000")
        Tableau = ScindePlage(Plage)
     
        With ListBox1
            .ColumnCount = UBound(Tableau, 2)
            'En option (à adapter)
            .Top = 20
            .Width = 92 * UBound(Tableau, 2)
            DoEvents
            .List() = Tableau
        End With
     
     
        For i = 1 To UBound(Tableau, 2)
            Set Lbl = Me.Controls.Add("Forms.Label.1")
            With Lbl
                .Left = ListBox1.Left + 7 + ((i - 1) * 92)
                .Top = ListBox1.Top - 10
                .Width = 92
                .Height = 10
                .Caption = Plage.Cells(1, i)
            End With
        Next i
     
    End Sub
     
    Function ScindePlage(Cible As Range) As Variant
        Dim Pl As Range
     
        Set Pl = Cible.Offset(1, 0).Resize(Cible.Rows.Count - 1)
        ScindePlage = Pl.Value
    End Function

    Encore un Énorme Merci!

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Par défaut Wahou après un bon moment de galère voilà que ce bout de code vient de me soulager
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Pour que les étiquettes de colonnes apparaissent dans un contrôle ListBox ou ComboBox, il faut utiliser la propriété RowSource du contrôle, donner à la propriété ColumnHeads du même contrôle la valeur True et éventuellement modifier la propriété ColumnCount en lui donnant comme valeur le nombre de colonnes à afficher.
    Si la première cellule de la liste de données commence en A1 et que la première ligne de cette liste contient bien les étiquettes de colonnes, le plus simple est d'utiliser la méthode CurrentRegion et ensuite pour déterminer la partie données de cette liste utiliser les propriétés Offset et Resize
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
    Dim rngData As Range
    Private Sub UserForm_Initialize()
     Set rngData = ThisWorkbook.Worksheets("bd").Range("A1").CurrentRegion
     With rngData
      ComboBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(external:=True) ' Les données
      ComboBox1.ColumnHeads = True
      ComboBox1.ColumnCount = .Columns.Count
     End With
    End Sub

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Exemple d'entete de ListBox avec des Labels crées automatiquement en utilisant .List ou .Column.


    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
    Dim Rng, NbCol
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Set Rng = f.Range("A2:D" & f.[A65000].End(xlUp).Row)
      NbCol = Rng.Columns.Count
      Me.ListBox1.ColumnCount = NbCol
      tblBD = Rng.Value
       Me.ListBox1.List = tblBD
      EnteteListBox
    End Sub
     
    Sub EnteteListBox()
      x = Me.ListBox1.Left + 8
      Y = Me.ListBox1.Top - 12
      For i = 1 To NbCol
        Set lab = Me.Controls.Add("Forms.Label.1")
        lab.Caption = Rng.Offset(-1).Cells(1, i)
        lab.Top = Y
        lab.Left = x
        x = x + Rng.Columns(i).Width * 1.1
        temp = temp & Rng.Columns(i).Width * 1.1 & ";"
      Next
      temp = Left(temp, Len(temp) - 1)
      Me.ListBox1.ColumnWidths = temp
    End Sub
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [XL-2003] Problème pour aligner des entrées multicolonnes dans une ListBox ?
    Par -Naek- dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/05/2009, 13h59
  2. couleur des polices lignes par lignes pour une Listbox
    Par gwenc_hlan dans le forum Tkinter
    Réponses: 4
    Dernier message: 27/03/2008, 10h26
  3. Réponses: 2
    Dernier message: 24/03/2006, 09h55
  4. Réponses: 1
    Dernier message: 16/08/2005, 04h52
  5. Soucis pour une Listbox
    Par ]3l@c]{bUll dans le forum Composants VCL
    Réponses: 23
    Dernier message: 13/07/2005, 14h42

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