Chercher le dernier élément dans une liste

13 réponses
Avatar
GL
Bonjour,

J'ai une liste comme ceci :

<pos.> <numéro>
1 1
2 2
3 3
4 4
5 5
6 6
7 1
8 2
9 3
10 4
11 1
12 2
13 3
14 4
15 5

Et je me propose de trouver la position du dernier 4
dans la liste <numéro>.

Je viens de trouver sur le net : {=EQUIV(2;CHERCHE(4;<plage numéro>);1)}
qui donne bien: 14.

J'en reste baba ;-) et je voulais vous faire partager cette
connoissance fondamentale !

Bonne journée.

10 réponses

1 2
Avatar
MichD
Bonjour,

Une petite démonstration :

Prenons cette formule : {=EQUIV(0;CHERCHE(4;A1:A7);1)}

A ) Sélectionne la plage B1:B7
B ) Appuie sur la touche F2, tu devrais te retrouver dans la cellule B1
C ) Saisis dans la barre des formules =Cherche(4;A1:A7) et valide en
appuyant sur les touches Maj + Ctrl + Enter (validation matricielle)
D ) Ce que tu observes en colonne B, tu as sois des 1 où tu as la valeur 4
en colonne A ou soit des #Valeur!
E ) Imagine maintenant que la fonction "Equiv()" a comme second argument, ce
tableau "B1:B7"), car l'ensemble de la fonction de la cellule est matriciel.

Maintenant, la fonction Equiv(). Le dernier paramètre est 1. Cela signifie
d'après d'Excel sur la fonction :

'-----------------
La fonction EQUIV recherche la valeur la plus élevée qui est inférieure ou
égale à celle de l’argument valeur_cherchée. Les valeurs de l’argument
matrice_recherche doivent être placées en ordre croissant, par exemple :
...-2, -1, 0, 1, 2, ..., A-Z, FAUX, VRAI.
'-----------------

On stipule que la plage doit être triée en ordre croissant. Si tu regardes
dans la colonne B, tu as seulement des 1 comme valeur numérique, donc en
ordre croissant ou décroissant, c'est la même chose...

Par conséquent, la fonction Equiv() recherche la valeur 2 dans le tableau et
pour ce faire, elle doit parcourir toute la plage jusqu'à la dernière valeur
affichée, car la plage est en ordre croissant et elle doit se rendre à la
valeur 2 à la première valeur plus grande que 2. Comme il n'y a pas de
valeur plus grande que 1 dans le tableau, elle se rend à la dernière valeur
affichée dans le tableau qui est un 1 et retourne la position de cette
valeur.

Tu peux utiliser une fonction plus simple et plus courte :

Validation matricielle : Maj + Ctrl + Enter
=MAX(SI(A1:A7=4;LIGNE(A1:A7)))
Avatar
GL
Le 06/11/2014 14:12, MichD a écrit :
Bonjour,

Une petite démonstration :

Prenons cette formule : {=EQUIV(0;CHERCHE(4;A1:A7);1)}

A ) Sélectionne la plage B1:B7
B ) Appuie sur la touche F2, tu devrais te retrouver dans la cellule B1
C ) Saisis dans la barre des formules =Cherche(4;A1:A7) et valide en
appuyant sur les touches Maj + Ctrl + Enter (validation matricielle)



Oui tout est là : je ne savais pas que Cherche renvoyait toutes les
valeurs trouvées (en mode matriciel).

Autre chose : on peut sélectionner une formule ou même seulement une
partie de formule dans la barre de formule et taper :

F9 (Êlculer maintenant)

La formule, ou partie de formule est alors remplacée temporairement par
sa valeur : il suffit de taper "échappe" pour retrouver la formule.

Cela permet de voir que Cherche renvoie bien un vecteur-résultat.

Tu peux utiliser une fonction plus simple et plus courte :

Validation matricielle : Maj + Ctrl + Enter
=MAX(SI(A1:A7=4;LIGNE(A1:A7)))



La formule n'est pas identique : égale seulement si on est sur la
ligne 1. Sinon il faudrait
LIGNE(<Plage>) - Ligne(<1ère cellule de Plage>) + 1
un peut lourdingue !


