[VBA] recherche selective

Le
penelope
Bnojour

Voici mon probleme

je dois rechercher sur une feuille la premiere cellule dans laquelle
le contenu est une chaine de caracteres de longueur égale à 9 ET dont
le premier caratere est un 6.
le souci est que la feuille est chargée : plus de 26 000 lignes et une
quinzaine de colonnes

j'ai donc fait une macro qui tourne - (à base de if, d'offset,),
mais j'ai le temps d'aller boire un café, de faire un tennis, et de
prendre une douche avant d'obtenir un resultat

j'avais pensé a utiliser le find mais je coince pour passer les
arguments de recherche

Auriez vous un petite idée ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jacquouille
Le #4447761
Bonjour Pénélope,

Voici ce que j'ai trouvé, sans offset
---------------
Sub atteindre()
For Each c In Range("playa")
If Left(c, 1) = 6 Then
If Len(c) = 9 Then
c.Interior.ColorIndex = 3
End If
End If
Next
End Sub
--------------------------
Ceci dit, perso je continuerais à prendre une douche après le tennis.....-)
Si problème, la porte est ouverte.
--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

<penelope> a écrit dans le message de news:

Bnojour

Voici mon probleme

je dois rechercher sur une feuille la premiere cellule dans laquelle
le contenu est une chaine de caracteres de longueur égale à 9 ET dont
le premier caratere est un 6.
le souci est que la feuille est chargée : plus de 26 000 lignes et une
quinzaine de colonnes

j'ai donc fait une macro qui tourne - (à base de if, d'offset,...),
mais j'ai le temps d'aller boire un café, de faire un tennis, et de
prendre une douche avant d'obtenir un resultat

j'avais pensé a utiliser le find mais je coince pour passer les
arguments de recherche

Auriez vous un petite idée ?


AV
Le #4447731
Avec une plage (A2:A26001) nommée "tablo"

Si l'occurence cherchée se trouve dans les premiers milliers de lignes une
boucle (avec un exit for) se révèlera assez rapide :

For Each c In [tablo]
If Left(c, 1) = "6" And Len(c) = 9 Then c.Select: c.Select: Exit For
Next

Par contre si elle a des chances de se trouver en queue de peloton, une
matricielle "passée par la fonction Evaluate" peut s'avérer judicieuse :

x =
Evaluate("address(min(if((len(tablo)=9)*(mid(tablo,1,1)=""6""),row(tablo))),min(if((len(tablo)=9)*(mid(tablo,1,1)=""6"")*(row(tablo)=min(if((len(tablo)=9)*(mid(tablo,1,1)=""6""),row(tablo)))),column(tablo))))")
Range(x).Select

Attention : l'instruction x=.... est sur une seule ligne

PS : On pourrait utiliser la formule matricielle sur une feuille pour renvoyer
l'adresse recherchée mais compte tenu du nombre de cellules dans la plage à
parcourir, mieux vaut s'en abstenir (long temps de calcul/recalcul)

AV
JB
Le #4447721
Bonjour,


Sub Macro2() ' 8 sec pour 10 colonnes
t = Timer
Set champ = [A:J]
champ.Interior.ColorIndex = xlNone
For Each c In champ
If Len(c) = 9 And Left(c, 1) = "6" Then
c.Interior.ColorIndex = 3
End If
Next c
MsgBox Timer() - t
End Sub

Si le nombre de cellules contenant 6 est faible:

Sub Macro1() ' 1,35 s pour 10 colonnes
t = Timer
Set champ = [A:J]
champ.Interior.ColorIndex = xlNone
Set c = champ.Find(What:="6", LookIn:=xlValues, LookAt:=xlPart)
If Not c Is Nothing Then
premier = c.Address
Do
If Len(c) = 9 And Left(c, 1) = "6" Then
c.Interior.ColorIndex = 3
End If
Set c = champ.FindNext(c)
Loop While Not c Is Nothing And c.Address <> premier
End If
MsgBox Timer() - t
End Sub

Cordialement JB


On 14 avr, 08:03, penelope wrote:
Bnojour

Voici mon probleme

je dois rechercher sur une feuille la premiere cellule dans laquelle
le contenu est une chaine de caracteres de longueur égale à 9 ET dont
le premier caratere est un 6.
le souci est que la feuille est chargée : plus de 26 000 lignes et une
quinzaine de colonnes

