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.

regulateur 01

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 Sub

Je 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 Sub

Merci 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 Sub

Peuvent ê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 Sub

J'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. Donc, si je suis trop restrictif, ça va me compliquer la tâche plutôt que de me la simplifier.

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.

Rechercher des sujets similaires à "pas afficher certaines lignes listbox"