Macro recherche sur excel

j-lou

Nouveau membre
Bonjour à tous,

j'aimerai faire une macro qui fasse office de fonction recherche comme ctrl+F sur la 1ere colonne de la feuille.
En fouillant le net j'ai trouvé cette méthode:

Code:
Sub test()
Dim I     As Long
Dim Plage As Range
Set Plage = Range("A2:A" & Range("A2").End(xlDown).Row)

For I = Plage.Cells.Count To 1 Step -1

    If Plage.Cells(I).Text <> Range("B1").Text Then
    Plage.Cells(I).EntireRow.Hidden = True
    End If
    
    Next
End Sub

cela me permet de masquer les lignes de la 1ere colonne ne contenant pas le mot-clef présent en B1, mais j'ai plusieurs problèmes:
-si aucune des cellules de la 1ere colone ne contient le mot clef, elles sont toutes masquer, or j'aimerai qu'elles restent affichées dans ce cas précis et qu'il soit préciser que le mot clef n'est pas présent.
-j'aimerai que la macro ne prenne pas en compte que les cellules contenant exactement le mot présent en B1 mais également des variantes ex :mot-ckef= "page" ==> laisser afficher les cellules contenant " maison page arbre" .
-et dernier problème, je souhaiterai faire en sorte que l'utilisateur puisse faire une nouvelle recherche, et donc réafficher les lignes masquées avant de reéxécuter la macro.

Merci de me donner quelques tuyaux :)
 

zeb

Modérateur
Utilise InStr dans ta condition pour savoir si tel mot est présent, parmi d'autres.

Au démarrage de ta macro, tu fais [fixed]Cells.Hidden = False[/fixed]
 

Freeman23

Expert
Petite remarque sur cette méthode :

[cpp]Set Plage = Range("A2:A" & Range("A2" ).End(xlDown).Row)
[/cpp]

Il faut vraiment faire attention quand on utilise cette fonction, car si dans ta colonne tu as un enregistrement vide, elle déterminera cette position alors que tu peux avoir d'autres enregistrements dessous. Donc il faut soit :

- être certains qu'il n'y a jamais de blanc dans la colonne (clé primaire de ta base)
- Faire l'inverse c'est à dire te placer sur la dernière case de la colonne A65536 et remonter.

Code:
Range("A65536").select
Set Plage = Range("A2:A" & selection.End(xlUp).Row)
 

zeb

Modérateur
Argh, quelle horreur !
Comment conseiller une chose pareille ?
N'as-tu aucun respect pour ce pauvre malheureux ?

NE JAMAIS FAIRE DE SELECT INUTILE !!!!

L'idée de Freeman reste bonne. Deux versions améliorées pour définir une plage :
Code:
Set Plage = Range("A2:A" & Range("A65536").End(xlUp).Row)
Code:
Set Plage = Range(Cells(2, 1), Cells(65535, 1).End(xlUp))
 

Freeman23

Expert
Si tu pouvais me dire ce qui te gène dans le select :heink:

J'aimerai savoir tu as éveillé ma curiosité.
 

zeb

Modérateur
Alors pour commencer, je le signale dans 80% des sujets sur VBA, donc ne te sens pas visé personnellement
Un petit florilège de Zeb vs Select :lol: :

http://www.presence-pc.com/forum/ppc/Programmation/macros-imprimer-partir-date-sujet-3849-1.htm#t24998

http://www.presence-pc.com/forum/ppc/Programmation/debutant-excel-selectionner-copier-coller-sujet-3826-1.htm#t24790

http://www.presence-pc.com/forum/ppc/Programmation/existence-feuillet-sujet-4342-1.htm#t28168

http://www.presence-pc.com/forum/ppc/Programmation/copier-feuille-evenements-sujet-4309-1.htm#t27929

http://www.presence-pc.com/forum/ppc/Programmation/chemin-acces-macro-excel-sujet-3946-1.htm#t25602

Exemple bête, tiré de l'enregistreur de macro:
[fixed]Range("A1").Select
ActiveCell.Formula = "blabla"[/fixed]

En plus condensé :
[fixed]Range("A1").Formula = "blabla"[/fixed]

Wha! Trop fort! Euh, zeb tu te fous de nous ? :(



:sol: Eh, eh. Mais non ;)

Maintenant, la version 1, tu me la mets dans une boucle et tu parcours l'ensemble des cellules d'une feuille :
Code:
Dim c As Range
For Each c In Cells
    c.Value = "X"
