Macro recherche sur excel

vadelacaisse

Nouveau membre
Bonjour

J'ai lu le sujet pourtant vaste sur ce thème et cela ne marche pas
J'ai un champ (A3:K2000) et je souhaite afficher seulement les lignes dont une cellule contient un mot saisi en D1.
Je lance la macro : il se passe des choses mais affichage non modifié...
J'ai réussi à faire la macro pour tout réafficher... C'est déjà cela :D
Inutile de préciser qu'en VBA je suis au niveau CP
J'ai fait pas mal d'essais dont certains sont en commentaires

Merci d'une aide compréhensible par un béotien

[cpp]
Dim plage As Range
Dim Cell As Range
Set plage = Range("A3:K2000") '.End(xlUp)
'Set plage = Range("A3:K" & Range("k2000").End(xlUp).Row)
'Set plage = Range(Cells(3, 1), Cells(2000, 11).End(xlUp).Row)
'Application.ScreenUpdating = False
'Rows.Hidden = True
For Each Cell In plage
If InStr(LCase(Cell.Text), LCase("D1")) Then
'If InStr(Cells.Text, Range("Location").Text) Then
Cell.EntireRow.Hidden = False
End If
Next
'Application.ScreenUpdating = True
End Sub
[/cpp]
 

vadelacaisse

Nouveau membre
Merci de ta réponse rapide : j'ai enlevé les guillemets que j'avais du mettre pour rechercher sur le mot "location" à l'origine
Maintenant, l'affichage clignote (normal : screenupdating en rem) et j'ai limité le champ à 200 au lieu de 2000 pour tester
Mais en fin de macro, aucun changement (toutes les lignes restent visibles)
J'ai essayé avec une ligne comportant une cellule contenant seulement le mot saisi en D1 (location) : pareil. Le fait que le mot soit seul ou noyé parmis d'autres n'est donc pas un problème
As-tu une explication / solution ?
 

vadelacaisse

Nouveau membre
Re bonjour
J'ai pensé qu'il fallait peut-être masquer toutes les lignes en début de macro puis que celle-ci les ferait réaparraitre selon si le mot saisi en D1 est dans la ligne
La ligne en bleu fonctionne (testée seule) : selon conseil dans le sujet, j'ai été voir F1 pour l'écrire
Mais l'affichage final est toujours complet...

[cpp]
Dim plage As Range
Dim Cell As Range
Set plage = Range("A3:K200") '.End(xlUp)
'Set plage = Range("A3:K" & Range("k2000").End(xlUp).Row)
'Set plage = Range(Cells(3, 1), Cells(2000, 11).End(xlUp).Row)
'Application.ScreenUpdating = False
Rows("3:200").Hidden = True
For Each Cell In plage
If InStr(LCase(Cell.Text), LCase(D1)) Then
'If InStr(Cells.Text, Range("Location").Text) Then
Cell.EntireRow.Hidden = False
End If
Next
'Application.ScreenUpdating = True
End Sub
[/cpp]
 

vadelacaisse

Nouveau membre
A force de tatonner, j'ai trouvé - toujours grace à F1
La ligne 9 ci-dessous fonctionne

[cpp]If InStr(LCase(Cell.Text), LCase(Cells(1, 4))) Then[/cpp]

Un très grand merci à tous et à Zeb !

J'ai trouvé parfois un peu raide les réponses du style "cherches un peu..." car quand on débute vraiment, diffcile de savoir où ! Mais bon j'ai cherché et j'ai eu du bol
J'ai parcouru qq rubriques de F1 : certaines sont en chinois pour moi
Je regrette beaucoup Lotus 123 où je pouvais transcrire directement mes macros

J'ai un autre besoin mais que je ne sais pas encore écrire en "Lotus 123" : dater toute nouvelle ligne insérée et pouvoir afficher à la demande celles postérieures à une date. But chque utilsateyure pourra affciher les nouvelles entrées
 

zeb

Modérateur
Salut Vadelacaisse,

Je réponds systématiquement "cherche un peu". Mais je suis les évolutions de ceux qui s'en donnent la peine, et je donne souvent des conseils, voire des solutions complètes, pourvu qu'on ne me donne pas l'impression de vouloir me faire faire son boulot ;)

Dans ton cas, je n'ai pas eu le temps de suivre :lol: T'es trop rapide. ;)
 

zeb

Modérateur
Un petit truc m'embête. Si tu trouves une raison de masquer ta ligne, tu continues quand même à fouiller cette ligne !
Je t'invite donc à étudier ce petit bout de code.
Code:
'// Définir toutes les variables en Range
Set ligne_1er = Rows(3)
Set ligne_der = Range("K2000").End(xlUp).EntireRow
Set colonnes  = Range("A:K")
Set lignes    = Range(ligne_1er, ligne_der)
Set plage     = Intersect(lignes, colonnes)

