[Aide_débutant] Filtrage avec 2 combobox
bonjour a tous,
j'apprend a codé sous excel ( depuis hier ), j'ai un niveau très très débutant.
pour me motivé et pas abandonné, j'essaye de faire un programme de GMAO asser simple.
pour le programme, je pioche des bout de code par-ci par-la sur internet et essaie de les adapter a mon programme. cela me permet surtout de voir les fonction et comment sa marche.
j'essaie aussi d'aller au plus simple dans le code, cepandant je bloque sur une fonction.
j'aimerais avoir 2 combobox, dont une qui affiche selon le choix de combobox 1.
j'ai trouver un code, mais n'arrive pas a l'inclure dans ma page de code.
je vous transmet le fichier qui marche ( recup internet ) ainsi que le mien.
je vous remercie vraiment.
[EDIT1] le code je l'ai déjà inclue dans ma page "ajout_panne" tous en bas, si j'ai bien compris il crée un dictionnaire pour filtrer les valeurs
malgrer que cela soit surement super basic pour vous, merci de me dire aussi si j'ai bien fais les chose =) notamment pour les autres feuilles
Bonjour Oneil, bonjour le forum,
L'utilisation d'un dictionnaire permet d'afficher une liste sans doublon. Donc pas utile pour alimenter la ComboBox ligne
C'est Ok pour la seconde ComboBox machine. Mais tu n'as pas besoin de filtrage. Pour cela il te faudrait avoir plusieurs machines par ligne dans ton tableau. Tu pourrais alors filtrer, par exemple, les machines de la ligne 3. Mes telles que sont pésentées les données le filtrage n'est pas viable.
Pas compris non plus ce que tu a voulue dire avec :
Me.machine.List = Split(dico(Me.Famille.Value), "|")
Il faut que tu revoie le tuto de Jacques sur les Dictionary...
salut, merci de ta réponse rapide.
pour le code, j'ai utiliser un code dispo sur le net. celui en piece jointe daillieurs .
moi ce que j'aimerais faire, c'est que lorsque je selectionne 'ligne 1 ' dans la combobox, j'ai toutes les machines qui apparaissent dans la combo machine.
je vais regarder le tuto dont tu me parle.
peut être que le code que j'ai pris sur le net n'est pas le plus adapter a ma situation.
Re,
Mais, quelque soit la ligne sélectionnée, tu voudras quand même la liste de toutes les machines ! Non ?
Donc pas besoin de filtre. Utilise à l'initialisation de l'UserForm, le même code pour alimenter ligne en l'adaptant pour machine.
J'ai éditer mes cellule avec les machines pour être plus claire, car je me comprend dans mes feuilles, mais comme sa, c'est plus claire pour vous
non, je veux pas toutes les machines,
si je selectionne dans la combobox "ligne 1" , je veux toutes les machines de la ligne 1 dans la combobox machine
"ligne 2" toutes celle de la ligne 2
la perceverance paye.
voici un code qui marche a peu pres =)
Set f = Sheets("Donnee_techniques")
Set mondico = CreateObject("Scripting.Dictionary")
For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
mondico(c.Value) = ""
Next c
Me.ligne.AddItem "ligne"
For Each i In mondico.keys
Me.ligne.AddItem i
Next
Me.ligne.ListIndex = 0
End Sub
Private Sub ligne_Change()
Set f = Sheets("Donnee_techniques")
Me.machine.Clear
For Each c In f.Range("A2:A" & f.[A65000].End(xlUp).Row)
If c = Me.ligne Or Me.ligne = "ligne" Then
Me.machine.AddItem c.Offset(0, 1)
End If
Next c
Me.machine.ListIndex = 0
Re,
En pièce jointe ton fichier modifié :
Le code :
Dim f As Worksheet
Dim D As Object
Dim TV As Variant
Private Sub UserForm_Initialize()
Dim I As Integer
Set f = Sheets("Donnee_techniques")
'liste_déroulante_Heure-d'arret
Me.heure_arret.List = f.Range("D2:D" & f.Range("D" & Application.Rows.Count).End(xlUp).Row).Value
'liste_déroulante_technicien
Me.tech1.List = f.Range("C2:C" & f.Range("C" & Application.Rows.Count).End(xlUp).Row).Value
Me.tech2.List = f.Range("C2:C" & f.Range("C" & Application.Rows.Count).End(xlUp).Row).Value
Me.tech3.List = f.Range("C2:C" & f.Range("C" & Application.Rows.Count).End(xlUp).Row).Value
TV = f.Range("A1").CurrentRegion
Set D = CreateObject("Scripting.Dictionary")
For I = 2 To UBound(TV, 1)
D(TV(I, 1)) = ""
Next I
Me.ligne.List = D.keys
End Sub
Private Sub ligne_click()
Dim I As Integer
machine.Clear
For I = 2 To UBound(TV, 1)
If TV(I, 1) = ligne.Value Then machine.AddItem TV(I, 2)
Next I
End Sub
Private Sub machine_click()
Dim I As Integer
For I = 2 To UBound(TV, 1)
If TV(I, 1) = ligne.Value And TV(I, 2) = machine.Value Then
'le code ici
End If
Next I
End Sub
Private Sub ajout_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
L = Sheets("pannes").Range("a65536").End(xlUp).Row + 1
Range("A" & L).Value = TextBox1
Range("B" & L).Value = TextBox2
Range("C" & L).Value = heure_arret
Range("D" & L).Value = ligne
Range("E" & L).Value = machine
Range("F" & L).Value = TextBox4
Range("G" & L).Value = TextBox5
Range("H" & L).Value = tech1
Range("I" & L).Value = tech2
Range("J" & L).Value = tech3
End If
End Sub
'formatdate dans la textbox
Private Sub TextBox1_Change()
Dim Valeur As Byte
TextBox1.MaxLength = 8 'nb caractères maxi autorisé dans le textbox
Valeur = Len(TextBox1)
If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/"
End Sub
'Ensuite pour vérifier que c'est bien une date qui a été saisie
Private Sub CommandButton1_Click()
If Not IsDate(TextBox1) Then
MsgBox "Format de date incorrect JJMMAA sans / ni ."
TextBox1 = ""
Exit Sub '?
End If
End Sub
Le fichier :
merci, je suis arrivé a la meme chose que toi, sauf que toi tu a l'avantage de laisser les champs vide, tant que rien n'est selectionnée, moi je n'y suis pas arrivé .
bien jouer
serais-tu pourquoi quand j'ajouter des pannes, ma feuille de panne, ne vas pas au delà de la ligne 5 ?
Re.
Je n'utilise pratiquement jamais les tableaux et le VBA car le code pour déterminer la dernière ligne est plus pénible. Essaie comme ça (à condition que la date soit systématiquement renseignée à l'ajout) :
Private Sub ajout_Click()
Dim L As Integer
Dim P As Worksheet
Set P = Sheets("Pannes")
If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
'avec des les tableaux déterminer la dernière ligne est plus pénible. Je préfère cette solution
L = IIf(P.Range("A2").Value = "", 2, P.Range("A1").End(xlDown).Row + 1)
'toujours renvoyer le format américian dans une cellule et définir le format voulu
'dans la cellule pour éviter les inversions jour/mois
P.Range("A" & L).Value = Format(TextBox1.Value, "yyyy/mm/dd")
P.Range("B" & L).Value = TextBox2.Value
P.Range("C" & L).Value = heure_arret.Value
P.Range("D" & L).Value = ligne.Value
P.Range("E" & L).Value = machine.Value
P.Range("F" & L).Value = TextBox4.Value
P.Range("G" & L).Value = TextBox5.Value
P.Range("H" & L).Value = tech1.Value
P.Range("I" & L).Value = tech2.Value
P.Range("J" & L).Value = tech3.Value
End If
End Sub
merci bien, je vais manger, je travail de nuit cette semaine.
sujet résolue.
A+ pour de nouvelle demande. ( je deviendrais pas un pro, mais je serais me débrouiller un peu )
merci a la communauter =)