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

Application.Match... en remontant ?

7 réponses
Avatar
LANIMAL
Bonjour,
J'ai une colonne de dates - NON TRIÉES.
Les dates sont répétées plusieurs fois, et en désordre.
Ex.(avec des nombres, c'est plus lisible) :
4
3
2
3
8
6
3
1

Existe-t-il un code qui permet de définir sur quelle ligne se trouve le
dernier 3 ? (= ligne "7")
Une sorte de Application.Match... "en remontant", qui répondrait "2".


J'ai bien trouvé la solution ci-dessous... qui risque de durer !
--------------------------
Sub test1()

Ligne = 0
Do
On Error Resume Next
Ligne = Ligne + Application.Match(3, Range("A" & Ligne + 1 & ":A65536"), 0)
If Err <> 0 Then Exit Do
Loop
MsgBox Ligne

End Sub
-----------------------------

Merci

7 réponses

Avatar
Daniel.C
Bonjour.
MsgBox Columns(1).Find(3, , , xlWhole, xlByRows, xlPrevious).Address
Daniel

Bonjour,
J'ai une colonne de dates - NON TRIÉES.
Les dates sont répétées plusieurs fois, et en désordre.
Ex.(avec des nombres, c'est plus lisible) :
4
3
2
3
8
6
3
1

Existe-t-il un code qui permet de définir sur quelle ligne se trouve le
dernier 3 ? (= ligne "7")
Une sorte de Application.Match... "en remontant", qui répondrait "2".


J'ai bien trouvé la solution ci-dessous... qui risque de durer !
--------------------------
Sub test1()

Ligne = 0
Do
On Error Resume Next
Ligne = Ligne + Application.Match(3, Range("A" & Ligne + 1 & ":A65536"), 0)
If Err <> 0 Then Exit Do
Loop
MsgBox Ligne

End Sub
-----------------------------

Merci
Avatar
LANIMAL
Merci Daniel,
Je me doutais bien... mais faut savoir !
Merci, bonne journée.

Daniel.C a écrit :
Bonjour.
MsgBox Columns(1).Find(3, , , xlWhole, xlByRows, xlPrevious).Address
Daniel
Avatar
LANIMAL
Oui, je m'étais fixé sur "Match", j'avais oublié "Find" qui
effectivement figure dans l'aide.

Daniel.C a écrit :
Bonjour.
MsgBox Columns(1).Find(3, , , xlWhole, xlByRows, xlPrevious).Address
Daniel
Avatar
Caetera
"LANIMAL" a écrit dans le message de news:


Existe-t-il un code qui permet de définir sur quelle ligne se trouve le
dernier 3 ? (= ligne "7")



**************************
MsgBox [large(if(3¡:A8,row(A1:A8)),1)]

Etc
Avatar
LANIMAL
J'en suis baba !....
Quelle simplicité !
Le test marche, mais malheureusement je ne comprends pas !
Je suppose qu'il s'agit d'une formule matricielle ([... ])?
Il serait temps que je me familiarise avec les matrices, et les
fonctions attachées, mais je ne sais pas par quel moyen.
Je n'ai pas le toupet de te demander un cours particulier, mais si tu
pouvais me donner qq références...
Je n'ai rien trouvé sur l'aide VBA, ni sur Google,
il doit y avoir un truc qui m'échappe... !
Merci pour ton aide passée... et à venir ?


Caetera a écrit :
"LANIMAL" a écrit dans le message de news:


Existe-t-il un code qui permet de définir sur quelle ligne se trouve le
dernier 3 ? (= ligne "7")



**************************
MsgBox [large(if(3¡:A8,row(A1:A8)),1)]

Etc



Avatar
Caetera
"LANIMAL" a écrit dans le message de news:
%

Je suppose qu'il s'agit d'une formule matricielle ([... ])?



******************************
C'est effectivement la transposition en VBA d'une formule matricielle utilisant
3 fonctions imbriquées et dont le résultat est renvoyé par Evaluate (Expression
entre crochets)
Dans la feuille de calcul (avec validation par ctrl+maj+enter) :

=GRANDE.VALEUR(SI(A1:A8=3;LIGNE(A1:A8));1)

Le test logique A1:A8=3 comme 1° argurnent de la fonction SI renvoie au travers
de la fonction LIGNE une matrice de valeurs, numériques (le Numéro de Ligne)
chaque fois que la valeur 3 est trouvée ou FAUX si ce n'est pas le cas.
Pour ton exemple
{FAUX;2;FAUX;4;FAUX;FAUX;7;FAUX}
Il suffira donc d'imbriquer ce calcul dans la fonction
GRANDE.VALEUR(laMatrice,1) pour renvoyer l'index de la dernière ligne contenant
la valeur 3

En VBA et avec des variables, il faudra expressément utiliser la syntaxe
Evaluate(chaine)
Exemple de syntaxe avec variables nom de feuille, 1° ligne de la plage et
dernière ligne de la plage

Sub TestAvecVariables()
laFeuille = "Feuil1"
Ldéb = 1
Lfin = 8
MsgBox Evaluate("large(if(3=" & laFeuille & "!A" & Ldéb & ":A" & Lfin & ",row("
& laFeuille & "!A" & Ldéb & ":A" & Lfin & ")),1)")
End Sub

Etc
Avatar
LANIMAL
Caetera a écrit :
"LANIMAL" a écrit dans le message de news:
%

Je suppose qu'il s'agit d'une formule matricielle ([... ])?



******************************
C'est effectivement la transposition en VBA d'une formule matricielle utilisant
3 fonctions imbriquées et dont le résultat est renvoyé par Evaluate (Expression
entre crochets).......


========================== Merci de ton dévouement.
Après une 1ère lecture, je crois saisir les grandes lignes...
maintenant il faut que j'assimile le détail.
Merci et bonne soirée.