For Each row In plage.Rows
	For Each cel In row
		If InStr(LCase(cel.Text), LCase(Range("D1").Text)) Then
			row.Hidden = True
			Exit For
		End If
	Next
Next

Que je condense ainsi :
Code:
For Each row In Intersect(Range("A3", Range("K2000").End(xlUp)), Range("A:K")).Rows
...
 

vadelacaisse

Nouveau membre
Bonjour

Là, j'ai décroché :??:

Ci-dessous la macro qui marche
J'ai ajouté ce matin le masquage préalable de toutes les lignes, car je ne voyais pas comment la boucle pouvait les afficher sélectivement sans cela
On pourrait peut-être fonctionner à l'envers : ne rien masquer au début puis faire la boucle pour masquer les lignes ne contenant pas le mot

Si tu as un truc plus rapide, je veux bien car avec 1400 lignes cela prend qq secondes tout de même
En tout cas, cela focntionne ainsi - c'est top

[cpp]
Sub Rechercher_et_afficher_résultat()
'
' Masquage des lignes ne contenant pas le mot cherché
' Macro enregistrée le 16/05/2011 par VLD
'


Dim plage As Range
Dim Cell As Range
Application.ScreenUpdating = False
'gèle l'affichage pour gagner du temps
Set plage = Range("A3:K2000")
'définit le champ de recherche
Rows("3:2000").Hidden = True
'commence par cacher toutes les lignes
For Each Cell In plage
If InStr(LCase(Cell.Text), LCase(Cells(1, 4))) Then
'Regarde si chaque cellule contient le mot saisi en D1
Cell.EntireRow.Hidden = False
'Supprime le masquage de la ligne correspondante
End If
Next
'passe à la ligne suivante
Application.ScreenUpdating = True
'rétablit l'affichage normal
End Sub
[/cpp]
 

zeb

Modérateur
Je vois que tu ne tiens pas compte de mes remarques. C'est ton droit. Mais si tu veux continuer à recevoir de l'aide je t'invite soit à en tenir compte dans ton code, soit à justifier ton refus.
 

vadelacaisse

Nouveau membre
J'ai décroché = pas compris comment utiliser ton code abrégé
j'ai essayé pourtant
Ce n'est donc pas mon droit mais mon niveau VBA
 

zeb

Modérateur
A étudier à la lumière des éléments donnés précédemment :
Code:
Dim row As Range
Dim cel As Range
For Each row In Intersect(Range("A3", Range("K2000" ).End(xlUp)), Range("A:K" )).Rows
    For Each cel In row
        If InStr(LCase(cel.Text), LCase(Range("D1" ).Text)) Then
            row.Hidden = True
            Exit For
        End If
    Next
Next
 

vadelacaisse

