combobox avec conditions

alex67800

XLDnaute Impliqué
Bonjour j'ai un usf avec plusieurs combo(s).
Actuellement mes combo(s) font références à une collone d'une feuiille donnée, avec le code suivant dans mon userform_initialize que j'ai trouvé sur le forum et adapté à mes besoins:

Private Sub UserForm_Initialize()
DateBox1.Value = Format(Now(), "dd/mmm/yyyy") 'met sous format français la date du jour dans le textbox date.

With UserForm1
.startUpPosition = 3
.Width = Application.Width
.Height = Application.Height
.Left = 0
.Top = 0
End With

ComboBox1.Clear 'conducteur
lgderlig = Worksheets("civil").Range("d" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox1.RowSource = "civil!d1:d" & lgderlig
End If
ComboBox2.Clear 'opérateur
lgderlig = Worksheets("civil").Range("d" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox2.RowSource = "civil!d1:d" & lgderlig
End If
ComboBox3.Clear 'ligne
lgderlig = Worksheets("item").Range("a" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox3.RowSource = "item!a1:a" & lgderlig
End If
ComboBox4.Clear 'arrêt
lgderlig = Worksheets("item").Range("c" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox4.RowSource = "item!c1:c" & lgderlig
End If
ComboBox5.Clear 'causes
lgderlig = Worksheets("item").Range("d" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox5.RowSource = "item!d1:d" & lgderlig
End If
ComboBox6.Clear 'nature
lgderlig = Worksheets("item").Range("e" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox6.RowSource = "item!e1:e" & lgderlig
End If
ComboBox7.Clear 'durée
lgderlig = Worksheets("item").Range("b" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox7.RowSource = "item!b1:b" & lgderlig
End If
ComboBox8.Clear 'Agent de Maintenance
lgderlig = Worksheets("item2").Range("c" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox8.RowSource = "item2!c1:c" & lgderlig
End If
ComboBox9.Clear 'Type de Panne
lgderlig = Worksheets("item2").Range("e" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox9.RowSource = "item2!e2:e" & lgderlig
End If
ComboBox12.Clear 'Durée panne
lgderlig = Worksheets("item").Range("b" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox12.RowSource = "item!b1:b" & lgderlig
End If
ComboBox10.Clear 'Cause
lgderlig = Worksheets("item2").Range("F" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox10.RowSource = "item2!f2:f" & lgderlig
End If


End Sub

Jusque la tout va bien. Etant de nature à vouloir toujours parfaire le travail et simplifier la tâche aux futurs utilisateurs je souhaiterai qu'en fonction du choix fait sur la combobox3 et 4, les combobox, 5, 6 aient des values défférentes.

J'ai bien vu plusieurs pistes sur des sujets analogue mais j'ai du mal à le transcrire.


Un code dans l'initialize du genre:
If combobox3.value= "ligne 1" And Combobox4.value= "Pannes" Then
ComboBox5.Clear 'causes
lgderlig = Worksheets("item3").Range("c" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox5.RowSource = "item3!c3:c62" & lgderlig
Else If
If combobox3.value= "ligne 2" And Combobox4.value= "Pannes" Then
ComboBox5.Clear 'causes
lgderlig = Worksheets("item3").Range("d" & Cells.Rows.Count).End(xlUp).Row
If lgderlig > 1 Then
ComboBox5.RowSource = "item3!d3:d62" & lgderlig
Else If ' et ainsi de suite pour toute les "Lignes" Il y en a 8

De même qu'il y a 4 choix différents faisant référence à des range précises pour combobox4.
Si je ne suis pas assez clair:
combobox3 détermine la colonne des données (il y en a 8 possible)
combobox4 déterminie la plage des lignes de cette colonne (il y en a 4 possible)

Et pour bien compliquer certaine cellules sont vides dans certaines colonnes. donc ne devrait pas apparaitre dans les combobox5 et 6.

Ni a-t-il pas un code plus simple que de reprendre toutes les possibilité une à une et faire un code interminable? Du genre "Or".

Je vous joint le tableau des données que je voudrais dans mes combo.

Merci d'avance pour vos conseils et pistes de travail.
 

Pièces jointes

  • copie arret ligne cdt.xls
    29.5 KB · Affichages: 178
  • copie arret ligne cdt.xls
    29.5 KB · Affichages: 178
  • copie arret ligne cdt.xls
    29.5 KB · Affichages: 176
Dernière édition:

kjin

XLDnaute Barbatruc
Re : combobox avec conditions

Bonsoir,
Comme le dit Said, si tu pouvais joindre le formulaire, ça nous éviterait de le faire.(zip ton fichier)
Si je ne suis pas assez clair:
combobox3 détermine la colonne des données (il y en a 8 possible)
combobox4 déterminie la plage des lignes de cette colonne (il y en a 4 possible)
Si j'essaie de déchiffrer, tu souhaiterais des combos qui fonctionnent en cascade (le choix dans une combo dépend du choix dans la précédente)
Dans ce cas pourquoi 8 combos ?
Si je vois bien les 8 colonnes (colonnes C à J je suppose??), je suppose que les 4 plages sont celles de la colonne A (??)
Qu'advient-il de la colonne B (??)
Donc joint ton formulaire avec une note d'explication un peu plus claire
A+
kjin
 

alex67800

XLDnaute Impliqué
Re : combobox avec conditions

Bonjour Said et kjin,
Je chargerai bien mon fichier mais il est trop lourd dans son état tel qu'il est avancé.
il est toutefois visible sur le foruom grâce à JCGL en suivant le lien suivant:
https://www.excel-downloads.com/threads/automatisation-tableau-croisse-dynamique.106963/

Donc je vais tenter d'être un peu plus précis (en utilisant mon fichier):
Dans la Frame4 (saisie des arrêts)
il y a 4 combobox (je sais 5 en réalité):
- ligne de conditionnement
- Type d'arrêt
- Causses
- Natures

La combo "ligne de conditionnement doit faire référence à ("item3").range("c1:j1")

la combo "type d'arrêt" doit faire référence à ("item3").range("a2:a62")

La combo "Causes" doit faire référence à la plage cellule déterminé par la combo "type d'arrêt"

La combo "Natures" doit faire référence à la plage de cellule déterminé par les combo ci-dessus.

Un exemple:
combobox ("ligne conditionnement").value = "ligne1"
combobox ("type d'arrêt").value = "pannes"
alors
Combobox ("causes") =worrksheet ("item")3.range("b13:b49")<<<ici colonneB
si je choisi "Dosage" dans la combo("causes)
alors
Combobox ("Natures")=worksheet ("item3").range("c19:c24")

si
combobox ("ligne conditionnement").value = "ligne2"
combobox ("type d'arrêt").value = "Dysfonctionnement Organisationnel"
alors
Combobox ("causes") =worrksheet ("item")3.range("b50:b62")<<<ici la clonne B
si je choisi "Contenant" dans la combo("Causes")
alors
Combobox ("Natures")=worksheet ("item3").range("d58:d62")

de plus certaines colonnes ont des cellules Vides qu'il ne faut biensur pas voir dans les combobox.

J'éspère avoir pu clarifier un peu mon problème et vous remercie encore de vous pencher sur la question.
Je vous joint à nouveau le fichier à intégrer dans mon projet dans une feuille ("item3") avec les bonnes plages de cellules
 

Pièces jointes

  • copie arret ligne cdt.xls
    29.5 KB · Affichages: 133
  • copie arret ligne cdt.xls
    29.5 KB · Affichages: 134
  • copie arret ligne cdt.xls
    29.5 KB · Affichages: 136
Dernière édition:

bqtr

XLDnaute Accro
Re : combobox avec conditions

Bonjour tous le monde,

Voici un exemple.

Il faut faire attention au remplissage de la feuille "item".

Colonne C : "Type d'Arrêt", pas d'espace entre les mots dans les cellules.
Colonne D : "Cause", elle reprends le "type d'arrêt" + un espace + le type de Cause (sans espace entre les mots).
colonne E : les n° de ligne (début et fin) des plages "Nature" avec un espace entre les chiffres.

Désolé mais je n'ai pas trouvé mieux quant à la façon de procéder au vu du formatage de ta feuille "item3", mais ca fonctionne.

Si ton tableau de la feuille "item3" évolue souvent ca ne sera pas très pratique car il faudra mettre aussi la feuille "item" à jour.

Je n'ai travaillé que sur l'alimentation des Combobox de la frame4 de l'USF1

A+
 

Pièces jointes

  • Projet_4.zip
    46.4 KB · Affichages: 113
  • Projet_4.zip
    46.4 KB · Affichages: 109
  • Projet_4.zip
    46.4 KB · Affichages: 107

alex67800

XLDnaute Impliqué
Re : combobox avec conditions

Bonjour bqtr,
pas mal cette solution. une question toutefois.
Comment as-tu fait pour que la collene E "item" renvois vers les lignes de item3?
la j'avoue ne pas saisr, en tout cas cela fonctionne.

Merci beaucoup je vais me pencher sur la modif.

Oups, pardon j'avais pas vu tu est intervenus sur les combo_click et l'userform_initalize de même qu'un module. La franchement bravo, mes connaissance plus que basique ne m'aurait pas sortie de l'eau, je nagerai encore.
RESPECT.
 
Dernière édition:

alex67800

XLDnaute Impliqué
Re : combobox avec conditions

Bonjour tous le monde,

Voici un exemple.

Il faut faire attention au remplissage de la feuille "item".

Colonne C : "Type d'Arrêt", pas d'espace entre les mots dans les cellules.
Colonne D : "Cause", elle reprends le "type d'arrêt" + un espace + le type de Cause (sans espace entre les mots).
colonne E : les n° de ligne (début et fin) des plages "Nature" avec un espace entre les chiffres.

Désolé mais je n'ai pas trouvé mieux quant à la façon de procéder au vu du formatage de ta feuille "item3", mais ca fonctionne.

Si ton tableau de la feuille "item3" évolue souvent ca ne sera pas très pratique car il faudra mettre aussi la feuille "item" à jour.

Je n'ai travaillé que sur l'alimentation des Combobox de la frame4 de l'USF1

A+

Bonsoir bqtr, le forum,
Je suis obligé de relancer ce fil, la méthode de combo en cascade fonctionne très bien avec excel2003, malheureusement au boulot comme pour beaucoup, nous en sommes encore à excel97.
Et la cette version ne digère par la methode split.
Il me met à chaque fois une erreur "manque fonction ou sub"?
De plus le menu aide n'est pas installé au boulot, donc pas évident de m'en sortir.

Je vous joint le bout de code qui se met en surbrillance:
Code:
Private Sub ComboBox4_Click() 'arrêt
Dim Cell As Range, k As Long, x As Long, Tablo, Cause

ComboBox5.Clear
ComboBox6.Clear
x = 0
Tablo = Sheets("item").Range("D1:E" & Sheets("item").Range("D65536").End(xlUp).Row)
  For k = 1 To UBound(Tablo, 1)
     Cause = [COLOR="Red"][B]Split[/B][/COLOR](Tablo(k, 1), " ")
     If Cause(0) = ComboBox4 Then
        ComboBox5.AddItem Cause(1)
        ComboBox5.List(x, 1) = Tablo(k, 2)
        x = x + 1
     End If
  Next
End Sub

Pourriez-vous me dire comment faire pour règler ce porblème.
Je vous remercie par avance de toute l'aide que vous pourrez m'apporter.
 

alex67800

XLDnaute Impliqué
Re : combobox avec conditions

Re bonsoir,
si quelqu'un pourrais m'aider à remplacer la focntion Split par un autre compatible avec excel97 serait d'une très grande aide.
Dans la doc :

Description

Renvoie un tableau de base zéro à une dimension contenant le nombre spécifié de sous-chaînes.

Syntaxe

Split(expression[, delimiter[, limit[, compare]]])

Don comment transcrire en language excel97 cette fonction qui n'est apparut apparement à partir de excel2000.

Encore merci pour votre aide.
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : combobox avec conditions

Bonjour Alex, Pierre-Olivier, kjin

regarde peut être le code ci-dessous, si j'ai bien compris et si la fonction "InStr" existait sous 97....

Code:
Option Explicit
Sub test()
Dim t As String
t = "mon texte"
t = Left(t, InStr(t, " ") - 1)
End Sub

bonne journée
@+
 

alex67800

XLDnaute Impliqué
Re : combobox avec conditions

Bonour Pierrot93 (heureux de te relire), Boisgontier (ton excellente réputation t'a précédé, enchanté de te lire),

Pierrot,
A quel endroit dois-je intégrer ce code. J'ai effectivement entendu parler via google. de cette méthode Instr.

Sue ce fil tu peu voir le fichier que bqtr m'avait fait avec la fonction split.

Dois-je intégrer cela dans un module? Puis laisser le code initiale dans le combobox4, en remplaçant Sub test, par Sub Split?

Boisgontier,
je te remercie pour ton aide, tes connaissances dépasse largement les miennes, à el point que je suis à la masse.

Comment intégrer l'un ou l'autre code dans celui-ci:
Code:
Private Sub ComboBox4_Click() 'arrêt
Dim Cell As Range, k As Long, x As Long, Tablo, Cause

ComboBox5.Clear
ComboBox6.Clear
x = 0
Tablo = Sheets("item").Range("D1:E" & Sheets("item").Range("D65536").End(xlUp).Row)
  For k = 1 To UBound(Tablo, 1)
     Cause = Split(Tablo(k, 1), " ")
     If Cause(0) = ComboBox4 Then
        ComboBox5.AddItem Cause(1)
        ComboBox5.List(x, 1) = Tablo(k, 2)
        x = x + 1
     End If
  Next

On utilisant ton code Boisgontier comme tu l'a fait via un module nommé Split?

Merci de bien vouloir m'éclairer sur la meilleur démarche, et pour votre aide.

A vous lire.
 

Pierrot93

XLDnaute Barbatruc
Re : combobox avec conditions

Re

essaye comme ci-dessous :

Code:
For k = 1 To UBound(Tablo, 1)
          If Left(Tablo(k, 1),  InStr(Tablo(k, 1), " ") - 1) = ComboBox4 Then
        ComboBox5.AddItem Mid(Tablo(k, 1),   InStr(Tablo(k, 1),   " "))
        ComboBox5.List(x, 1) = Tablo(k, 2)
        x = x + 1
     End If
  Next

attention, non testé...

@+
 

alex67800

XLDnaute Impliqué
Re : combobox avec conditions

Re Bonsoir Pierrot93,

Merci tu es un génie. Cela fonctionne parfaitement, en tout cas avec ma version 2003, il ni a pas d'erreur. restera plus qu'à le tester sur 97.
Toutefois j'ai encore split dans une autre combo.
Code:
Private Sub ComboBox5_Click() 'Causes
Dim NumLigne, k As Long

ComboBox6.Clear
NumLigne = Split(ComboBox5.List(ComboBox5.ListIndex, 1), " ")
With Sheets("item3")
  For k = Val(NumLigne(0)) To Val(NumLigne(1))
     If .Cells(Val(k), Val(ComboBox3.List(ComboBox3.ListIndex, 1))) <> "" Then ComboBox6.AddItem .Cells(Val(k), Val(ComboBox3.List(ComboBox3.ListIndex, 1)))
  Next
End With
If ComboBox6.ListCount = 0 Then ComboBox6.AddItem "Pas de Nature"
End Sub

Donc je dois changer cette partie:
Code:
NumLigne = Split(ComboBox5.List(ComboBox5.ListIndex, 1), " ")
With Sheets("item3")
  For k = Val(NumLigne(0)) To Val(NumLigne(1))
     If .Cells(Val(k), Val(ComboBox3.List(ComboBox3.ListIndex, 1))) <> "" Then ComboBox6.AddItem .Cells(Val(k), Val(ComboBox3.List(ComboBox3.ListIndex, 1)))

Peut-être de la manière suivante (ce n'est qu'un début de code):
Code:
Numligne= Left(ComboBox5.List(ComboBox5.ListIndex, 1), Instr(ComboBox5.List(ComboBox5.ListIndex, 1), " ")-1)

puis je sèche. suis-je complètement dans l'erreur?
C'est li'instruction For k= Val que je ne sais comment intégrer à la suite du code.
 

bqtr

XLDnaute Accro
Re : combobox avec conditions

Bonsoir à tous,

Essaye ceci :

Code:
Private Sub ComboBox5_Click()
Dim NumLigneDeb As Long, NumLigneFin As Long, k As Long
ComboBox6.Clear
NumLigneDeb = Left(ComboBox5.List(ComboBox5.ListIndex, 1), InStr(ComboBox5.List(ComboBox5.ListIndex, 1), " ") - 1)
NumLigneFin = Right(ComboBox5.List(ComboBox5.ListIndex, 1), Len(ComboBox5.List(ComboBox5.ListIndex, 1)) - InStr(ComboBox5.List(ComboBox5.ListIndex, 1), " "))
With Sheets("item3")
  For k = NumLigneDeb To NumLigneFin
     If .Cells(k, Val(ComboBox3.List(ComboBox3.ListIndex, 1))) <> "" Then ComboBox6.AddItem .Cells(k, Val(ComboBox3.List(ComboBox3.ListIndex, 1)))
  Next
End With
If ComboBox6.ListCount = 0 Then ComboBox6.AddItem "Pas de Nature"
End Sub

A+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 203
Membres
103 157
dernier inscrit
youma