j'ai donc fait une macro qui tourne - (à base de if, d'offset,...),
mais j'ai le temps d'aller boire un café, de faire un tennis, et de
prendre une douche avant d'obtenir un resultat

j'avais pensé a utiliser le find mais je coince pour passer les
arguments de recherche

Auriez vous un petite idée ?


JB
Le #4447681
Pour 10 colonnes 0,26 sec

Sub macro3()
t = Timer()
temp = [A1].CurrentRegion
For i = 1 To UBound(temp, 1)
For j = 1 To UBound(temp, 2)
If Len(temp(i, j)) = 9 Then
If Left(temp(i, j), 1) = "6" Then
Cells(i, j).Interior.ColorIndex = 3
End If
End If
Next j
Next i
MsgBox Timer() - t
End Sub

JB

On 14 avr, 08:03, penelope wrote:
Bnojour

Voici mon probleme

je dois rechercher sur une feuille la premiere cellule dans laquelle
le contenu est une chaine de caracteres de longueur égale à 9 ET dont
le premier caratere est un 6.
le souci est que la feuille est chargée : plus de 26 000 lignes et une
quinzaine de colonnes

j'ai donc fait une macro qui tourne - (à base de if, d'offset,...),
mais j'ai le temps d'aller boire un café, de faire un tennis, et de
prendre une douche avant d'obtenir un resultat

j'avais pensé a utiliser le find mais je coince pour passer les
arguments de recherche

Auriez vous un petite idée ?


Jacquouille
Le #4447671
Salut Président
Deuyx petites questions.....
Pourquoi ce "6" ? (dans If Left(c, 1) = "6" ). Perso, j'ai fait des cel
6aaaa et il me fait la recherche avec If Left(c, 1) = 6
Deuxio:
Quel est le sens de balayage des l aplage?
Analyse-t-il la ligne 1 complète, puis la 2 ... ou balaye-t-il la colonne A,
puis l'abbé?
Ceci, afin de comprendre la pertinence de ta remarque concernant la queue de
peloton.
Un bien grand merci et surtout un bon WE bien pastissé.

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"AV"
Avec une plage (A2:A26001) nommée "tablo"

Si l'occurence cherchée se trouve dans les premiers milliers de lignes une
boucle (avec un exit for) se révèlera assez rapide :

For Each c In [tablo]
If Left(c, 1) = "6" And Len(c) = 9 Then c.Select: c.Select: Exit For
Next

Par contre si elle a des chances de se trouver en queue de peloton, une
matricielle "passée par la fonction Evaluate" peut s'avérer judicieuse :

x =
Evaluate("address(min(if((len(tablo)=9)*(mid(tablo,1,1)=""6""),row(tablo))),min(if((len(tablo)=9)*(mid(tablo,1,1)=""6"")*(row(tablo)=min(if((len(tablo)=9)*(mid(tablo,1,1)=""6""),row(tablo)))),column(tablo))))")
Range(x).Select

Attention : l'instruction x=.... est sur une seule ligne

PS : On pourrait utiliser la formule matricielle sur une feuille pour
renvoyer l'adresse recherchée mais compte tenu du nombre de cellules dans
la plage à parcourir, mieux vaut s'en abstenir (long temps de
calcul/recalcul)

AV



AV
Le #4447651
Pourquoi ce "6" ? (dans If Left(c, 1) = "6" ).


Dans le cas présent (vba) c'est superfétatoire mais, d'une façon générale, les
fonctions texte renvoyant une valeur alphanumérique (et non numérique), cette
précaution n'est pas inutile
Exemple dans la feuille de calcul avec en A1 la valeur numérique 654312
=gauche(A1;1)=6
renvoie FAUX
alors que
=gauche(A1;1)="6"
renvoie VRAi (réponse attendue)

Quel est le sens de balayage des l aplage?


ligne puis colonne
A1 > B1 > C1......
A2 > B2 .....

AV

Modeste
Le #4447611
Bonsour® penelope avec ferveur ;o))) vous nous disiez :

Bnojour

Voici mon probleme

je dois rechercher sur une feuille la premiere cellule dans laquelle
le contenu est une chaine de caracteres de longueur égale à 9 ET dont
le premier caratere est un 6.
le souci est que la feuille est chargée : plus de 26 000 lignes et une
quinzaine de colonnes


