Faire une condition de recherche avec un bouton option

Bonjour à tous,

J'ai un formulaire de recherche pour un tableau.
Je voudrais par le choix via des BoutonsOption faire que les réponses affichées correspondent au modèle de moto sélectionné.
Par ailleurs, si ça pouvait "mémoriser" le choix de la moto pour la recherche suivante, ce serait apprécié.

Dans le tableau1 (base de données), j'ai des colonnes pour les 3 différentes cylindrées, et des colonnes pour chacun des types : Z, A, B, Ca, Cb, etc.

Voilà comment ça se présente :

2025 07 08 102858

Dans le code du formulaire "RechercherHonda" j'ai commencé un code pour 2 boutons, mais évidemment ça bloque déjà sur la variable "wsh" que j'ai tenté de créer pour simplifier le code.
J'ai essayé "as String" et "as Object", mais je dois oublier qq chose.

code pour le bouton "500 Z"

Private Sub OptionButton500Z_Click()        ' sélectionne les réponses si ces 2 conditions sont vraies
    Dim wsh
    wsh = ThisWorkbook.Sheets("Honda")     ' feuille où est le tableau1
    If OptionButton500Z = True Then
        If wsh.Range("AG") = "500" And wsh.Range("AX") = "Z" Then       ' colonne cyl_500 et typ_Z
         ' là, le code pour activer la recherche qui est dans le module 6
        End If
    End If
End Sub

ma tentative de code pour le bouton "400 B"

Private Sub OptionButton400B_Click()        ' sélectionne les réponses si ces 2 conditions sont vraies
    Dim wsh
    wsh = ThisWorkbook.Sheets("Honda")      ' feuille où est le tableau1
    If OptionButton400B = True Then
      If wsh.Range("AE") = "400" And wsh.Range("BB") = "B" Then       ' colonne cyl_400 et typ_B
         ' là, le code pour activer la recherche qui est dans le module 6
      End If
    End If
End Sub

voici le fichier

Bonjour,

Essayez ceci, on applique un filtre sur la colonne AG pour rechercher 500 et sur la colonne AX pour recherche Z

Private Sub OptionButton500Z_Click()
    Dim wsh As Worksheet
    Dim Tabl1 As ListObject

    Set wsh = Sheets("Honda")                    ' Feuille contenant le tableau
    Set Tabl1 = wsh.ListObjects("Tableau1")      ' Récupération du tableau structuré
    Tabl1.AutoFilter.ShowAllData ' Suppression de tous les filtres

    If OptionButton500Z.Value = True Then
        Tabl1.Range.AutoFilter Field:=32, Criteria1:="=500*" ' Application des filtres pour 500
        Tabl1.Range.AutoFilter Field:=49, Criteria1:="Z" ' Application des filtres pour Z
    End If
End Sub

A adopter le même principe pour les autres cylindrées.

Cdlt

Merci pour ce début de solution.
Une première petite question : pourquoi avoir mis le signe " = " devant le 500 ? il est enregistré dans ce champ par une liste déroulante.
en enlevant le signe = et l'astérisque, j'ai eu plus de lignes affichées (55, contre 4).
il y avait qq ligne avec le mauvais format de cellule. J'ai remis en "standard" et tout est rentré dans l'ordre.

Criteria1:="=500*"

Le filtre fonctionne bien, mais il sélectionne le tableau1, or je voudrais qu'il viennent en complément des textBox "Référence" , "Désignation" et "Dimensions" du formulaire de recherche.
La fonction de filtrage est dans le module6 de mon fichier.

J'ai appliqué le code dans les boutons 400 B, 400Cb, 500Z, 400E et 650E.
Je ne les ai pas tous appliqués car je pense que le code final sera bien différent.

Une première petite question : pourquoi avoir mis le signe " = " devant le 500 ? tout simplement parce que ce que l'on cherche n'est pas une valeur fixe comme "Z" mais une valeur commençant par "500" suivi de tout autre valeur exprimée grâce à "*" , donc pour que ça marche il faut lui mettre "=", sinon il chercherait la valeur "500*"

Pour le reste, je n'ai pas compris la façon dont on doit se servir de l'application, donc pas de solution en vue.

du coup, j'ai continué de coder les options car il y a des différences sur certains modèles.


Le formulaire de recherche se déclenche par double clic sur une ligne, entre les colonnes F à O.

