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 :
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 Subma 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 Subvoici 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 SubA 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...
du coup, j'ai quand même pris le temps de paramétrer tous les boutonsOption.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 :
SUPER !
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/2025Depuis 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.
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.
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 SubJe 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 Subre,
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
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 Submais 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".
Je suis sûr qu'il existe une fonction ou autre code qui permet de lancer la macro
Rechercher02et 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 Subre, 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 SubPrivate 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...
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
'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 papicxmais 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.
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