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

recherche par macro dans un tableau

13 réponses
Avatar
gilles leroy
je tri un tableau de 500 lignes par ordre aphabethique =E0=20
partir d'une colonne
je souhaite =E9crire une macro qui m'envoit sur la 1=E8re=20
ligne de nots commen=E7ant par "a" puis une autre , qui=20
m'envoit sur la premi=E8re ligne commen=E7ant par "b"
et donc 26 macros identiques command=E9es chacune par un=20
bouton portant la lettre en question
si une bonne =E2me peut m'orienter qu'il en soit remerci=E9
=E0+

10 réponses

1 2
Avatar
AV
[A:A].Find("a*").Activate

Pour b, changer a* par b*

AV


"gilles leroy" a écrit dans le message news:
08ad01c36591$6232b720$
je tri un tableau de 500 lignes par ordre aphabethique à
partir d'une colonne
je souhaite écrire une macro qui m'envoit sur la 1ère
ligne de nots commençant par "a" puis une autre , qui
m'envoit sur la première ligne commençant par "b"
et donc 26 macros identiques commandées chacune par un
bouton portant la lettre en question
si une bonne âme peut m'orienter qu'il en soit remercié
à+
Avatar
Daniel.M
Honorable JPS,

Votre sagesse et votre prudence vous honore.
Dépendant des configurations (et des recherches antérieures), si on ne fixe
pas le paramètre LookAt (de la méthode Find), celui-ci PEUT ne pas être égal
à xlWhole.

Donc, pour s'assurer d'une valeur explicite de xlWhole pour LookAt, il vaut
mieux :
Plage.Find("b*", LookAt:=xlWhole).Activate

Ceci étant dit, la méthode Find est assez rapide pour "A" ou "B" (dans une
longue liste triée) mais pour W, j'aime mieux les recherches binaires!
Plus de code, mais plus rapide :-)

Public Sub TrouveLaLettre()
Dim i As Integer, V(1 To 26) As Variant
For i = 1 To 26
V(i) = TrvPremLettre(Chr(i + 64), Range("E2:E30000")) ' à adapter
Next i
For i = 1 To 26
Debug.Print V(i)
Next i

End Sub

Public Function TrvPremLettre(Lettre As String, Plage As Range) As Long
Dim Res As Variant

Res = Application.Match(Lettre, Plage)
If IsError(Res) Then ' aucun mot < Lettre
Res = 0 ' 0 sauf si 1er mot commence par Lettre
If Left(Plage(1), 1) = Lettre Then Res = 1
ElseIf Left(Plage(Res), 1) <> Lettre Then
Res = Res + 1 ' suivant sauf s'il ne commence pas par lettre
If Left(Plage(Res), 1) <> Lettre Then Res = 0 ' not found
End If
TrvPremLettre = Res
End Function

Salutations,

Daniel M.


"sabatier" wrote in message
news:
dis, laurent, tu es sûr de toi sur ce coup? t'aurais pas prolongé un peu
trop la sieste? tu veux peut-être aller rejoindre nicolas à 200 m sous
terre?
j'ai le sentiment que ça ne va pas forcément sur la première lettre du
mot....
me trompe-je?
jps


Laurent Daures wrote:

Bonjour
ou bien
sur un seul bouton
Sub Rechercher()
x = (InputBox("entrez une ou plusieurs lettres"))
On Error Resume Next
[A:A].Find(x & "*").Activate
End Sub

amicalement
Sitting Hoax
"AV" a écrit dans le message de
news:
[A:A].Find("a*").Activate

Pour b, changer a* par b*

AV


"gilles leroy" a écrit dans le message news:
08ad01c36591$6232b720$
je tri un tableau de 500 lignes par ordre aphabethique à
partir d'une colonne
je souhaite écrire une macro qui m'envoit sur la 1ère
ligne de nots commençant par "a" puis une autre , qui
m'envoit sur la première ligne commençant par "b"
et donc 26 macros identiques commandées chacune par un
bouton portant la lettre en question
si une bonne âme peut m'orienter qu'il en soit remercié
à+









