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é
Re
ce que j'ai modifié !(et qui pourrait être amélioré)
VB:
'On la remplie à nouveau avec le TS "t_Noms" de la feuille "Liste_agents"
    With Me.Cbx_Salarié
               .ColumnCount = 5
               .ColumnWidths = "1;0;0;0;0"
        For I = 1 To Tbl.ListRows.Count
            .AddItem Tbl.ListColumns(1).DataBodyRange(I, 2).Value & " " & _                      Tbl.ListColumns(1).DataBodyRange(I, 2).Value
            .List(.ListCount - 1, 1) = Tbl.ListColumns(1).DataBodyRange(I, 1).Value
            .List(.ListCount - 1, 2) = Tbl.ListColumns(2).DataBodyRange(I, 2).Value
            .List(.ListCount - 1, 3) = Tbl.ListColumns(3).DataBodyRange(I, 3).Value
            .List(.ListCount - 1, 4) = Tbl.ListColumns(4).DataBodyRange(I, 4).Value
        Next I
    End With
jean marie
J'ai mis le code comme suit, mais j'ai un message d'erreur "objet requis" au niveau du formulaire dès le lancement à partir du formulaire GestMenus
VB:
With Me.Cbx_Salarié
               .ColumnCount = 3
               .ColumnWidths = "80;100;100"
        For I = 1 To Tbl.ListRows.Count
            .AddItem Tbl.ListColumns(1).DataBodyRange(I, 2).Value & " " & Tbl.ListColumns(1).DataBodyRange(I, 2).Value
            .List(.ListCount - 1, 1) = Tbl.ListColumns(1).DataBodyRange(I, 1).Value
            .List(.ListCount - 1, 2) = Tbl.ListColumns(2).DataBodyRange(I, 2).Value
            .List(.ListCount - 1, 3) = Tbl.ListColumns(3).DataBodyRange(I, 3).Value
        Next I
    End With
 

TooFatBoy

XLDnaute Barbatruc
J'ai mis le code comme suit
Tu n'as pas besoin de définir de nouveau le nombre de colonnes puisque tu l'as déjà fait dans VBE.
Pareil pour la largeur de chacune des trois colonnes : tu l'as déjà fait dans VBE.

Et tu peux remplacer la boucle For...Next par une simple ligne :
VB:
Me.Cbx_Salarié.rowsource = "'Liste_agents'!" & Range("t_Noms[[Code agent]:[Prénom]]").address

Enfin... je crois... 🤔

[edit]
Rien que pour faire plaisir à mon camarade Phil, ce serait même cette ligne que je mettrais 😎 :
VB:
Me.Cbx_Salarié.RowSource = "'" & Range("t_Noms").Parent.Name & "'!" & Range("t_Noms[[Code agent]:[Prénom]]").Address
[/edit]



Sur ce, bonne soirée à tous
🖖
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
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
 

vgendron

XLDnaute Barbatruc
C'est ce que j'ai fait, mais j'ai ce message d'erreur.
Voici mon fichier, j'ai supprimé la fonction Cod qui causait problème
Je crois qu'il va falloir arreter d'aller dans tous les sens.. ca devient un grand n'importe quoi

dans ton fichier posté en 51, tu as un message d'erreur et le code s'arrete sur la ligne:
Code:
Userform.show 0
et le message te dit "objet requis"

la particularité lorsque le chargement d'un USF n'a pas fonctionné, la ligne jaune surlignée est la première..
il faut donc executer le code pas à pas (touche F8) pour aller voir QUELLE est la ligne exacte qui pose problème
dans ton cas, c'est celle ci

VB:
Set Tbl = Ws.ListObjects("t_Noms")

et quand on regarde bien.. WS n'est pas défini...
rien à voir (à ce niveau) avec la fonction cod...
 

vgendron

XLDnaute Barbatruc
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..
 

vgendron

XLDnaute Barbatruc
et enfin, pour le chargement du combo dans l'intialize
ici, je t'ai mis les 3 méthodes différentes "rowsource, list, additem"
EVIDEMMENT: il faut en choisir UNE et commenter/supprimer les deux autres...

VB:
Private Sub UserForm_Initialize()
Dim Tbl As ListObject
Dim I As Integer
 
    'On enlève la croix de fermeture du formulaire
    SansCroix Me
   
    Set Ws = Sheets("Liste_agents")
    'On définit le tableau
    Set Tbl = Ws.ListObjects("t_Noms")

    '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 Me.Cbx_Salarié
        .ColumnCount = 3
        .ColumnWidths = "80;100;100"
        .RowSource = Tbl.DataBodyRange.Address '1ere méthode avec l'adresse d'une range==> Incompatible avec une rowsource définie en "dur" dans les propriétés du control
        .List = Tbl.DataBodyRange.Value '2eme méthode avec le contenu de la Table==> dans le meme ordre que les colonnes de la table
        For I = 1 To Tbl.ListRows.Count '3eme méthode avec additem==> plus "souple" car on met les données dans l'ordre qu'on veut
            .AddItem Tbl.DataBodyRange(I, 2).Value & " " & Tbl.DataBodyRange(I, 3).Value
            .List(.ListCount - 1, 1) = Tbl.ListColumns(1).DataBodyRange(I).Value
            .List(.ListCount - 1, 2) = Tbl.ListColumns(2).DataBodyRange(I).Value
            .List(.ListCount - 1, 3) = Tbl.ListColumns(3).DataBodyRange(I).Value
        Next I
    End With
    'Initialisation de la date du début de la semaine en partant du lundi
    If Weekday(Now, 2) <> 1 Then
        Me.Tbx_DebSem = Format(Now - Weekday(Now + 2) + 1, "dd/mm/yyyy")
    Else
        Me.Tbx_DebSem = Format(Now, "dd/mm/yyyy")
    End If
   
    Me.Tbx_NumSem = WorksheetFunction.IsoWeekNum(Now)
    Me.Tbx_FinSem = CDate(Me.Tbx_DebSem) + 6
   
    'On écrit "Retour Menus" sur 2 lignes pour le bouton But_Choix
    Me.But_Choix.Caption = "Retour" & vbCrLf & "Menus"
   
    'Préparation des éléments pour le resize
    For Each pag In MultiPage1.Pages: ic = ic & CStr(pag.Caption): Next: minlarge = Len(ic) * 7
    For Each pag In MultiPage1.Pages
        ReDim Preserve Mpage(0 To pag.Index)
        WW = 0: HH = 0
               
        For Each Ctrl In pag.Controls
            If Ctrl.Left + Ctrl.Width + 20 > WW Then WW = Ctrl.Left + Ctrl.Width + 20: If WW < minlarge Then WW = minlarge
            If Ctrl.top + Ctrl.Height + 50 > HH Then HH = Ctrl.top + Ctrl.Height + 50
        Next Ctrl
   
        Mpage(pag.Index).Width = WW: Mpage(pag.Index).Height = HH
        Mpage(pag.Index).hCaption = Me.Height - Me.InsideHeight
        Mpage(pag.Index).Weight_Cadre = Me.Width - Me.InsideWidth
    Next pag
   
    EnableEvents = True
   
    With Me.MultiPage1.Pages(0)
        Me.Cbx_Salarié.Visible = False
        Me.Label1.Visible = False
    End With
   
resizeMulti
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 083
Messages
2 116 046
Membres
112 642
dernier inscrit
mounamana