Nouveau membre
J'ai fait pas mal d'essais avec cela - de la bidouille...
"Cel" au lieu de "Cell" c'était exprès ?
J'ai aussi remplacé True par False, car il faut montrer la ligne si elle contient D1 (que j'ai aussi modifié en (Cells(1, 4)

Mais cela ne marche pas

[cpp]
Dim Row As Range
Dim Cell As Range
'Rows("3:2000").Hidden = True
For Each Row In Intersect(Range("A3", Range("K2000").End(xlUp)), Range("A:K")).Rows
For Each Cell In Row
If InStr(LCase(Cell.Text), LCase(Cells(1, 4))) Then
Row.Hidden = False
Exit For
End If
Next
Next
End Sub
[/cpp]
 

zeb

Modérateur
Oups, s'kuz, il manquait les déclarations de variables. J'ai édité mon post. Mais je nomme mes variables comme je veux, exprès pour t'embrouiller :o
(En fait, non, c'est un C/C de mes tests de mon côté ;) )

Si tu préfères Cells(1, 4) à Range("D1"), ce n'est pas un problème pour moi. Mais si tu me retires systématiquement le .Text que je mets derrière, on va plus être copain :fou:

Je ne cache pas d'office toutes les lignes, pour ensuite montrer celle qui sont intéressantes - mais j'ai effectivement inversé la logique.

Le code devient :
Code:
If Not InStr(LCase(Cell.Text), LCase(Cells(1, 4).Text)) Then
    Row.Hidden = False
    Exit For
End If
 

vadelacaisse

Nouveau membre
Sans rancune - il m'arrive d'être bourru aussi
Le débutant que je suis a bien du mal tout de même
Voici le nouveau code
Je pense qu'il y a encore un pb de logique : si la ligne ne contient pas (If Not), il faut la masquer donc Row.Hidden = True et non False à mon avis

Ceci étant j'ai essayé les deux solutions : rien ne se passe : la boucle ne fonctionne pas...

[cpp]
Dim Row As Range
Dim Cell As Range
'Rows("3:2000").Hidden = True
For Each Row In Intersect(Range("A3", Range("K2000").End(xlUp)), Range("A:K")).Rows
For Each Cell In Row
If Not InStr(LCase(Cell.Text), LCase(Cells(1, 4).Text)) Then
'Row.Hidden = False
Row.Hidden = True
Exit For
End If
Next
Next
End Sub
[/cpp]
 

zeb

Modérateur
Ben faut déboguer. Proposition de lecture :

-------------

En relisant le code, je me dis qu'avec toutes ces inversions de logiques et ces négations de négation, on a tout mélangé.

Code:
Dim Row       As Range
Dim Cell      As Range
Dim zone      As Range
Dim a_trouver As String
Dim trouve    As boolean

Set zone = Intersect(Range("A3", Range("K2000" ).End(xlUp)), Range("A:K" ))
a_trouver = LCase(Cells(1, 4).Text)

' // Masquage des lignes ne contenant pas le mot cherché

For Each Row In Zone.Rows
    trouve = False ' // On n'a pas encore trouvé
    For Each Cell In Row        
        If InStr(LCase(Cell.Text), a_trouver) Then
            MsgBox "Trouvé dans la cellule " & Cell.Address(0, 0)
            trouve = True
            Exit For
        End If
    Next
    Row.Hidden = trouve
Next
End Sub
 

vadelacaisse

Nouveau membre
La ligne 7 provoque une errreur de compilation (fin d'instruction demandée...) et je ne sais pas résoudre
Ton code semble supposer une seule occurence (msgbox...)
En fait il y en a presque toujours plusieurs et je souhaite n'afficher que les lignes contenant le mot cherché : msgbox inutile donc car l'utilisateur parcourt alors les lignes affichées
 

zeb

Modérateur
La ligne 7 provoque une errreur de compilation (fin d'instruction demandée...) et je ne sais pas résoudre
Compte les parenthèses ouvrantes et fermantes. Et corrige par toi-même ;) --- Rho, s'fait pas chier le zeb !!

Ton code semble supposer une seule occurence (msgbox...)
[strike]Ménonskeutékon[/strike] hum, hum... [:patch]
Pas du tout. Il s'agit de code rajouté pour les besoins du débogage. T'as lu le topic que je te proposais ? Dès que le bout de code est ok, on vire les MsgBox.

Tache d'avoir les n cas qui t'intéressent dans les n premières lignes ;)
 

vadelacaisse

Nouveau membre
Je viens de lire ton tutorial : ok pour msg box mais j'ai pas tout compris
Parenthèses : j'avais déjà compté avant, quand même !
J'ai recompté et leur nombre est OK - leur disposition me semble aussi correcte
donc après réexamen, je ne vois pas le bug
 

zeb

Modérateur
Gné ???? M'enfin, ça marche chez moi (Excel 2002 SP3)

Décortique chaque morceau :
Code:
Dim a, b, c, d, e, f

Set a = Range("A3")
MsgBox a.Address

Set b = Range("K2000")
MsgBox b.Address

Set c = b.End(xlUp)
MsgBox c.Address

Set d = Range(a, c)
MsgBox d.Address

Set e = Range("A:K")
MsgBox e.Address

Set f = Intersect(d, e)
MsgBox f.Address

Alors ?
 

vadelacaisse

Nouveau membre
Voilà ce que j'ai saisi (extrait). Correct ?

[cpp]
'Dim zone = Intersect(Range("A3", Range("K2000" ).End(xlUp)), Range("A:K" ))
'Dim a, b, c, d, e, f
Dim a As Range
Dim b As Range
Dim c As Range
Dim d As Range
Dim e As Range
Dim f As Range
Set a = Range("A3")
MsgBox a.Address
Set b = Range("K2000")
MsgBox b.Address
Set c = b.End(xlUp)
MsgBox c.Address
Set d = Range(a, c)
MsgBox d.Address
Set e = Range("A:K")
MsgBox e.Address
Set f = Intersect(d, e)
MsgBox f.Address
a_trouver = LCase(Cells(1, 4).Text)

' // Masquage des lignes ne contenant pas le mot cherché

For Each Row In zone.Rows
trouve = False ' // On n'a pas encore trouvé
For Each Cell In Row
[/cpp]

Les 6 msgbox se suivent : la première donne $A$3
Cela se termine avec ce msg :
Variable objet ou variable bloc With non définie (erreur 91)

j'ai des scrupules à continuer alors que la mauvaise macro marche tout de même !
Ne te crois pas obligé de persévérer davantage
Merci
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 162
Messages
6 718 639
Membres
1 586 458
Dernier membre
Alex932
Partager cette page
Haut