Avatar
Daniel.M
Votre sagesse et votre prudence vous honore.


... vous honorent.

Daniel M.

Avatar
sabatier
ah! laurent, t'as entendu qu'est ce qu'il a dit le monsieur?
je me demande parfois si le courrier que tu distribue n'arrive pas en deux fois
: d'abord l'enveloppe, ensuite la lettre...
merci daniel et heureusement que tu passais par là...
jps

"Daniel.M" wrote:

Honorable JPS,

Votre sagesse et votre prudence vous honorent.
Dépendant des configurations (et des recherches antérieures), si on ne fixe
pas le paramètre LookAt (de la méthode Find), celui-ci PEUT ne pas être égal
à xlWhole.

Donc, pour s'assurer d'une valeur explicite de xlWhole pour LookAt, il vaut
mieux :
Plage.Find("b*", LookAt:=xlWhole).Activate

Ceci étant dit, la méthode Find est assez rapide pour "A" ou "B" (dans une
longue liste triée) mais pour W, j'aime mieux les recherches binaires!
Plus de code, mais plus rapide :-)

Public Sub TrouveLaLettre()
Dim i As Integer, V(1 To 26) As Variant
For i = 1 To 26
V(i) = TrvPremLettre(Chr(i + 64), Range("E2:E30000")) ' à adapter
Next i
For i = 1 To 26
Debug.Print V(i)
Next i

End Sub

Public Function TrvPremLettre(Lettre As String, Plage As Range) As Long
Dim Res As Variant

Res = Application.Match(Lettre, Plage)
If IsError(Res) Then ' aucun mot < Lettre
Res = 0 ' 0 sauf si 1er mot commence par Lettre
If Left(Plage(1), 1) = Lettre Then Res = 1
ElseIf Left(Plage(Res), 1) <> Lettre Then
Res = Res + 1 ' suivant sauf s'il ne commence pas par lettre
If Left(Plage(Res), 1) <> Lettre Then Res = 0 ' not found
End If
TrvPremLettre = Res
End Function

Salutations,

Daniel M.

"sabatier" wrote in message
news:
dis, laurent, tu es sûr de toi sur ce coup? t'aurais pas prolongé un peu
trop la sieste? tu veux peut-être aller rejoindre nicolas à 200 m sous
terre?
j'ai le sentiment que ça ne va pas forcément sur la première lettre du
mot....
me trompe-je?
jps


Laurent Daures wrote:

Bonjour
ou bien
sur un seul bouton
Sub Rechercher()
x = (InputBox("entrez une ou plusieurs lettres"))
On Error Resume Next
[A:A].Find(x & "*").Activate
End Sub

amicalement
Sitting Hoax
"AV" a écrit dans le message de
news:
[A:A].Find("a*").Activate

Pour b, changer a* par b*

AV


"gilles leroy" a écrit dans le message news:
08ad01c36591$6232b720$
je tri un tableau de 500 lignes par ordre aphabethique à
partir d'une colonne
je souhaite écrire une macro qui m'envoit sur la 1ère
ligne de nots commençant par "a" puis une autre , qui
m'envoit sur la première ligne commençant par "b"
et donc 26 macros identiques commandées chacune par un
bouton portant la lettre en question
si une bonne âme peut m'orienter qu'il en soit remercié
à+











Avatar
AV
Salut Daniel,

Plus de code, mais plus rapide :-)


Avec "plage" (A2:A65536) totalement remplie (de n'importe quoi) et "wagon-lit
avec 3 couchettes" en A65536
[Plage].Find("w*", LookAt:=2).Activate
me laisse pas le temps de respirer pour activer A65536

plus rapide ?
Humainement difficile à détecter ;-)

AV

Avatar
MacBob
Merci AV de prendre la défense d'un Marseillais.
Et le jps? Il dort le jps ou il récite son acte de contrition pour avoir
bavé sans motif sur un de mes congénères???

MacBob 8°)))


