Microsoft 365 Remplir une ComboBox à 3 colonnes avec les données d'un TS

NONO14

XLDnaute Impliqué
Bonjour à toutes et à tous,
Voilà, j'ai une Combo ("Cbx_Salarié") dans un formulaire (UfGestTemps) et je souhaiterai l'alimenter avec les 3 premières colonnes d'un TS ("t_Noms") qui se trouve dans la feuille "Liste_agents". J'ai réussi à mettre la 1ère colonne, mais je n'arrive pas à insérer les 2 autres. La colonne 1 est le code de l'agent, la colonne 2 le NOM et la colonne 3 le Prénom.
Pouvez-vous m'aider s'il vous plaît ?
Voici le début du code et mon fichier
VB:
Private Sub UserForm_Initialize()
Application.ScreenUpdating = False

'Chargement des différents contrôles du formulaire
'On vide la ComboBox Cbx_Salarié
    Me.Cbx_Salarié.Clear

'On la remplie à nouveau avec le TS "t_Noms" de la feuille "Liste_agents"
    With Sheets("Liste_agents").ListObjects("t_Noms")
        For I = 1 To .ListRows.Count
            Me.Cbx_Salarié.AddItem .DataBodyRange(I, 1)
        Next I
    End With
 

Pièces jointes

  • GestPersonnnel (3).xlsm
    492.3 KB · Affichages: 9
Solution
Hello
@ChTi160 : 7 colonnes?? pourquoi faire??

tout ca me parait bien compliqué pour pas grand chose
un combo avec UNE colonne (utilisation originelle d'un combo==> sinon, on utilise un listbox)

VB:
'On vide la ComboBox Cbx_Salarié
    Me.Cbx_Salarié.Clear
    'On la remplie à nouveau avec le TS "t_Noms" de la feuille "Liste_agents"
    With Me.Cbx_Salarié
        .ColumnCount = 1
        For I = 1 To Tbl.ListRows.Count
            .AddItem Tbl.DataBodyRange(I, 2).Value & " " & Tbl.DataBodyRange(I, 3).Value & " " & Tbl.DataBodyRange(I, 1).Value 'on concatène les colonnes 
        Next I
    End With

NONO14

XLDnaute Impliqué
Bonsoir le fil

Une autre proposition possible
(j'ai survolé les 4 pages, et je ne crois pas avoir vu ce type de syntaxe)
Ici pour des colonnes contigües
VB:
Private Sub UserForm_Initialize()
Dim a
a = ActiveSheet.ListObjects(1).DataBodyRange.Value
a = Application.Index(a, Evaluate("row(1:" & UBound(a) & ")"), Array(1, 2, 3))
ComboBox1.List = a
End Sub
Et pour des discontinues
VB:
Private Sub UserForm_Initialize()
Dim a
a = ActiveSheet.ListObjects(1).DataBodyRange.Value
a = Application.Index(a, Evaluate("row(1:" & UBound(a) & ")"), Array(1, 3, 5))
ComboBox1.List = a
End Sub
Testé avec un TS contenant 5 colonnes
Je vais tester demain
Merci et bonne soirée
 

NONO14

XLDnaute Impliqué
quant à la fonction Cod qui utilise des fonctions 365.. vu que TU es en 365... pourquoi veux tu la supprimer puisqu'elle fonctionne sur ta version??

mettre une donnée en plein milieu d'une feuille, c'est complètement....
1) parce que TU es le premier à oublier que cette donnée existe.. et donc.. va la retrouver
2) pour le plaisir.. imprime ta feuille Accueil... on va rire...toi moins quand tu vas voir que la ramette y passe pour imprimer des feuilles vides et UNE feuille avec une donnée.. comme ca;. en plein milieu...

si tu as besoin de créer une donnée sur une feuille inaccessible à l'utilisateur.. mets la sur une feuille en xlveryhidden..
du peux que j'ai regardé.. la fonction cod créé un code qui est chargé dans le formulaire?? quel intérêt de la mettre sur une feuille?
en fait.. je ne comprend pas à quoi ca set de créer un code (mot de passe ?) que l'utilisateur ne peut pas connaitre??==> bon.. je te dis.. j'ai pas regardé cette fonction, comment elle fonctionne ni à quoi elle sert..
Je ne suis pas certain que ceux qui utiliser l'application soient tous en 365.
Ce code me permet de créer un code agent qu'ils devront utiliser pour pointer. C'est n'est pas un mot de passe.
Pour le reste je ne peux que te donner raison. Je vais revoir tout demain.
Encore merci et bonne soirée
 

vgendron

XLDnaute Barbatruc
Re

@vgendron (Bonjour)

Tu n'as point mis ma méthode ;)
Voir mon précédent message dans ce fil
Exact.. je ne l'avais pas vue..
pour la première ligne..
a = ActiveSheet.ListObjects(1).DataBodyRange.Value
ca ressemble à la solution list

mais cette deuxième instruction.. je ne la comprend pas... elle fait quoi?

a = Application.Index(a, Evaluate("row(1:" & UBound(a) & ")"), Array(1, 2, 3))
 

vgendron

XLDnaute Barbatruc
Re

