Créer une macro de recherche

Bonjour à tous,

J’ai récemment intégrer une entreprise avec pour but de créer une base de donnée sur Excel.

N’y connaissant rien en langage VBA, je requière vos connaissances afin de faire les choses au mieu.

L’idée derrière cette base de donnée est de rechercher des occurrences (avec les portes logiques « ET », « OU » et « SAUF ») et d’en afficher les lignes.

Je vous joins un petit fichier Excel avec quelques explications.

La méthode que je compte employer est d’utiliser une macro qui me permettrai, en indiquant des mots-clés, d’afficher la(les) ligne(s) concernée(s) avec un seul bouton.

Je sais qu’il y a déjà la fonction =RECHERCHE dans Excel mais elle n’est valable que pour des valeurs numériques (d’après ce que j’ai compris) et c’est la que je bloque. Je pense que les commandes « filtrer » et « trier » d’Excel ne sont pas suffisante Si il y a un moyen de parvenir à ce que je veux avec un seul bouton (qui m’active la macro), cela sera plus simple que jamais.

Je vous remercie d’avance de ce que vous pourrez faire pour moi, je suis tout ouïe pour tout autre méthode me permettant d’arriver à mes fins.

Cordialement,

Louis.

36test-macro.zip (7.01 Ko)

Salut Arpam,

magnifique projet et défi!

Petite précision, histoire de ne pas se lancer inutilement dans une usine à gaz : tes critères (ET, OU, SAUF) sont-ils définitifs (donc 3!) et quelles sont les combinaisons auxquelles la macro doit répondre?

  • 2 critères : point final!
  • 2 + 1 (... OU ...) ET ...
  • 2 + 1 + 2 (... ET ...) OU (... SAUF ...)

Tu vois, il y a moyen de jouer!

A+

Bonjour Arpam, curulis57

