LaurentC Index/equiv

8 réponses
Avatar
MichD
Bonjour,

Tout est dans le fichier Í  l'adresse suivante.

https://docs.google.com/spreadsheets/d/1DrkdOPmXl1Rxi9udkVSS4qbXWEBQr8FH/edit?usp=sharing&ouid5373407214342299858&rtpof=true&sd=true

Le fichier sera disponible pour une durée limitée.

MichD

8 réponses

Avatar
MichD
Le 01/05/22 Í  07:20, MichD a écrit :
Bonjour,
Tout est dans le fichier Í  l'adresse suivante.
https://docs.google.com/spreadsheets/d/1DrkdOPmXl1Rxi9udkVSS4qbXWEBQr8FH/edit?usp=sharing&ouid5373407214342299858&rtpof=true&sd=true
Le fichier sera disponible pour une durée limitée.
MichD

Une recopie de la macro pour cette formule :
'------------------------------
Sub Test()
MsgBox Evaluate("INDEX(TblOpérations[[#All],[Soldée]]" & _
",MATCH(LaDate&CHAR(187)&Valeur,TblOpérations[[#All]," & _
"[Date]]&CHAR(187)&TblOpérations[[#All],[NomValeur]],0),1)")
End Sub
'------------------------------
MichD
Avatar
LaurentC
salut MichD
Excellent !
(J'ajoute vraiment super :-))
Nombreux mercis
@+laurent
Bonjour,
Tout est dans le fichier Í  l'adresse suivante.
https://docs.google.com/spreadsheets/d/1DrkdOPmXl1Rxi9udkVSS4qbXWEBQr8FH/edit?usp=sharing&ouid5373407214342299858&rtpof=true&sd=true
Le fichier sera disponible pour une durée limitée.
MichD
Avatar
LaurentC
'------------------------------
Sub Test()
MsgBox Evaluate("INDEX(TblOpérations[[#All],[Soldée]]" & _
",MATCH(LaDate&CHAR(187)&Valeur,TblOpérations[[#All]," & _
"[Date]]&CHAR(187)&TblOpérations[[#All],[NomValeur]],0),1)")
End Sub
'------------------------------
MichD

Salut
J'ai modifié ton fichier comme suit :
En E1 j'ai fixé la date au 04/05/2022 (LaDate).
En F1 j'ai donné toto3 (NomValeur).
Dans les formules j'ai modifié la fin de "...[NomValeur]],0),1)" en
"...[NomValeur]],1),1)" pour que Match trouve la valeur inférieure si
nécessaire.
Dans mon tableau, les dates sont classées par ordre croissant, mais
sont non contiguës et sont parfois en double (le gros détail oublié).
J'ai modifié le tableau comme suivant :
modifié la date 02/05/2022 en 03/05/2022
supprimé la ligne de tableau commencant par 04/05/2022
Date NomValeur Soldée
30/04/2022 toto1 1
01/05/2022 toto2 2
03/05/2022 toto3 3
03/05/2022 toto4 4
05/05/2022 toto6 6
06/05/2022 toto7 7
07/05/2022 toto8 8
08/05/2022 toto9 9
La forumule et VBA me renvoient 4 qui est la ligne Soldée pour la
première date trouvée ... J'attendai 3, la ligne Soldée pour la date <04/05/2022 ET NomValeur = toto3.
Désolé pour la fausse piste
Encore merci
@+Laurent
Avatar
MichD
Le 01/05/22 Í  09:42, LaurentC a écrit :
'------------------------------
Sub Test()
MsgBox Evaluate("INDEX(TblOpérations[[#All],[Soldée]]" & _
",MATCH(LaDate&CHAR(187)&Valeur,TblOpérations[[#All]," & _
"[Date]]&CHAR(187)&TblOpérations[[#All],[NomValeur]],0),1)")
End Sub
'------------------------------
MichD

Salut
J'ai modifié ton fichier comme suit :
En E1 j'ai fixé la date au 04/05/2022 (LaDate).
En F1 j'ai donné toto3 (NomValeur).
Dans les formules j'ai modifié la fin de "...[NomValeur]],0),1)" en
"...[NomValeur]],1),1)" pour que Match trouve la valeur inférieure si
nécessaire.
Dans mon tableau, les dates sont classées par ordre croissant, mais sont
non contiguës et sont parfois en double (le gros détail oublié). J'ai
modifié le tableau comme suivant :
modifié la date 02/05/2022 en 03/05/2022
supprimé la ligne de tableau commencant par 04/05/2022
Date    NomValeur    Soldée
30/04/2022    toto1    1
01/05/2022    toto2    2
03/05/2022    toto3    3
03/05/2022    toto4    4
05/05/2022    toto6    6
06/05/2022    toto7    7
07/05/2022    toto8    8
08/05/2022    toto9    9
La forumule et VBA me renvoient 4 qui est la ligne Soldée pour la
première date trouvée ... J'attendai 3, la ligne Soldée pour la date <> 04/05/2022 ET NomValeur = toto3.
Désolé pour la fausse piste
Encore merci
@+Laurent

La concaténation des 2 colonnes pour la date "03/05/22". donne ceci :
44684toto3
44684toto4
44684 est la valeur numérique de la date.
Demande Í  Excel de trier ces données en ordre ou décroissant, et tu vas
avoir ta réponse. N'oublie pas ton critère est une concaténation de 2
cellules.
Lors du tri, comme le résultat de la concaténation est du texte, le tri
se fait en comparant la valeur "ASCII" de chacun des caractères
(caractère par caractère). En conséquence, la plus grande valeur est :
44684toto4
C'est la manière que fonctionne Excel.
MichD
Avatar
LaurentC
Salut
...
N'oublie pas ton critère est une concaténation de 2 cellules.

Alors ça ne va pas :-(
Je peux avoir 3 valeurs ou plus sur la même date ...
Match me plaisait bien avec la notion d'aller chercher la valeur
inférieur si celle recherchée n'est pas lÍ .
Je vais reformuler ma question dans un nouveau post.
Merci
@+Laurent
Avatar
MichD
Le 01/05/22 Í  12:16, LaurentC a écrit :
Salut
je pense néanmoins qu'il y a une solution avec index/match en
n'utilisant pas la concaténation mais avec un truc du genre
Range("F13") > Evaluate("INDEX(prix,MATCH(1,(annee¡3)*(taille±3)*(modeleÁ3),0))")
J'ai pas réussi Í  mettre en oeuvre :-(
(je pofine mon nouveau post et reviens rapidement :-)
@+Laurent

Toujours en tenant comme du classeur publié et des modifications que tu
as apportées aux données, si tu tiens Í  index/equiv(), il y a ceci :
Formule dans une cellule :
Validation matricielle : Ctrl+Maj+enter
=INDEX(TblOpérations[[#Tout];[Soldée]];EQUIV(INDEX(TblOpérations[[#Tout];[Date]];EQUIV(LaDate;TblOpérations[Date];1))&INDEX(TblOpérations[[#Tout];[NomValeur]];EQUIV(LaDate;TblOpérations[Date];1));TblOpérations[[#Tout];[Date]]&TblOpérations[NomValeur];1)+1)
En VBA, cela donne :
Sub test()
MsgBox Evaluate("INDEX(TblOpérations[[#All],[Soldée]]," & _
"MATCH(INDEX(TblOpérations[[#All],[Date]],MATCH(LaDate," & _
"TblOpérations[Date],1))&INDEX(TblOpérations[[#All],[NomValeur]]," & _
"MATCH(LaDate,TblOpérations[Date],1)),TblOpérations[[#All]," & _
"[Date]]&TblOpérations[NomValeur],1)+1)")
MichD
Avatar
MichD
Le 01/05/22 Í  14:09, MichD a écrit :
Le 01/05/22 Í  12:16, LaurentC a écrit :
Salut
je pense néanmoins qu'il y a une solution avec index/match en
n'utilisant pas la concaténation mais avec un truc du genre
Range("F13") >> Evaluate("INDEX(prix,MATCH(1,(annee¡3)*(taille±3)*(modeleÁ3),0))")
J'ai pas réussi Í  mettre en oeuvre :-(
(je pofine mon nouveau post et reviens rapidement :-)
@+Laurent

Toujours en tenant comme du classeur publié et des modifications que tu
as apportées aux données, si tu tiens Í  index/equiv(), il y a ceci :
Formule dans une cellule :
Validation matricielle : Ctrl+Maj+enter
=INDEX(TblOpérations[[#Tout];[Soldée]];EQUIV(INDEX(TblOpérations[[#Tout];[Date]];EQUIV(LaDate;TblOpérations[Date];1))&INDEX(TblOpérations[[#Tout];[NomValeur]];EQUIV(LaDate;TblOpérations[Date];1));TblOpérations[[#Tout];[Date]]&TblOpérations[NomValeur];1)+1)
En VBA, cela donne :
Sub test()
MsgBox Evaluate("INDEX(TblOpérations[[#All],[Soldée]]," & _
"MATCH(INDEX(TblOpérations[[#All],[Date]],MATCH(LaDate," & _
"TblOpérations[Date],1))&INDEX(TblOpérations[[#All],[NomValeur]]," & _
"MATCH(LaDate,TblOpérations[Date],1)),TblOpérations[[#All]," & _
"[Date]]&TblOpérations[NomValeur],1)+1)")
MichD

Tu pourrais ajouter SiErreur(laFormule;"") dans le cas o͹ il n'y a pas
de correspondance afin d'éviter une valeur d'erreur #Valeur!
MichD
Avatar
LaurentC
Salut
MsgBox Evaluate("INDEX(TblOpérations[[#All],[Soldée]]," & _
"MATCH(INDEX(TblOpérations[[#All],[Date]],MATCH(LaDate," & _
"TblOpérations[Date],1))&INDEX(TblOpérations[[#All],[NomValeur]]," & _
"MATCH(LaDate,TblOpérations[Date],1)),TblOpérations[[#All]," & _
"[Date]]&TblOpérations[NomValeur],1)+1)")
MichD


Je préfère cette solution Í  une bloucle comme vu plus haut.
Super, je fais avec ça.
Merci
@+Laurent