via le module6, la recherche se fait sur les colonnes HondaOrigine, New_Ref_Honda, désignation et dimensions.
Ce que je voudrais, c'est que le filtre, via les boutons Option, afine le résultat affiché dans la ListBoxResultat. En somme, un filtre supplémentaire.

Par exemple, si dans la fenêtre "désignation" je saisi "guide chaine", actuellement, ça affiche 5 résultats. ( attention, il faut ajouter 5 au numéros de ligne de droite si tu veux les retrouver sur le tableau1).
en cliquant sur "500A" on devrait diminuer la liste à 3 lignes. Là, c'est un exemple simple, mais il y a des pièces où c'est bien plus volumineux.

Je pense que là aussi, il va falloir passer par un module de classe...

2025 07 08 164655

du coup, j'ai quand même pris le temps de paramétrer tous les boutonsOption.

Bonsoir,

1- J'ai redéfini la fonction de filtrage afin d'intégrer le cochage de l'option

2- J'ai redéfini votre classe OptionButton afin de ne gérer que 2 événements dans votre formulaire

ci_jointe version modifiée :

Thev, c'est vite avec ce dictionaire

SUPER ! ça fonctionne ! Merci

J'ai encore une anomalie à résoudre. Pour 2 modèles de moto, les 500 Ca et 500 Cb, il y a une différence que je peux différencier grâce au remplissage des 2 TextBox concernant chacune d'elle.
J'ai donc essayé de trouver le bon argument pour les sélectionner qui consiste à afficher que les lignes dont la cellule du modèle de moto est remplie.
si je mets "<>" (qui pour moi est "différent de" ) , que je mette .Value ou pas, il m'affiche "erreur de compilation". :(

si je mets = "*" ça ne m'affiche qu'une partie du résultat attendu.

C'est quoi le bon paramètre, s'il vous plaît ?

Private Sub OptionButton500Ca_Click()
     If OptionButton500Ca.Value = True Then
          With Range("Tableau1").ListObject.HeaderRowRange.Offset(-1)
               .ClearContents
               .Cells(1, 32).Value = "500"
               .Cells(1, 54).Value = "C"
           '    .Cells(1, 39) <> " "     ' 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

bon, j'ai crié victoire trop vite.
il y a une fonction de sélection que j'avais résolu (peut-être pas de la bonne manière).
la fonction de recherche ne fonctionnait pas sur les 2 colonnes de références. J'avais résolu en mettant en commentaire les 2 lignes dans le module6 sous

" J = 2 " et ça marchait.

  If j = 1 And b Then     'c'est déjà okay pour Honda Original, donc inutile de vérifier New_Ref_Honda,
                                             j = 2     'sursauter New_honda
                                             '        Else                                    ' mis en commentaire par papicx  03/07/2025
                                             '              If Not b Then Exit For     'si drapeau est déjà faux, inutile de continuer ' mis en commentaire par papicx  03/07/2025

Depuis l'ajout des OptionButtons, ça ne sélectionne que la colonne Honda_Origine mais pas dans la seconde (New_Ref_Honda).
Vous pourrez le voir facilement, saisissez 80123 et 90123 dans la textbox des références.


Petit bug, mais là ça doit être de ma faute. Comme j'ai recopié le code du fichier de Bart j'ai du me foirer quelque part.
J'ai beau chercher depuis 2 heures, je ne trouve pas.

Avec le fichier de Bart, quand j'ouvre le formulaire de recherche, le bouton "aucun type particulier " est déjà surligné en jaune. Aucune n'est sélectionnée d'ailleurs.
J'ai renommé cette option d'ailleurs. De OptionButton651, je l'ai renommé en OptionButtonAucunType.

Sur mon fichier version 4, ce n'est pas le cas.
Peut-être que les 2 anomalies sont liées ?

NB : pour les 2 sélections, 500 T et 650 T, contrairement aux autres, je n'ai besoin que d'une colonne.

2025 07 09 173334

re,

je n'avais pas encore lu votre dernier poste quand j'avais crée le fichier in PJ. Donc, s'il y a des choses que vous avez modifié cependant, désolé ...

Bonjour Bart.

Pas de souci. Ce n'est pas grave.

Je n'ai pas la possibilité d'ouvrir votre fichier que ce soir.

Pouvez vous regarder pour les 2 dernières questions, s'il vous plaît ?

Et, serait il possible d'afficher le numéro de ligne de la feuille dans le TextBoxResultat au lieu du ListRow du tableau ?

Merci d'avance.

re,