A mon avis SAUF fait référence à BUT (ancien opérateur, dans d'anciens langages !!)

Il se traduit par ET NON

Donc les formulations d'opérateurs logiques sont au nombre de 3

  1. ET (donc AND)
  2. OU (donc OR)
  3. SAUF (ET NON - donc AND NOT)

(Rebonjour) merci de votre réponse rapide ^^.

Mes critères sont en effet définit donc trois.Je ne sais pas vraiment ce qu'il est réellement possible de faire sous VBA mais idéalement je voudrais faire :

  • (...) ET (...) SAUF (...) voire même (...) ET (...) ET (...)
  • (... ET ...) OU (... SAUF ...)

L'idée est de laisser le choix à l'utilisateur du nombre de mot-clé et du nombre de connecteur logique qu'il veut utiliser, si ce dernier n'est pas possible je m'en tiendrai à ce que j'ai marqué un peu plus haut (si possible).

J'espère que mon projet vous parait faisable, si jamais vous avez des questions n'hésitez pas.

Un grand merci à vous.

Bonsoir le fil, bonsoir le forum,

Une proposition en pièce jointe. Double-clique sur n'importe quelle cellule de l'unique onglet pour lancer l'UserForm.

Oui je sais. Ça sens le gaz ! Mais j'ai pas mieux Curulis...

46arpam-v01.zip (20.94 Ko)

Bonsoir l'équipe,

mais je n'ai rien dit, ThauThème ; je n'ai même pas pensé ou alors fort bas!

Je suis moi-même en train de me triturer les méninges pour imaginer autre chose que le style Amazon.

Toute idée est bonne à creuser!

A+

Salut Arpam,

autre précision : j'imagine mal ta BDD ne pas mentionner dans d'autres colonnes...

  • le nom de l'auteur ;
  • l'année de parution
  • la maison d'édition

... qui me semblent être aussi des critères de recherche...

Si cela était (déjà) le cas, ce serait sympa de le signaler...

A+

Bonjour à tous,

Je tiens à remercier ThauThème pour le boulot (énorme) qu'il a fait et que je ne pensais même pas possible .

La boite de dialogue est pile poil ce que je recherchais.

Pour répondre à Curulis57 : Pour ce qui est des colonnes supplémentaires, les mot-clés entrés par l'utilisateur seront cherchés dans toute la feuille excel, ainsi l'ajout de colonnes ne devrait pas poser de problèmes (je dis sa car dans le code VBA je n'ai pas trouvé l'endroit qui définit la zone de recherche de mot-clés, j'imagine donc qu'il ira les chercher dans toute la feuille active).

Il y a une ligne : "TV = O.Range("A1").CurrentRegion" qui définit la zone de Tableau de Valeurs, il y a bien marqué "A1" mais la recherche s'effectue correctement dans toute feuille . C'est une simple déduction, je ne mettrais pas ma main à couper là dessus.

Concernant le UserForm, lorsque je l'ai exporté sur une autre document Excel, il se lance sans problème (avec le double clic), la fenetre de dialogue apparait et jusque là tous va bien.

En revanche dès que je rentre un (ou plusieurs) mot-clés il me marque un message d'erreur qui est le suivant:

"Erreur d'excution '13': Incompatibilité de type", je clic donc sur débogage et excel m'affiche une ligne de code surligné en jaune :

"Me.ListBox1.List = Application.Transpose(TL) ' alimente la Listbox1 avec le tableau TL transposé"

Avec mes petites mimines, j'ai recherché la source de l'erreur avec mon bon ami Google et il se trouve qu'une personne à résoulu un problème similaire en changant les formats de cellule au format texte. (Mes cellules sont au format standard).Je pense que le problème viens de là mais pas sûr.

Je continue de chercher ^^

Bonjour le fil, bonjour le forum,

• As-tu bien copié les trois lignes ci-dessous au tout début du composant UserForm1, avant l'initialisation ?

Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private Sauf As String 'déclare la variable Sauf

• Normalement, rien ne se passe quand tu rentres les mots-clé mais seulement au clic dans la bouton Rechercher.

Malheureusement, sans ton fichier on va avoir du mal à trouver la solution.

oui c'est trois lignes sont bien au début de UserFrom1, la fenetre de dialogue s'affiche, je peux rentrer les mots-clés mais c'est quand j'appuie sur le bouton rechercher que le message d'erreur s'affiche.

Concernant la ligne

TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV

Es-ce que je dois changer ce "A1" pour l'adapter à ma feuille ou pas ?

PS : Je travaille sur un sujet a caractère confidentiel donc se sera compliqué de le mettre en ligne publiquement mais je vais voir ce que je peux faire, peut etre qu'en supprimant quelques données sa passe.

Re,

Range("A1").CurrentRegion signifie l'ensemble des cellules adjacentes commençant en A1. Cela permet de récupérer rapidement simplement un tableau n'ayant aucune ligne entièrement vide ni aucune colonne entièrement vide séparant le tableau. Même si il peux y avoir des cellules non vide dans celui-ci.

Alors, en effet, si ton tableau ne commence pas en A1 il faut modifier cette ligne.

Peux-tu me donner l'adresse de la plage de tes données actuellement ? je te confirmerai le code à modifier.


Re,

Quant aux données confidentielles... Rien ne t'empêche de créer un fichier bidon mais correspondant à l'original !... D'ailleurs c'est ce que tu as fait pour ta pièce jointe non ?!... Ça ne me dérange pas de me décarcasser pour quelqu'un mais ce genre d'argument me met hors de moi !...

Re,

Je vous met un lien c-joint qui vous permettra d'accéder au vrai document et je l'espère vous comprendrez le problème.

Cordialement,

Louis.

PS: La colonne réponse est vide c'est normale c'est de la d'ou vient le caractère confidentiel du document mais normallement il y a du texte.

Re,

Le dernier exemple n'a rien a voir avec le premier. La méthode utilisée a une limite au niveau du texte et ton dernier fichier comporte des plans que je n'avais pas prévu. J'ai réussi a faire fonctionner le code en limitant à 5 le nombre de colonnes de la ListBox1 ainsi que celles des tableaux TL et TS, mais il m'affichent les lignes identiques masquées par le plan.

Désolé Louis, mais je n'ai pas le courage de tout revoir...

Ok, je te remercie du temps que tu as passé sur mon fichier, la solution est donc plus complexe que prévue.J'aurai peut etre dû te passer le fichier plus tôt.

Je vais voir ce que je peux faire, si quelqu'un d'autre à une idée de solution je suis preneur.

J'ai pensé à un autre moyen d'arriver à mes fins sans passer par une boite de dialogue mais par une macro plus simple.

J'ai le code en francais mais je n'arrive pas à la traduire sous VBA.

Il faudrait un bouton (cmdbutton) avec un code disant :

Pour toutes les lignes de "Sheet 2" ou la colonne H vaut 1, afficher cette ligne dans "Sheet 1" a partir de la ligne 5.

Par exemple si il y a dans la cellule H12 et H62 un "1" 'dans Sheet2'

Il m'affichera la ligne 12 ( de Sheet 2) sur la ligne 5 (de Sheet1),

il m'afichera égallement la ligne 62 (de Sheet 2) sur la ligne 6 (de Sheet1)

Ou en plus clair, les lignes de Sheet 2 qui valent "1" dans la colonnes H seront copier dans Sheet 1 en commençant par la ligne 5.

je pense avoir été assez précis, mais il y a peut etre des subtilités que je ne vois pas

A bon entendeur ,

PS: j'ai tenté le code

Sub test()
Dim ligneF As Long
ligneF  = 5
Set S = Worksheets "Pres"
Pres.Name = "Pres"
For Each ligne In Worksheets("Lettres de suivi ASN RP 2016").Range("2:65535").Rows
If Row.Cells(H:).Value = <> "1" Then
Rows("H=1").select.Copy 
    ligne.Copy Destination:= Sheet("Pres").Rows(ligneF).Rows(5)
ligneF = ligneF + 1
End If

End Sub

et à ma grande surprise *rires nerveux* cela ne marche pas...

Eventuellement quelqu'un pour corriger ma syntaxe ?

Rechercher des sujets similaires à "creer macro recherche"