Par contre on peut utiliser :
{ =EQUIV(2;SI(A2:A7=4;1);1) }
qui est plus logique que CHERCHE pour des valeur numériques, et
sans doute beaucoup plus rapide aussi !

J'ai trouvé mes astuces ici :
https://www.youtube.com/watch?v=dQH2rR1lLpM

Bonne soirée.
Avatar
MichD
| on peut utiliser : { =EQUIV(2;SI(A2:A7=4;1);1) }

Aussi, en variantes, des formules matricielles!

=EQUIV(1;N(A2:A7=4);1) ou =EQUIV(1;1*(A2:A7=4);1)

OU

{=EQUIV(1;CHERCHE(4;A2:A7);1)}
Avatar
GL
Le 07/11/2014 12:08, MichD a écrit :
| on peut utiliser : { =EQUIV(2;SI(A2:A7=4;1);1) }

Aussi, en variantes, des formules matricielles!

=EQUIV(1;N(A2:A7=4);1) ou =EQUIV(1;1*(A2:A7=4);1)



Oui merci : je ne connaissais pas N(...) qui convertit en nombre
les booléens et les dates.

OU
{=EQUIV(1;CHERCHE(4;A2:A7);1)}



C'était la première formule, avec CHERCHE : il s'avère qu'elle est
largement plus lente qu'un test avec '=' (par contre CHERCHE permet les
caractères génériques...)

Cordialement.
Avatar
MichD
| > {=EQUIV(1;CHERCHE(4;A2:A7);1)}

| C'était la première formule, avec CHERCHE

**** Très exactement la première formule était :
{=EQUIV(2;CHERCHE(4;A2:A7);1)}
Avatar
MichD
Il y a même celle-ci :

Validation matricielle :
=EQUIV(1;--(A2:A7=4);1)

;-)
Avatar
GL
Le 07/11/2014 19:22, MichD a écrit :
Il y a même celle-ci :

Validation matricielle :
=EQUIV(1;--(A2:A7=4);1)

;-)



BRAVO !! ;-)

J'adore celle-ci ! Cryptique à souhait, et super courte !
Avatar
MichD
| J'adore celle-ci ! Cryptique à souhait, et super courte !

Désolé de te décevoir, mais la seule formule qui fonctionne dans tous les
cas
de présentation de la disposition des valeurs numériques dans une colonne
est
celle-ci : =EQUIV(2;CHERCHE(5;C5:C15);1) =>> validation matricielle.

Toutes les autres formules présentées ne fonctionnent pas dans cet exemple :

Exemple dans une colonne :
1
3
4
2
4
6

Toutes ces formules
=EQUIV(1;N(A2:A7=4);1) ou =EQUIV(1;1*(A2:A7=4);1) ou
=EQUIV(1;--(A2:A7=4);1)

Elles génèrent un tableau intermédiaire (A2:A7) comme ceci : {0;0;1;0;1;0}
Ce tableau contient seulement des valeurs numériques et le 3e argument de la
fonction "Equiv() étant 1, on doit avoir dans ce tableau des valeurs en
ordre croissant. Comme ce n'est pas le cas, le résultat obtenu dans ce cas
est 3, la fonction arrête de chercher puisque la valeur suivante est 0.

Ces fonctions pourraient être utilisées seulement si la position de la
valeur recherchée était consécutive dans une série de chiffres comme :

1
3
4
4
4
6

Avec la fonction "Cherche", lorsque la valeur n'est pas trouvée, au lieu
d'avoir des 0 et des 1, on a des "#VALEUR!" et des 1.

Je vois qu'il y en a plusieurs qui suivent... mais arrêtez-moi quelqu'un!
;-))
Avatar
Jacquouille
Mon Bon Denis
La politique actuelle étant le laxisme, on n'arrête plus les gens. -))
Voici une autre solution qui a dépoussiéré mon neurone
----------------
Sub Le_dernier()
derL = [A65536].End(3).Row
For zz = derL To 1 Step -1
If Range("a" & zz).Value = 4 Then
MsgBox zz: Exit Sub
End If
Next
End Sub
---------------------
Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
m3l4kg$647$