j'ai volé l'idée de Thev, donc ce dictionaire et reconstruit cette fonction dans le module6. Aussi, au bout du tableau, il y a 2 nouvelles colonnes, colonne BQ sert pour filtrer Honda Original et/ou new et colonne BR montre le numéro de la ligne si cette ligne est visible. Donc ce n'est pas visible, naturellement, mais toutes les cellules des lignes cachées (à cause des filtres par exemple) sont toutes 0 !!!! Et pour votre question précédent, c'est ce numéro qu'on utilisera plus tard ! (mais je n'ai pas encore parcouru toutes les macros pour vérifier si c'est okay)

Puis j'utilise la ligne juste au dessus les entêtes (ligne 4) pour filtrer le tableau pour désignation, dimensions, Ref (pas les colonnes B ou D mais BQ) mais aussi certaines colonnes en relation avec les optionbuttons utilisés. Donc après l'exécution de la macro, les lignes visibles seront celles que vous voyez aussi dans le "ListboxResultat".

Il y a une chose que je n'ai pas encore une opinion. Par exemple, si je tape "cable" dans "désignation", cela sont 5 charactères et maintenant la macro est exécutée 5 fois consécutives. N'est-ce pas embêtant ?

Bon, que pensez-vous ...

bonjour Bart,

premier test :

quand je saisi la référence 90123 qui est contenue dans la colonne NewRefHonda, j'ai ça.
en fait, cette "paire" de référence est un bon test pour savoir si le formulaire scanne les 2 colonnes. 80123 RefOrigine et 90123 NewRefHonda.

on voit aussi un décalage des colonnes dans la BoxListResultat.

2025 07 10 184920 2025 07 10 184948

je continue la batterie de test...


edit 19h29

J'ai enfin trouvé comment faire pour avoir le bouton "Aucun type particulier" surligné en jaune.
Dans la Feuil3(Honda), il y a ça la macro qui ouvre le formulaire "RechercherHonda" : j'ai juste ajouté la couleur de fond.

Je trouvais bizarre que ce bouton, tout spécialement, soit activé...

Private Sub Rechercher02_Click()
     Me.Range("Tableau1").ListObject.HeaderRowRange.Offset(-1).ClearContents
     bHandshake = True
     With RechercherHonda
          .OptionButtonAucunType.Value = True           'on commence avec aucun "option"
          .OptionButtonAucunType.BackColor = &H80FFFF   ' le bouton est surligné en jaune
          With .ListBoxResultat
               .ColumnCount = 5              '5ème colonne = N° listrow
               .ColumnWidths = "120;120;303;156;25"     ' largeur des colonnes : Ref_Origne 98, new ref Honda 98, désignation 288, dimensions 156 et le numéro du listrow
          End With
          .Show
     End With
End Sub

Je viens de voir que le code de recherche d'une cellule non vide est celui-là. (mon message du 10/07/2025, 12h22)

 .Cells(1, 21).Value = "<>"     ' colonne V, cellule non vide,

J'en n'étais pas loin...

Merci, ça marche.

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

re,

le problème "90123", je mets toutes les données dans un dictionaire, mais si celui n'a qu'une entrée, une ligne qui correspond et je lis ses "items", je reçois une matrice unidimensionale commençant avec index 0 au lieu d'une matrice deux-dimensionale commençant avec index 1. Donc au bout de cette fonction en module6, je dois transformer cette matrice-1D en une matrice-2D et là, il y avait une faute, ce décalage. (Désolé, je ne sais pas bien l'expliquer en français, si vous ne le comprenez pas ,il faut que quelqu'un autre l'explique autrement).

Et oui, vous y êtiez presque avec ce "<>"

Bonjour Bart.

Comme hier je ne pourrai voir le fichier que ce soir.

J'ai bien compris la problématique que vous avez très bien expliquée. Votre francais est impeccable.

Je vous fais un retour prochainement.

Merci bien.

YES ! ça marche !

pouvez vous me dire comment je dois faire pour qu'à partir du bouton "Rechercher" inclus dans le formulaire ModifierHonda

2025 07 11 191045

pour déclencher le formulaire RechercherHonda.
Jusqu'à présent, le simple code suffisait

Private Sub CB_Rechercher_Click()
     ' ferme le formulaire ModifierHonda et ouvre le formulaire RechercherHonda
     Unload Me
     RechercherHonda.Show
End Sub

mais depuis l'insertion des OptionButton , la fonction de recherche (en particulier des références) qui vient d'être corrigée ne fonctionne pas.