testé sur une plage de 419986 valeurs : numérique, texte, vide (30000 lignes 15
colonnes)
moins de 2 secondes pour trouver en : $K$29942

Sub recherche_en_colonne()
zz = Now
Range("A1").Select
Set xx = Cells.Find(What:="6????????", After:¬tiveCell, LookIn:=xlValues,
_
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
MsgBox "trouvé : " & xx.Value & Chr(10) & " en : " & xx.Address() &
Chr(10) & "durée :" & Format(Now - zz, "ss.000")
End Sub

Sub recherche_en_ligne()
zz = Now
Range("A1").Select
Set xx = Cells.Find(What:="6????????", After:¬tiveCell, LookIn:=xlValues,
_
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
MsgBox "trouvé : " & xx.Value & Chr(10) & " en : " & xx.Address() &
Chr(10) & "durée :" & Format(Now - zz, "ss.000")
End Sub


--
--
@+
;o)))

Modeste
Le #4447531
Bonsour® Modeste avec ferveur ;o))) vous nous disiez :

testé sur une plage de 419986 valeurs : numérique, texte, vide (30000 lignes
15
colonnes)
moins de 2 secondes pour trouver en : $K$29942


;o))) le même en plus clean

Sub recherche_en_colonne()
zz = Now
Range("A1").Select
Set xx = Cells.Find(What:="6????????", After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
If xx Is Nothing Then
MsgBox " rien trouvé"
Else
xx.Select
MsgBox "trouvé : " & xx.Value _
& Chr(10) & " en : " & xx.Address() _
& Chr(10) & "durée :" & Format(Now - zz, "ss.000")
End If
Range("A6").Select

End Sub
Sub recherche_en_ligne()
zz = Now
Range("A1").Select
Set xx = Cells.Find(What:="6????????", After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
If xx Is Nothing Then
MsgBox " rien trouvé"
Else
xx.Select
MsgBox "trouvé : " & xx.Value _
& Chr(10) & " en : " & xx.Address() _
& Chr(10) & "durée :" & Format(Now - zz, "ss.000")
End If
Range("A6").Select

End Sub

--
--
@+
;o)))

Jacquouille
Le #4447381
Un tout grand merci
Jacques.

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"AV" e$

Pourquoi ce "6" ? (dans If Left(c, 1) = "6" ).


Dans le cas présent (vba) c'est superfétatoire mais, d'une façon générale,
les fonctions texte renvoyant une valeur alphanumérique (et non
numérique), cette précaution n'est pas inutile
Exemple dans la feuille de calcul avec en A1 la valeur numérique 654312
=gauche(A1;1)=6
renvoie FAUX
alors que
=gauche(A1;1)="6"
renvoie VRAi (réponse attendue)

Quel est le sens de balayage des l aplage?


ligne puis colonne
A1 > B1 > C1......
A2 > B2 .....

AV




Jacquouille
Le #4447361
Pfffft
2 sec, c'est vraiment un tout petit tennis. -)

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"Modeste" e$
Bonsour® Modeste avec ferveur ;o))) vous nous disiez :

testé sur une plage de 419986 valeurs : numérique, texte, vide (30000
lignes 15
colonnes)
moins de 2 secondes pour trouver en : $K$29942


;o))) le même en plus clean

Sub recherche_en_colonne()
zz = Now
Range("A1").Select
Set xx = Cells.Find(What:="6????????", After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
If xx Is Nothing Then
MsgBox " rien trouvé"
Else
xx.Select
MsgBox "trouvé : " & xx.Value _
& Chr(10) & " en : " & xx.Address() _
& Chr(10) & "durée :" & Format(Now - zz, "ss.000")
End If
Range("A6").Select

End Sub
Sub recherche_en_ligne()
zz = Now
Range("A1").Select
Set xx = Cells.Find(What:="6????????", After:¬tiveCell, _
LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:úlse, SearchFormat:úlse)
If xx Is Nothing Then
MsgBox " rien trouvé"
Else
xx.Select
MsgBox "trouvé : " & xx.Value _
& Chr(10) & " en : " & xx.Address() _
& Chr(10) & "durée :" & Format(Now - zz, "ss.000")
End If
Range("A6").Select

End Sub

--
--
@+
;o)))





Publicité
Poster une réponse
Anonyme