Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] recherche selective

25 réponses
Avatar
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 ?

10 réponses

1 2 3
Avatar
Jacquouille
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 ?


Avatar
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
Avatar
JB
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 ?


Avatar
JB
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 ?


Avatar
Jacquouille
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" a écrit dans le message de news:

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



Avatar
AV
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

Avatar
Modeste
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)))

Avatar
Modeste
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)))

Avatar
Jacquouille
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" a écrit dans le message de news:
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




Avatar
Jacquouille
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" a écrit dans le message de news:
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)))





1 2 3