et je vois aussi qu'il manque la colonne "dimensions".

2025 07 11 193821

Je suis sûr qu'il existe une fonction ou autre code qui permet de lancer la macro

Rechercher02

et qui évite de devoir copier-coller (avec qq ajustements je pense) qui risque un jour ou l'autre de coincer si on modifie une ligne et qu'on oublie l'autre (comme les largeurs de colonne ou l'ajout d'une nouvelle).

voici la macro qui est dans la feuil3(Honda)

Private Sub Rechercher02_Click()
     Me.Range("Tableau1").ListObject.HeaderRowRange.Offset(-1).ClearContents
     bHandshake = True
     With RechercherHonda
            .OptionButtonAucunType.Value = True             'on commence avec aucun "option"
            .OptionButtonAucunType.BackColor = &H80FFFF     ' le bouton est surligné en jaune
          With .ListBoxResultat
               .ColumnCount = 5              '5ème colonne = N° listrow
               .ColumnWidths = "120;120;303;156;25"     ' largeur des colonnes : Ref_Origne 98, new ref Honda 98, désignation 288, dimensions 156 et le numéro de ligne de la feuille (et non du listrow, corrigé le 10/07/2025)
          End With
            .Show
     End With
End Sub

re, je suis un peu paresseux : si on enlève le "private" en face de "Sub Rechercher02_Click()" et puis on change la macro du bouton "Rechercher" en ceci, tout est fait avec un minimum d'efforts. C'est important qu'on utilise le "codename" de la feuille "Honda", donc "feuil3" pour lancer la macro donc "Feuil3.Rechercher02_Click"

Private Sub CB_Rechercher_Click()
     ' ferme le formulaire ModifierHonda et ouvre le formulaire RechercherHonda
     Unload Me
     Feuil3.Rechercher02_Click               'la macro Rechercher02 de la feuille Honda (codename = "feuil3")
     'RechercherHonda.Show
End Sub

Private Sub Rechercher02_Click()

bon, comme ça, on fait la même chose qu'avec le bouton "Rechercher" de la page "Honda", donc normallement il y aura pas des surprises inattendues ...

Bonjour Bart,

Impeccable ! La modification du code fait le job !


Je viens de constater que, à présent, c'est bien le numéro de la ligne de la feuille qui est indiquée dans la ListboxResultat, mais quand on clique dessus, on est dirigé vers le numéro de ligne du Listrow (+5)

Autre anomalie constatée, mais je pense que c'est lié à la position de la ligne :
Quand j'ai ajouté la référence alternative à la première fiche du tableau, j'ai eu un message d'erreur.
notez au passage qu'il n'y a pas de photo mais qu'il en indique en avoir une dans le tableau19.

En enregistrant des photos dans d'autres fiches, l'opération se passe bien, tout est normal.
C'est juste le décalage lors du doucle-clic dans la ListboxResultat qui est anormal.

Je vais regarder le code, mais je doute que je trouve la solution. Mais je vais regarder quand même.

pour mémoire, voir votre post du 24 juin 2025 quand on a parlé du renommage des lignes...

2025 07 12 102620 2025 07 12 102646 2025 07 12 102704 2025 07 12 102725

Merci d'avance

re,

bon, supér qu'on avance !

Ce décalage entre le nuémro de ligne de la feuille et le numéro du listrow, un tableau structuré est un outil vraiment facile à manipuler et si on le traite comme TX, il est complètement indépendant de sa feuille, on peut le déplacer vers une autre feuille ou dans la feuille elle-même, on n'a rien à modifier ! Je continue à utiliser le "listrow" et comme vous voulez voir la ligne dans ce textbox, chaque fois que j'utilise ce textbox, je dois faire ce décalage. Par exemple le "sauvegarde" de l'userform ""ModificationHonda", dont on voit les premières lignes ici dessous, ILigne = le numéro du listrow = le numéro de la ligne (comme le textbox est un string, on le transforme en valeur et puis on soustrait le numéro de l'ente^te du tableau et c'est ce résultat qu'on utilise le reste de la macro.

Private Sub CB_Sauvegarder_Click()
     '***************************************************************
     ' bouton SAUVEGARDER
     ' TextBoxNumLigne.Text montre la ligne, mais il faut corriger pour savoir le "listrow"
     ' ce décalage est le numéro de la ligne des entêtes
     '***************************************************************
     Dim i, j, Ligne, c, c1, s, L, iLigne
     aMaster = Range("tabel19").Value2       'mettre en mémoire les données du tableau "tabel19", donc les liens entre l'UF et le tableau "tableau1" de Honda

     With Range("tableau1").ListObject
          iLigne = Val(TextBoxNumLigne.Text) - .Range.Row     'quelle est la ligne à écraser (valeur de textboxnumligne)