Le 18/08/03 18:55, dans , « AV »
a écrit :

Salut Daniel,

Plus de code, mais plus rapide :-)


Avec "plage" (A2:A65536) totalement remplie (de n'importe quoi) et "wagon-lit
avec 3 couchettes" en A65536
[Plage].Find("w*", LookAt:=2).Activate
me laisse pas le temps de respirer pour activer A65536

plus rapide ?
Humainement difficile à détecter ;-)

AV





Avatar
Daniel.M
Salut Alain,


Humainement difficile à détecter ;-)


Bon, mais on échange nos bécanes ;-)

Sérieusement, je pense, qu'avec Find, on est très bien servi. Et
l'utilisation de recherches binaires et les 10 lignes de code ne se
justifient qu'en cas d'utilisations intensives de celles-ci ou à l'intérieur
de d'autres boucles. Là, ça deviendrait plus significatif. C'est dans ce
contexte et pour le plaisir (moins pour la nécessité) que la solution a été
proposée.

Voici quand même quelques tempi:
1.Recherches sur les 26 lettres avec Find
==> 1400 ms (donc, près d'une seconde et demie au total).
==> 55 ms / lettre cherchée.
==> Nbre comparaisons approx : 832000 => 32000*26 lettres

2.Recherches avec Application.Match()
==> 16 ms
==> 0.615ms / lettre cherchée.
==> Nbre comparaisons approx : 468 => (16+2) * 26 lettres

Donc, l'option 2 est réellement plus rapide (98% d'économie de temps!) mais
c'est aussi difficile à détecter pour nous sur le plancher des vaches (car
55 ms, i.e. environ un vingtième de seconde, pour rechercher une lettre sur
64K lignes, on peut pas dire qu'Excel.Find se traîne les pieds).

Salutations,

Daniel M.

Avatar
MacBob
Tudieu! Il a de beaux restes l'animal. Un peu plus de stéradent sur le
dentier et il mordrait même. Quant au haggis, il a vécu. Les millevaches
folles sont passées par là et la plupart de ses constituants sont maintenant
interdits d'emploi.
Je t'invite donc à un petit quatre heures autour d'un crumble et d'une tasse
de thé (avec ou sans nuage de lait tant que celui-ci n'est pas retiré de la
vente, prion la reine).
Amène ton seau et ta pelle. On fera un concours de château de sable...

MacBob 8°)))

Le 18/08/03 20:55, dans , « sabatier »
a écrit :

il ne prend pas la défense du marseillais, l'alain de millevaches, il ne
fait qu'en rectifier l'omission...
et puis, toi, l'autre beau scottisho-nordico-marseillais, tu sais très
bien que je ne supporte pas que tu viennes te mêler de la conversation
des grands...allez, ton petit seau, ta petite pelle, tes reste de panse
de brebis farcie dans ton petit sac pour quatre heures et repars jouer,
steplé...
jps

MacBob a écrit:
Merci AV de prendre la défense d'un Marseillais.
Et le jps? Il dort le jps ou il récite son acte de contrition pour avoir
bavé sans motif sur un de mes congénères???

MacBob 8°)))




Avatar
sabatier
lol
jps

MacBob a écrit:
Tudieu! Il a de beaux restes l'animal. Un peu plus de stéradent sur le
dentier et il mordrait même. Quant au haggis, il a vécu. Les millevaches
folles sont passées par là et la plupart de ses constituants sont maintenant
interdits d'emploi.
Je t'invite donc à un petit quatre heures autour d'un crumble et d'une tasse
de thé (avec ou sans nuage de lait tant que celui-ci n'est pas retiré de la
vente, prion la reine).
Amène ton seau et ta pelle. On fera un concours de château de sable...

MacBob 8°)))

Le 18/08/03 20:55, dans , « sabatier »