Next
Tu as 10 mns à perdre ?

Bon et là :
Code:
Dim c As Range
For Each c In Cells
    c.Select
    ActiveCell.Value = "X"
Next
Tu n'avais pas une demi-journée à perdre ?!
Bon, maintenant tu me mets une formule bien compliquée à la place de X .....

L'explication est simple : A chaque fois que tu te déplaces dans une application sous Windows, le système exige de l'application qu'elle recalcule la zone à afficher. Sous Excel, les calculs pour une cellule peuvent selbler simples mais si tu te balades dans la feuille, qui plus est de la première à la dernière ligne, tu peux obtenir des lags très importants.

Par principe, ne pas faire de SELECT, sauf pour sélectionner [:spamafote] et ce, uniquement pour des problèmes de perf.

Excel est un brave tableur, tellement plein de bonnes intentions que beaucoup s'en servent comme base de données ou comme studio de développement ! Ce n'est pas sa vocation. Mais avec un peu d'astuce on peut être très exigeant avec lui.
 

j-lou

Nouveau membre
Merci à vous pour tous ces bons conseils.
Voila le code final :

Code:
Sub test()
Dim I     As Long
Dim Plage As Range
Set Plage = Range("A2:A" & Range("A65536").End(xlUp).Row)

For I = Plage.Cells.Count To 1 Step -1
Plage.Cells(I).EntireRow.Hidden = True
    If InStr(Plage.Cells(I).Text, Range("B1").Text) Then
    Plage.Cells(I).EntireRow.Hidden = False
    End If
    
    Next
End Sub
 

Freeman23

Expert
Ok va pour le select

En même temps tu peux vérouiller le rafraichissement de l'affichage pendant l'execution ce qui permet un gain de temps significatif. Mais il faut le remettre à la fin.

Code:
Application.screenupdating = 'true ou false
 

j-lou

Nouveau membre

j'allais justement en venir au problème de temps :p

Il peut y avoir 1000+ ligne parfois et dans ce cas ca prend un certain temps.

Incroyable ce forum, tu as les réponses avant même de poser les questions... que de gens compétent =)

Merci à nouveau

nouveau code :

Code:
Sub rechercher()
Application.ScreenUpdating = False

Dim I     As Long
Dim Plage As Range
Set Plage = Range("A6:A" & Range("A65536").End(xlUp).Row)

For I = Plage.Cells.Count To 1 Step -1
Plage.Cells(I).EntireRow.Hidden = True
    If InStr(Plage.Cells(I).Text, Range("F3").Text) Then
    Plage.Cells(I).EntireRow.Hidden = False
    End If
    
    Next
Application.ScreenUpdating = True

End Sub
 

zeb

Modérateur
Freeman23> +1
j-lou> PPC, c'est la classe :sol:

Donc : [strike]Select[/strike] + Application.ScreenUpdating --> Perf++
 

melato

Nouveau membre
Bonjour,