dans ce même userform, "dupliquer" n'a pas besoin de cela, parce qu'on copie&colle le duplicate comme nouvelle dernière ligne

Puis l'userform "AjouterHonda", maintenant c'est encore la méthode "papicx" qu'on utilise, donc c'est sans le TS

Attention pour ce décalage, il y a plusieurs possibilités pour le calculer : si on utilise le TS, cest range("tableau1").listobject.range.row oubien si on utilise la plage nommée (mais sans utiliser le TS), c'est range("Tableau1").row-1, parce que c'est plage est sans l'entête,pour simplifier les choses !

Donc dans le ListBoxResultat_Click() de l'userform "RechercherHonda", on calcule là, "ligne_TS" et on utilise cette valeur pour sélectionner cette cellule et pour lancer la macro "M_ModifHonda"

Peut-être il y a encore d'autres macros à corriger pour cela !

Et puis pour cette erreur "application.goto" , je montre la ligne de l'artoicle et les 10 lignes précédentes, mais supposons que votre article se trouve sur la ligne 6, alors 10 lignes précédentes, c'est à partir de la ligne -4 Alors vous voyez cette correction dans "CB_Sauvegarder_Click"

   'je veux montrer la ligne modifier et une dixaine de lignes avant celle, mais si on était déjà au début, cela n'est pas toujours possible, alors première ligne du tableau
          If c.Row > .Row + 10 Then Application.Goto c.Cells(1).Offset(-10), 1 Else Application.Goto .DataBodyRange.Cells(1), 1
          Application.Goto c.Cells(1)
          MsgBox "Les modifications ont bien été sauvegardées." & vbCrLf & vbCrLf & "Vous pouvez fermer le formulaire.", vbInformation, "MODIFICATIONS ENREGISTRÉES"

Bonjour Bart, et merci pour la correction.

Je n'avais pas fait attention, mais le nombre des photos dans le formulaire ModifierHonda n'était pas le bon.
Comme je faisais référence à la colonne par son nombre (colonne BQ donc 69) et que vous avez ajouté des colonnes devant, le nombre affiché devenait le celui de la colonne Filtre Refs
J'ai donc corrigé pour rétablir le bon numéro de colonne (colonne BS donc 71), c'est dans le module3, ligne 68. => résolu.

'    .TextBoxNombreImage = Cells((Ligne + 5), 69)     ' colonne BQ  Image1  affichage du nombre d'image(s)
             .TextBoxNombreImage = Cells((Ligne + 5), 71)    ' colonne BS  Image1  affichage du nombre d'image(s) modifié le 12/07/2025 papicx
         '   .TextBoxNombreImage = Cells((Ligne + 5), (Column = "Image1"))    ' colonne BS  Image1  affichage du nombre d'image(s) modifié le 12/07/2025 papicx

mais au fait, il me semble qu'il existe une autre façon de faire en désignant le nom de la colonne ?
Je vais faire des essais pour retrouver ça.
J'ai essayé Range, Range.Name, Range.Column, Colomn.Name.


on a un bug quand on duplique une ligne. et même en général quand on sauvegarde.
J'ai dupliqué la dernière ligne, la nouvelle se colle à l'avant dernière place comme avant, mais ça génère un blocage.

2025 07 12 175915 2025 07 12 175657

NB : le surlignement en jaune est automatique, ce n'est pas moi qui l'ai fait.

Je n'ai pas encore testé le formulaire AjouterHonda depuis, mais les 2 boutons pour ajouter une nouvelle référence au tableau1, fonctionnent depuis un moment...
Avec l'ajout des 2 nouvelles colonnes, je n'ai pas encore testé.
Je m'y mets.

edit 18h37

J'ai corrigé en "découpant" la ligne, ce qui revient à mettre l'ancienne.

      '    If c.Row > .Row + 10 Then Application.Goto c.Cells(1).Offset(-9), 1 Else Application.Goto .DataBodyRange.Cells(1), 1     ' mis en commentaire papicx12/007/2025
          Application.Goto .DataBodyRange.Cells(1), 1      ' remis par papicx 12/07/2025
Rechercher des sujets similaires à "condition recherche bouton option"