il ne prend pas la défense du marseillais, l'alain de millevaches, il ne
fait qu'en rectifier l'omission...
et puis, toi, l'autre beau scottisho-nordico-marseillais, tu sais très
bien que je ne supporte pas que tu viennes te mêler de la conversation
des grands...allez, ton petit seau, ta petite pelle, tes reste de panse
de brebis farcie dans ton petit sac pour quatre heures et repars jouer,
steplé...
jps

MacBob a écrit:

Merci AV de prendre la défense d'un Marseillais.
Et le jps? Il dort le jps ou il récite son acte de contrition pour avoir
bavé sans motif sur un de mes congénères???

MacBob 8°)))








Avatar
Laurent Daures
chapeau bas en effet:-))
j'avais commencé à rechercher une solution par le biais d'une boucle,
j'en étais déjà à moins de 35 minutes pour la vélocité.
La solution de Daniel est un peu plus rapide, certes;-)))
Amicalement
Sitting Hoax
"sabatier" a écrit dans le message de
news:
ah! laurent, t'as entendu qu'est ce qu'il a dit le monsieur?
je me demande parfois si le courrier que tu distribue n'arrive pas en deux
fois

: d'abord l'enveloppe, ensuite la lettre...
merci daniel et heureusement que tu passais par là...
jps

"Daniel.M" wrote:

Honorable JPS,

Votre sagesse et votre prudence vous honorent.
Dépendant des configurations (et des recherches antérieures), si on ne
fixe


pas le paramètre LookAt (de la méthode Find), celui-ci PEUT ne pas être
égal


à xlWhole.

Donc, pour s'assurer d'une valeur explicite de xlWhole pour LookAt, il
vaut


mieux :
Plage.Find("b*", LookAt:=xlWhole).Activate

Ceci étant dit, la méthode Find est assez rapide pour "A" ou "B" (dans
une


longue liste triée) mais pour W, j'aime mieux les recherches binaires!
Plus de code, mais plus rapide :-)

Public Sub TrouveLaLettre()
Dim i As Integer, V(1 To 26) As Variant
For i = 1 To 26
V(i) = TrvPremLettre(Chr(i + 64), Range("E2:E30000")) ' à adapter
Next i
For i = 1 To 26
Debug.Print V(i)
Next i

End Sub

Public Function TrvPremLettre(Lettre As String, Plage As Range) As Long
Dim Res As Variant

Res = Application.Match(Lettre, Plage)
If IsError(Res) Then ' aucun mot < Lettre
Res = 0 ' 0 sauf si 1er mot commence par Lettre
If Left(Plage(1), 1) = Lettre Then Res = 1
ElseIf Left(Plage(Res), 1) <> Lettre Then
Res = Res + 1 ' suivant sauf s'il ne commence pas par lettre
If Left(Plage(Res), 1) <> Lettre Then Res = 0 ' not found
End If
TrvPremLettre = Res
End Function

Salutations,

Daniel M.

"sabatier" wrote in message
news:
dis, laurent, tu es sûr de toi sur ce coup? t'aurais pas prolongé un
peu



trop la sieste? tu veux peut-être aller rejoindre nicolas à 200 m sous
terre?
j'ai le sentiment que ça ne va pas forcément sur la première lettre du
mot....
me trompe-je?
jps


Laurent Daures wrote:

Bonjour
ou bien
sur un seul bouton
Sub Rechercher()
x = (InputBox("entrez une ou plusieurs lettres"))
On Error Resume Next
[A:A].Find(x & "*").Activate
End Sub

amicalement
Sitting Hoax
"AV" a écrit dans le message de
news:
[A:A].Find("a*").Activate

Pour b, changer a* par b*

AV


"gilles leroy" a écrit dans le message news:
08ad01c36591$6232b720$
je tri un tableau de 500 lignes par ordre aphabethique à
partir d'une colonne
je souhaite écrire une macro qui m'envoit sur la 1ère
ligne de nots commençant par "a" puis une autre , qui
m'envoit sur la première ligne commençant par "b"
et donc 26 macros identiques commandées chacune par un
bouton portant la lettre en question
si une bonne âme peut m'orienter qu'il en soit remercié
à+














1 2