Quelqu'un pourrait-il avoir l'amabilité de me donner ce même code de recherche (CTRL F) mais sur un tableau entier (pas simplement sur la première colonne : Set Plage = Range("A6:A" & Range("A65536" ).End(xlUp).Row).

Je souhaiterais en effet masquer toutes les lignes ne faisant pas apparaître le mot (ou partie du mot) recherché, dans n'importe quelle colonne.

Merci infiniement à ceux qui porront me répondre...

 

zeb

Modérateur
Salut et bienvenue,

Regarde dans l'aide d'Excel à la page Range(). Tu y verras comment définir une plage (une zone de plusieurs colonnes) et tu comprendras mieux ce code. Si cela reste confus, je te donnerai plus d'explications, mais fais quand même l'effort de lire cette doc.
 

melato

Nouveau membre
Bonjour Ezb, merci pour ces recommandations.
Mais je n'y parviens toujours pas...j'ai pourtant modifié la plage pour tenir compte d'un tableau ) plusieurs colonnes :

6. Set Plage = Range("A6:I" & Range("I65536" ).End(xlUp).Row).

Mais la recherche continue de se faire sur la 1ère colonne seulement.
Je ne comprends pas bien ce qu'il faut modifier dans la boucle...le Step ?
HELP ME !!!!
Merci d'avance


 

zeb

Modérateur
Ah, bah je viens de relire le code proposé à j-lou et c'est normal.
Alors, en fait, je répondais à j-lou et le code proposé contenait 99% du sien.

Repartons donc de zéro.
Soit une plage de cellule :
Code:
Dim plage As Range
Set plage = Range("A1:I12")
Parcourons la plage, cellule par cellule :
Code:
Dim cell As Range
For Each cell In Plage
  ..
Next
Observons chaque cellule et cachons la ligne si besoin
Code:
If InStr(cell.Text, "mot") Then
    cell.EntireRow.Hidden = False
End If

Allez, tout ça ensemble :

Code:
Dim plage As Range
Dim cell As Range
Set plage = Range("A1:I12")
For Each cell In Plage
	If InStr(cell.Text, "mot") Then
		cell.EntireRow.Hidden = False
	End If
Next
 

melato

Nouveau membre
Merci beaucoup Zeb !
chaque étape expliquée de cette manière...ça m'aide beaucoup.

Mais j'abuserai encore de ton aide, car lors de l'exécution de la macro il me met erreur de compilation objet requis sur "set plage".
J'ai bien tenté de dégoggué, mais mes compétences en la matière restent encore faibles...
 

zeb

Modérateur
Rhoooo...

J'aurais préféré que tu me répondes : "Eh, tu t'es gouré mon pote, spa As String mais As Range."

En attendant que tu saches me répondre ce genre de choses, relis mieux mon code ;)
 

melato

Nouveau membre
Zeb,
Oh mince ! Le piège, tombée droit dedans...
Merci mon pote ! Je me rend compte en effet qu'il faut que je me plonge un peu plus dans les trucs de base, avant d'envisager de créer de nouvelles macro.
Merci encore et à bientôt.
 

zeb

Modérateur
( :/ M'enfin, ce n'était pas un piège, je me suis gouré, j'ai le droit, non :o J'ai édité mes messages pour que ce soit + facile pour tout le monde )
 

polo_32

Nouveau membre
Chers tous,
Je ne voulais pas poster sans avoir chercher un bon bout de temps !
Mais la je bloque toujours sur cette macro de recherche sur Excell depuis le début des fêtes !
En fait, mon souhait est d'avoir une macro qui me permettent les choses suivantes :
- Ouverture de message lorsque l'utilisateur clique sur le bouton recherche
- message = "entrez le nom du produit recherché"
- recherche dans plusieurs colonnes si le produit est présent avec 2 difficultés
= cherchez même si le mot fait partie d'une expression (ex= recherche = beurre, soit = rechercher les cases ou beurre apparait donc aussi les cases "beurre de tourage")
= si la recherche n'aboutis pas, mettre un message, "votre recherche n'as pas aboutie, faites votre demande de produits par @ à l'adresse : toto@titi.com en mettant la date et le sujet dans le titre du message = recherche de produit X.
= si la recherche aboutis, masquez les lignes ou la recherche n'apparait pas et ne conserver que les lignes avec le mot de recherche.
Puis permettre par un bouton à coté de celui de recherche de faire une nouvelle recherche, et donc réafficher les lignes masquées avant de reéxécuter la macro.
Voila !
Si une bonne âme arrive à me décoincer de mon problème cela serait sympa !
Je précise que je suis débutant en VB.
Merci de votre aide !
 

oozenot

Expert
Salut Polo_32,

tu aurais pu créer un sujet a part...

Pour ta macro de recherche... le coeur de la macro est au dessus.. relis bien le sujet, zeb a mis les étapes point par point.


Ensuite tu l'adapte a ton probleme :
1. pour demander a l'utilisateur ce qu'il faut rechercher, utilise la fonction Inputbox() et stocke son résultat dans une variable.
c'est cette meme variable que tu va utiliser dans la fonction INstr() qui est la fonction de recherche.

2. pour afficher des messages utilise la fonction Msgbox()
3. pour masquer les lignes : .hidden = True (ou False)
4. pour separer les opérations a faire suivant la présence ou non d'un résultat :
[cpp]IF [....] Then
[...]
else
[...]
End if[/cpp]

Voila voila .. lis bien les explications de syntaxe donnée par l'aide d'excel sur chaque fonction (F1) ca te permettra de comprendre le but et de voir comment l'utiliser, les options ...

J'attends avec impatience ton premier code....
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 055
Membres
1 586 282
Dernier membre
Yannick3553
Partager cette page
Haut