Re-Bonjour le forum !
Cette fois-ci, je n'ai vraiment pas trouvé la solution... Je vous mets les 2 codes en brut et vous explique leurs fonctionnements, ainsi que l'endroit où ça bloque.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| Private Sub ComboBox1_Change()
Dim CBG As Range, cellule As Range
Dim derLig As Integer
ComboBox2.Clear
derLig = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
Range("A2:A" & derLig).AutoFilter
Range("A2").AutoFilter Field:=13, Criteria1:=ComboBox1.Value, visibledropdown:=True
Set CBG = Range("C2:C" & derLig).Offset(0).SpecialCells(xlCellTypeVisible)
For Each cellule In CBG
ComboBox2.AddItem (cellule.Value & " - " & Cells(cellule.Row, 4).Value)
Next
End Sub
Private Sub ComboBox2_Change()
Dim CodeBG As String
Dim derLig As Integer
Dim FP As Range
derLig = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
CodeBG = Left(ComboBox2.Value, 4)
Range("A2").AutoFilter Field:=3, Criteria1:=CodeBG, visibledropdown:=True
If derLig > 1 Then
Set FP = Range("C2:C" & derLig).Offset(0).SpecialCells(xlCellTypeVisible)
TB1.Text = Cells(FP.Row, 1).Value
TB2.Text = Cells(FP.Row, 12).Value
TB1.Enabled = False
TB2.Enabled = False
End If
End Sub |
NB1 : Le second code ne comprenait pas du tout la partie avec la variable derLig à l'origine, je l'ai rajoutée par après lorsque l'erreur était déjà existante pour savoir si ça me comptait la ligne ou non.
Le premier code a pour objectif de :
- Vider la ComboBox2
- Déterminer la dernière ligne non vide et l'attribuer à la variable derLig
- Revenir au filtre général en sélectionnant toute la table
- Filtrer en fonction du résultat de la Liste Déroulante de la ComboBox1
- Définir une nouvelle plage de cellules en fonction des résultats du filtre
- Générer la liste déroulante de la ComboBox2 grâce à cette plage
Le second code a pour objectif de :
- Déterminer la dernière ligne non vide et l'attribuer à la variable derLig
- Sortir le CodeBG qui correspond aux 4 caractères premiers caractères vers la gauche de la valeur dans la ComboBox2
- Filtrer une seconde fois les résultats (déjà filtrés par le premier code) afin de n'afficher qu'une seule ligne - qui correspond au CodeBG
- Définir une nouvelle plage, qui ici correspond à une ligne unique : résultat des filtres successifs
- Attribuer à la TextBox1 et à TextBox2 leurs valeurs respectives
- Verrouiller la modification à ces deux TextBox
Le problème
Tout se passe très bien lors de la première boucle, à savoir - Sélectionner dans la ComboBox1 PUIS sélectionner dans la ComboBox2. Le problème dans la réalisation du code (du coup dans ma réalisation à moi hihi) c'est que lorsque je décide, après avoir sélectionné au préalable une valeur dans la ComboBox2, de changer de nouveau ma variable dans la ComboBox1 grâce au menu déroulant, l'AutoFilter ne s'effectue pas et je me retrouve ainsi avec une page vide...Ce qui engendre indéniablement une erreur sur cette ligne :
Set FP = Range("C2:C" & derLig).Offset(0).SpecialCells(xlCellTypeVisible)
Puisqu'il n'existe plus rien de visible. Néanmoins, l'AutoFilter s'est effectué en sous-marin puisque lorsque je l'ai effectué d'une autre façon (sans que ça corresponde à ce que je recherche), j'ai trouvé un résultat.
NB : Je perçois l'AutoFilter pendant une fraction de seconde avant qu'il ne disparaisse, visuellement parlant.
Pour faire une synthèse
Pb1 : AutoFilter "invisible"
Pb2 : Ligne "Set FP" renvoie une erreur puisque rien n'est visible
Question : Pourquoi le ComboBox2.Clear ne s'effectue-t-il pas lorsque je modifie la ComboBox1 avec la Liste Déroulante ? - ComboBox2.Clear est dans la Private Sub ComboBox1_Change()
Solution envisageable : Serait-il possible, puisqu'il n'y a qu'une ligne de résultat affichée, de sortir les résultats directement grâce au numéro de ligne associé ?
Je vous remercie pour l'attention portée à ma demande !
Je vous souhaite à tous une agréable fin de journée
Partager