Ne pas afficher certaines lignes dans la listbox
Bonjour à tous,
Dans le formulaire de recherche, j'ai des boutons pour n'afficher que les modèles de motos auxquelles correspondent les pièces.
Dans l'exemple suivant, je voudrais que quand je sélectionne la " 650E " que la ligne qui correspond au 400 / 500 E ne s'affiche pas.
Pour cela, j'ai un champ " 650 E " , colonne X (c'est un hasard que ce soit cette colonne là) que j'ai rempli avec un X majuscule dans le Tableau1, onglet Honda,
Dans mon code pour le bouton " 650 E ", cela sélectionne la colonnes AH qui contient les " cyl_650 " ET la colonne BE pour les " typ_E ", car malheureusement pour moi, les 500 GL et 650 C ont ce régulateur.
Dans le formulaire " RechercherHonda
" , le code pour ce bouton est le suivant :
Private Sub OptionButton650E_Click()
If OptionButton650E.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 33).Value = "650"
.Cells(1, 56).Value = "E"
End With
UserForm_Initialize
End If
End SubJe ne sais pas comment m'y prendre pour faire en sorte que lorsqu'il y a un " X " dans la colonne X, donc la numéro 24, de la ligne que celle-ci ne s'affiche pas.
NB : comme ce champ dans d'autres cas contiendra du texte, je ne peux exclure les lignes où ce champ en contiendra. Ce champ peut être vide aussi.
Comme j'en ai deux ou trois combinaisons dans le même cas, j'appliquerai la même méthode.
Merci d'avance de votre aide éclairée.
Je crois que j'ai trouvé.
J'ai mis ça, mais si quelqu'un pouvait me confirmer que la syntaxe est correcte, cela me rassurerait.
Private Sub OptionButton650E_Click()
If OptionButton650E.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 33).Value = "650"
.Cells(1, 56).Value = "E"
' exclu les lignes où un X est dans le champ de saisi de la vue des 650 E
.Cells(1, 23).Value = "<>X"
End With
UserForm_Initialize
End If
End SubMerci d'avance
Salut papicx
Voici le fichier avec le code allégé et modifié
Pour info, il est inutile de mettre du code derrière chaque Option Button puisqu'il y a un module de classe existant qui peut servir à ça également
A+
Merci JExceL2fr,
Merci beaucoup, je vais regarde ça.
Par contre, je ne comprends pas ce que tu veux dire. Qu'as tu remarqué qui ne va pas dans mon fichier, et surtout où ?
il est inutile de mettre du code derrière chaque Option Button puisqu'il y a un module de classe existant qui peut servir à ça également
A+
Salut Patrice,
Dans le code de ton USF "RechercherHonda", toutes ces lignes
Private Sub OptionButton400B_Click() ' sélectionne les réponses si ces 2 conditions sont vraies
If OptionButton400B.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 30).Value = "400"
.Cells(1, 53).Value = "B"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton400Cb_Click()
If OptionButton400Cb.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 30).Value = "400"
.Cells(1, 54).Value = "C"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton400E_Click()
If OptionButton400E.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 30).Value = "400"
.Cells(1, 56).Value = "E"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500A_Click()
If OptionButton500A.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 52).Value = "A"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500B_Click()
If OptionButton500B.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 53).Value = "B"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500Ca_Click()
If OptionButton500Ca.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500" '32 au lieu de 33
.Cells(1, 54).Value = "C"
.Cells(1, 39).Value = "<>" ' colonne AN, cellule non vide, TextBox500Ca, numéro de la vue et de la pièce sur les microfiches Honda
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500Cb_Click()
If OptionButton500Cb.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 54).Value = "C"
.Cells(1, 21).Value = "<>" ' colonne V, cellule non vide, TextBox500Cb, numéro de la vue et de la pièce sur les microfiches Honda
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500Da_Click()
If OptionButton500Da.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 55).Value = "D"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500E_Click()
If OptionButton500E.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 56).Value = "E" ' correction papicx 20/07/2026 il y avait 56 et "G"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500GL_Click()
If OptionButton500GL.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 57).Value = "G"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500T_Click()
If OptionButton500T.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 58).Value = "500 T"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton500Z_Click() ' sélectionne les réponses si ces 2 conditions sont vraies
If OptionButton500Z.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 32).Value = "500"
.Cells(1, 49).Value = "Z"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton650C_Click()
If OptionButton650C.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 33).Value = "650"
.Cells(1, 54).Value = "C"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton650E_Click()
If OptionButton650E.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 33).Value = "650"
.Cells(1, 56).Value = "E"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton650GL_Click()
If OptionButton650GL.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 33).Value = "650"
.Cells(1, 57).Value = "G"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButton650T_Click()
If OptionButton650T.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, 59).Value = "650 T"
End With
UserForm_Initialize
End If
End Sub
Private Sub OptionButtonAucunType_Click()
If OptionButtonAucunType.Value = True Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
End With
UserForm_Initialize
End If
End SubPeuvent être remplacées (si j'ai bien compris le principe) par le code suivant dans le module de classe "ClasseOptionButton"
Private Sub Opt_Click()
Dim sCyl As String, sType As String, sMoto As String
Dim ColC As Long, ColT As Long, ColM As Long
Opt.BackColor = &H80FFFF ' couleur jaune si actif
If Opt.Value = True Then
If Opt.Caption = "aucun type particulier" Then
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
End With
' Relancer la mise à jour de l'USF
Call RechercherHonda.MàJ_USF
' On sort
Exit Sub
End If
' Sinon récupérer les infos
sCyl = Left(Opt.Caption, 3)
sType = Trim(Mid(Opt.Caption, 4, Len(Opt.Caption) - Len(sCyl)))
sMoto = sCyl & " " & sType
' Trouver la colonne de la moto
ColC = NumCol("cyl_" & sCyl) - 1
If ColC = 0 Then
MsgBox "Impossible de trouver la cylindrée : " & sCyl, vbCritical, "ATTENTION ..."
Exit Sub
End If
ColT = NumCol("typ_" & Left(sType, 1)) - 1
If ColT = 0 Then
MsgBox "Impossible de trouver le type : " & sType, vbCritical, "ATTENTION ..."
Exit Sub
End If
ColM = NumCol(sMoto) - 1
If ColM = 0 Then
MsgBox "Impossible de trouver la moto : " & sMoto, vbCritical, "ATTENTION ..."
Exit Sub
End If
With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
.ClearContents
.Cells(1, ColC).Value = sCyl
.Cells(1, ColT).Value = sType
.Cells(1, ColM).Value = "<>"
End With
' Relancer la mise à jour de l'USF
Call RechercherHonda.MàJ_USF
End If
End SubJ'espère que ce sera plus clair
A+
Bonjour JExcel2fr
Alors oui, c'est un peu plus clair.
Mon problème est que je serai incapable de créer un tel code, tout juste le maintenir car j'arrive à comprendre comment il fonctionne.
Le souci est que chaque type est particulier (en fait donc la combinaison de la cylindrée, du type)
La fameuse case "ColM" , qui vient en troisième position, éventuellement dans le filtrage, est normalement utilisée pour indiquer le numéro de la vue sur les microfiches du constructeur, par exemple "F 4 - 26".
J'ai utilisé cette case, il y en a 1 par modèle, pour définir le filtrage "négatif" qui fait que si j'ai un "X" dans cette case sur une référence, la pièce n'est pas affichée pour ce modèle. Mais, sinon ce ne serait pas drôle, s'il y a un numéro de vue pour le modèle, alors la fiche doit être affichée.
Par exemple, pour le modèle de CX500Ca et pour le modèle de CX500Cb il faut que leur foutue case soit renseignée.
.Cells(1, 39).Value = "<>" ' colonne AN, cellule non vide, TextBox500Ca, numéro de la vue et de la pièce sur les microfiches Honda.Cells(1, 21).Value = "<>" ' colonne V, cellule non vide, TextBox500Cb, numéro de la vue et de la pièce sur les microfiches Honda(case <> comme condition) alors que toute les deux sont bien des 500 ET de type custom.
Actuellement, ces cases ne sont pas toute remplies, je suis en phase de remplissage de ces infos, au fil de l'eau. Imagine le taff : plus de 1500 références et 26 modèles de moto... je te laisse apprécier l'ampleur de la tache.
J'espère que tu comprendras que je préfère rester avec mon "vieux" code , 1 par modèle, que je pourrai modifier à volonté en comprenant ce que je fais.
Je demandais si la syntaxe que j'ai mise était conforme. Apparemment ça doit l'être car ça fonctionne et je n'ai pas de message d'erreur.
' exclu les lignes où un X est dans le champ de saisi de la vue des 650 E
.Cells(1, 23).Value = "<>X"À titre d'info, la présence d'un X dans la case, la fait s'afficher en rouge pour attirer l'attention sur l'incompatibilité avec ce modèle.
Je tiens à te remercier particulièrement pour ces explications. Il est probable qu'elles me serviront pour d'autres projets.