| J'adore celle-ci ! Cryptique à souhait, et super courte !

Désolé de te décevoir, mais la seule formule qui fonctionne dans tous les
cas
de présentation de la disposition des valeurs numériques dans une colonne
est
celle-ci : =EQUIV(2;CHERCHE(5;C5:C15);1) =>> validation matricielle.

Toutes les autres formules présentées ne fonctionnent pas dans cet exemple :

Exemple dans une colonne :
1
3
4
2
4
6

Toutes ces formules
=EQUIV(1;N(A2:A7=4);1) ou =EQUIV(1;1*(A2:A7=4);1) ou
=EQUIV(1;--(A2:A7=4);1)

Elles génèrent un tableau intermédiaire (A2:A7) comme ceci : {0;0;1;0;1;0}
Ce tableau contient seulement des valeurs numériques et le 3e argument de la
fonction "Equiv() étant 1, on doit avoir dans ce tableau des valeurs en
ordre croissant. Comme ce n'est pas le cas, le résultat obtenu dans ce cas
est 3, la fonction arrête de chercher puisque la valeur suivante est 0.

Ces fonctions pourraient être utilisées seulement si la position de la
valeur recherchée était consécutive dans une série de chiffres comme :

1
3
4
4
4
6

Avec la fonction "Cherche", lorsque la valeur n'est pas trouvée, au lieu
d'avoir des 0 et des 1, on a des "#VALEUR!" et des 1.

Je vois qu'il y en a plusieurs qui suivent... mais arrêtez-moi quelqu'un!
;-))
Avatar
GL
Le 08/11/2014 14:08, MichD a écrit :

| J'adore celle-ci ! Cryptique à souhait, et super courte !

Désolé de te décevoir, mais la seule formule qui fonctionne dans tous
les cas
celle-ci : =EQUIV(2;CHERCHE(5;C5:C15);1) =>> validation matricielle.

Toutes les autres formules présentées ne fonctionnent pas dans cet
exemple :
Toutes ces formules
=EQUIV(1;N(A2:A7=4);1) ou =EQUIV(1;1*(A2:A7=4);1) ou
=EQUIV(1;--(A2:A7=4);1)



Non : {=EQUIV(2; SI(4¢:A7;1); 1)}

fonctionne, car les valeurs 4 sont remplacées par 1 dans la liste,
toutes les autres étant remplacées par FAUX : EQUIV(2, ... fonctionne
donc bien dans ce cas.

C'est la formule que j'ai utilisée.
Elle est *BEAUCOUP* plus *RAPIDE* que CHERCHE


Pour la petite histoire, je voulais construire un arbre à partir du log
(retraité) de gcc -E -dI pour avoir l'arborescence de tous les
fichiers inclus. J'ai donc un listing automatique et assez long !

Au départ, j'ai :

source <l> inclus => "inclus" est inclus par source en sa ligne l
source <l> inclus
source <l> inclus
source <l> inclus

Il y a env. 700 lignes comme ça.

Si 'source' = 'inclus'
-> j'augmente la profondeur de l'arbre de 1
Sinon
-> je cherche au-dessus de 'source' la dernière occurrence de
'source' (c'est là que j'ai besoin d'EQUIV(2 ...)) ce qui me
donne la profondeur déjà calculée auparavant, en utilisant
INDEX

A la fin j'ai :

source <l> inclus <profondeur dans l'arborescence>
source <l> inclus <profondeur dans l'arborescence>
source <l> inclus <profondeur dans l'arborescence>
source <l> inclus <profondeur dans l'arborescence>


Quand je recalcule avec CHERCHE sur mon Intel i7 x86-64 à 1,9 GHz
ça met bien 5 secondes (honte à Excel...)

Quand j'utilise {=EQUIV(2; SI(A12=$A$2:A11; 1); 1)} ça met 1 seconde.



Je vois qu'il y en a plusieurs qui suivent... mais arrêtez-moi quelqu'un!
;-))



Non j'ai bien suivi, merci ! C'est vrai que les formules avec
N(...) 1*(booléen) etc. ne vont pas fonctionner correctement !

Bon weekend.
1 2