Multiple Combo dans userform_initialize
Bonjour,
Je ne sais pas si le titre du sujet est bien choisi, je modifierais si besoin.
J'ai un USF et j'aimerais que celui ci interagisse avec plusieurs tableaux. (Dans le fichier exemple il y en a 2)
Il y a 2 combobox, une qui est "générale" (tout en haut de l'usf) et une autre "intermédiaire" (appelée "nom")
Donc je souhaiterais que la combobox "Générale" => renseigne la combobox "intermédiaire" => qui renseigne l'information à droite de l'userform.
Avec un fichier ce sera beaucoup plus clair :
En l'état j'ai bien la combo générale qui renseigne la combo intermédiaire, mais je n'arrive pas à faire en sorte que la combo intermédiaire propose la liste du tableau "suivi2"
J'ai tenté quelque chose sur userform_initialize mais en fait je suis totalement largué dans la technique.
Private Sub UserForm_Initialize()
Dim tb As ListObject
Dim tb2 As ListObject
Set tb = Sheets("suivi").ListObjects("suivi")
Set tb2 = Sheets("suivi").ListObjects("suivi2")
With Me.Ref
If tb.ListRows.Count = 1 Then
.AddItem tb.DataBodyRange(1, 2).Value
Else: .List = tb.ListColumns(2).DataBodyRange.Value
End If
End With
' With Me.Ref2
' If tb2.ListRows.Count = 1 Then
' .AddItem tb2.DataBodyRange(1, 6).Value
' Else: .List = tb2.ListColumns(6).DataBodyRange.Value
' End If
'End With
End SubMerci par avance, de votre aide (si c'est possible)
Bien cordialement
Bonjour,
Je ne comprends pas ce que tu veux faire avec le CB intermédiaire alors que le nom est déjà renseigné dans le premier CB ?
Daniel
Bonjour,
Je comprend, ça ne semble pas très utile présenté comme ça :)
Ce ne sont que des exemples, rien à voir avec mon projet, mais voici l'idée :
Imaginons que l'on mette "Bertrand" dans la CB générale, le commentaire "Bertrand est content" apparait, ainsi que la date, et le nom (qui est aussi ma CB intermédiaire...)
Je souhaite simplement garder en mémoire le commentaire et la date. (dans l'optique de "dupliquer" en ajoutant une nouvelle entrée...conserver les paramètres (commentaire + date) vers un autre Nom)
C'est une version très simplifiée que j'ai créé pour l'exemple ici sur ce forum, mon fichier de base est plus complet.
Par rapport au résultat actuel, que veux-tu de plus ?
Je souhaite que la CB intermédiaire propose les choix "Nom" du tableau "suivi2", exactement comme le fait la CB générale avec le tableau "suivi1".
Bonjour,
Excusez-moi je suis trop nul
En fait, ma solution initiale fonctionnait
Private Sub UserForm_Initialize()
Dim tb As ListObject
Dim tb2 As ListObject
Set tb = Sheets("suivi").ListObjects("suivi")
Set tb2 = Sheets("suivi").ListObjects("suivi2")
With Me.Ref
If tb.ListRows.Count = 1 Then
.AddItem tb.DataBodyRange(1, 2).Value
Else: .List = tb.ListColumns(2).DataBodyRange.Value
End If
End With
With Me.Ref2
If tb2.ListRows.Count = 1 Then
.AddItem tb2.DataBodyRange(1, 6).Value
Else: .List = tb2.ListColumns(6).DataBodyRange.Value
End If
End With
End SubMais... j'indiquais dans mon code que je souhaite la 6ème colonne du tableau "suivi2", or elle n'en comporte que 2 ! Donc j'ai simplement modifier
With Me.Ref2
If tb2.ListRows.Count = 1 Then
.AddItem tb2.DataBodyRange(1, 6).Value
Else: .List = tb2.ListColumns(6).DataBodyRange.Value
End Ifen
With Me.Ref2
If tb2.ListRows.Count = 1 Then
.AddItem tb2.DataBodyRange(1, 1).Value
Else: .List = tb2.ListColumns(1).DataBodyRange.Value
End IfVoilà comment perdre 2 heures pour une bricole, je m'en veux
Mais bon, sujet résolu!
Bonjour,
Mais... j'indiquais dans mon code que je souhaite la 6ème colonne du tableau "suivi2", or elle n'en comporte que 2 ! Donc j'ai simplement modifier
Normal, vous n'avez que deux colonnes. Donc le 6 doit être remplacé par 2
With Me.Ref2
If tb2.ListRows.Count = 1 Then
.AddItem tb2.DataBodyRange(1, 2).Value
Else: .List = tb2.ListColumns(2).DataBodyRange.Value
End IfMaintenant au delà de cette correction, votre approche n'est pas bonne car comment allez vous faire si vous avez des doublons ?
exemple : vous avez deux Bertrand ?
Aussi cela suppose que vos deux tableaux sont triés identiquement.
Peut-être penser à faire l'inverse. Combo ref avec le nom et prénom et dans le prénom dans la combo ref2 que vous recherchez via le choix de la combo ref
Cordialement
Bonjour Dan,
Oui j'ai eu été confronté à cette problématique, j'ai fait en sorte que les références soient uniques en faisant des Combo [NOM & Prénom & date & ... etc....]
Un aperçu du résultat ici : https://forum.excel-pratique.com/excel/probleme-usf-excel-2016-plante-177775 (je n'ai pas encore terminé, j'ai un vilain bug
Cordialement,
Oui j'ai eu été confronté à cette problématique, j'ai fait en sorte que les références soient uniques en faisant des Combo [NOM & Prénom & date & ... etc....]
Ben pas besoin de cela. Si je comprends ce que vous écrivez c'est compliqué cela
Mettez votre colonne G en combo ref
Pour la combo ref2, vous mettez les données de la colonne F
Puis sur base du choix de la combo ref 2 vous mettez les données du tableau 1
Pour votre lien, cela ne concerne pas le problème de ce fil. Il s'agit de TCD
Comme ceci donc :
Private Sub UserForm_Initialize()
Dim tb As ListObject
Dim tb2 As ListObject
Set tb = Sheets("suivi").ListObjects("suivi")
Set tb2 = Sheets("suivi").ListObjects("suivi2")
With Me.Ref
If tb2.ListRows.Count = 1 Then
.AddItem tb2.DataBodyRange(1, 2).Value
Else: .List = tb2.ListColumns(2).DataBodyRange.Value
End If
End With
With Me.Ref2
If tb2.ListRows.Count = 1 Then
.AddItem tb.DataBodyRange(1, 2).Value
Else: .List = tb.ListColumns(2).DataBodyRange.Value
End If
End With
End Sub
Private Sub Ref_Change()
If Not IsError(Application.Match(Ref, Sheets("suivi").Range("g:g"), 0)) Then
ligne = Application.Match(Ref, Sheets("suivi").Range("g:g"), 0)
op_date.Value = Sheets("suivi").Range("A" & ligne).Value
Ref2.Value = Sheets("suivi").Range("B" & ligne).Value
op_com.Value = Sheets("suivi").Range("C" & ligne).Value
End If
End Sub
Private Sub Ref2_Change()
If Not IsError(Application.Match(Ref2, Sheets("suivi").Range("F:F"), 0)) Then
ligne = Application.Match(Ref2, Sheets("suivi").Range("F:F"), 0)
client_nom.Value = Sheets("suivi").Range("G" & ligne).Value
End If
End SubEn tout cas ça marche plutôt bien (pour l'instant
Merci!
Cordialement
Edit :
Pour votre lien, cela ne concerne pas le problème de ce fil. Il s'agit de TCD
Oui, c'était pour vous montrer l'état actuel du fichier, c'est hors sujet :)
En tout cas ça marche plutôt bien (pour l'instant )
Cela marche parce que vous avez votre colonne F triée comme la colonne B.... et si vous n'avez pas deux noms identiques en colonne B....
Sinon le code Ref_change comme ceci plutôt (vous êtes en tableaux structurés)
Private Sub Ref_Change()
Dim ligne As Integer
Dim tb As ListObject, tb2 as listobject
Set tb = Sheets("suivi").ListObjects("suivi")
Set tb2 = Sheets("suivi").ListObjects("suivi2")
If Not IsError(Application.Match(Ref, tb2.ListColumns(2).DataBodyRange, 0)) Then
ligne = Application.Match(Ref, tb2.ListColumns(2).DataBodyRange, 0)
op_date.Value = tb.DataBodyRange(ligne, 1).Value
Ref2.Value = tb.DataBodyRange(ligne, 2).Value
op_com.Value = tb.DataBodyRange(ligne, 3).Value
End If
End SubC'est étrange, j'ai testé ce que vous venez de me dire mais les doublons ou l'ordre de tri n'a pas d'impact sur l'exécution du code
Pour ce qui est de l'amélioration Ref_Change, je l'ai déjà appliquée grace à votre aide sur un autre sujet (ce fil actuellement est plus ancien)
Merci
C'est étrange, j'ai testé ce que vous venez de me dire mais les doublons ou l'ordre de tri n'a pas d'impact sur l'exécution du code
L'ordre de tri : allez dans votre usf et choisissez par exemple Philippe Bélar dans le combo ref. Cela vous renvoie "Bertrand" dans la combo ref2
Les doublons : exact à partir du moment où vous chargez votre combo ref2 depuis la colonne B (mais là vous avez deux fois Bertrand. La logique voudrait que la combo ref2 soit équivalente à la colonne F non ?
Faites quelques tests en changeant les valeurs dans les deux combo