@vgendron
Elle "choisit" les colonnes 1,2 et 3 de mon TS qui en avait 5
;)
L'avantage c'est qu'on peut choisir des colonnes contiguës et/ou discontigues et le tout sans boucle ;)

PS: c'était histoire de varier les plaisirs syntaxiques ;)
ok.. il va falloir que je creuse ca.. parce que c'est un truc dont j'ai besoin de temps en temps .. extraire des colonnes d'un tableau..
mais ce qui me perturbe c'est que je ne vois pas comment tu extrais des colonnes en mettant l'évaluate dans le paramètre "ligne" de la fonction index..
 

ChTi160

XLDnaute Barbatruc
Bonsoir
si l'on met(j'ai corriger plusieurs erreurs dans ces Lignes)
Il manque une colonne !
VB:
With Me.Cbx_Salarié
               .ColumnCount = 3             'Ici 3 colonnes'
               .ColumnWidths = "80;100;100" 'Ici 3 colonnes
        For I = 1 To Tbl.ListRows.Count
            .AddItem Tbl.ListRows(I).Range(2).Value & " " & Tbl.ListRows(I).Range(3).Value   '1 eme Colonne
            .List(.ListCount - 1, 1) = Tbl.ListRows(I).Range(1).Value '2 eme Colonne
            .List(.ListCount - 1, 2) = Tbl.ListRows(I).Range(2).Value '3 eme Colonne
            .List(.ListCount - 1, 3) = Tbl.ListRows(I).Range(3).Value '4 eme Colonne
        Next I
    End With
Pourquoi dans le Combobox Salarié afficher trois colonnes ?
moi j'utilise un tableau temporaire
Code:
' Vérifier si "t_Noms" existe
                If Range("t_Noms").ListObject Is Nothing Then
                     .Frm_Selection_Identite.Caption "La table 't_Noms' n'existe pas sur cette feuille.", vbExclamation
                    Exit Sub
                End If
               With Range("t_Noms").ListObject
                ' Vérifier si la table contient des données
                If Not .DataBodyRange Is Nothing Then
                           ' Trier la table par la colonne "NOM"
                    On Error Resume Next ' Éviter les erreurs si la colonne "NOM" n'existe pas
                         .Sort.SortFields.Clear
                         .Sort.SortFields.Add Key:=.ListColumns("NOM").Range, _
                                           SortOn:=xlSortOnValues, _
                                           Order:=xlAscending, _
                                           DataOption:=xlSortNormal
                    With .Sort
                           .Header = xlYes
                           .MatchCase = False
                           .Orientation = xlTopToBottom
                           .SortMethod = xlPinYin
                           .Apply
                    End With
                  End If
                  TabTemp = .DataBodyRange.Value
                  End With
            'Chargement des différents contrôles du formulaire
            'On vide la ComboBox Cbx_Salarié
Ok_Change = False
            With .Cbx_Salarié
                    .ColumnCount = 7
                    .ColumnWidths = "225;0;0;0;0;0;0" 'Une Visible               
               For Lgn = 1 To UBound(TabTemp, 1)
                    .AddItem TabTemp(Lgn, 2) & " " & TabTemp(Lgn, 3) & " " & TabTemp(Lgn, 4)
                    .List(.ListCount - 1, 1) = TabTemp(Lgn, 1) 'Code agent
                    .List(.ListCount - 1, 2) = TabTemp(Lgn, 2) 'Civilite
                    .List(.ListCount - 1, 3) = TabTemp(Lgn, 3) 'Nom
                    .List(.ListCount - 1, 4) = TabTemp(Lgn, 4) 'Prénom
                    .List(.ListCount - 1, 5) = TabTemp(Lgn, 5) 'Contrat
                    .List(.ListCount - 1, 6) = Lgn                     'Ligne Source
               Next Lgn
            End With

Jean marie
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Hello
@ChTi160 : 7 colonnes?? pourquoi faire??

tout ca me parait bien compliqué pour pas grand chose
un combo avec UNE colonne (utilisation originelle d'un combo==> sinon, on utilise un listbox)

VB:
'On vide la ComboBox Cbx_Salarié
    Me.Cbx_Salarié.Clear
    'On la remplie à nouveau avec le TS "t_Noms" de la feuille "Liste_agents"
    With Me.Cbx_Salarié
        .ColumnCount = 1
        For I = 1 To Tbl.ListRows.Count
            .AddItem Tbl.DataBodyRange(I, 2).Value & " " & Tbl.DataBodyRange(I, 3).Value & " " & Tbl.DataBodyRange(I, 1).Value 'on concatène les colonnes 
        Next I
    End With
 

NONO14

XLDnaute Impliqué
Bonjour à toutes et à tous,
Juste en passant car n'étant pas en très bonne forme aujourd'hui.
Je viens de survoler vos nombreux commentaires, mais pour le moment je ne peux y répondre.
A la base, je ne souhaitais que 3 colonnes, il n'a jamais été question de 7 colonnes.
Je reviendrai vers vous dès que possible.
Toutes mes excuses et encore merci pour votre aide
 

Discussions similaires

Statistiques des forums

Discussions
315 166
Messages
2 116 918
Membres
112 911
dernier inscrit
zkazumba