OVH Cloud OVH Cloud

Histoire de maximum le retour

6 réponses
Avatar
Willy Gruner
Bonjour à toutes et tous,
Excusez-moi d'insister mais ma curiosité intellectuelle dépasse parfois la
bienseance.

Voici mon pb
De A1:A6 des valeurs à tester
De B1:B6 la base de données
De C1:C6 les cellules à renseigner.

Je cherche dans A1:A6 le maximum, je renseigne la cellule correspondante de
C1:C6 à partir de B1:B6.
Je continue dans A1:A6 avec le deuxième note juste inférieure à ce maximum
(je l'appelle le deuxième maximum), je renseigne la deuxième cellule
correspondante de C1:C6 à partir de B1:B6.
Ainsi de suite dans A1:A6 tant que la valeur n'est pas <=0

Comment créer cette formule matricielle dans C1:C6 qui tiennent compte de
ça.
En plus il faut que la somme(C1:C6)=30 : donc il faut que dans la derniere
cellule renseignée de C1:C6 il y ait une partie de la cellule correspondant
de B1:B6.
Je pense que ça ne doit pas être claire alors je vous donne un exemple :

A1:A6 : 14;-2;5;7;8;3
B1:B6 : 10;5;8;2;15;8
Donnera en :
C1:C6 : 10;0;3;2;15;0

J'espère avoir été assez clair.

PS : j'ai crée une macro VBA qui fait tous ça mais je n'ai pas su élaborer
une formule matricielle qui éviterait de lancer cette macro.

Merci d'avance
Willy

6 réponses

Avatar
Pierre Fauconnier
Bonsoir Willy,

Je ne suis pas certain d'avoir tout compris, car je ne comprends pas toutes
les valeurs que tu as en C1:C6.

Si j'ai bien compris, tu cherches à classer les valeurs de A1:A6 par ordre
décroissant, puis à récupérer dans C1:C6 les valeurs de B1:B6 correspondant
au nouvel ordre de A1:A6
Ainsi, avec 14 (A1) en MAX1(A1:A6), tu doit avoir 10 (B1) en C1 ( C'est ce
que donne ton exemple )

MAX2(A1:A6) = 8 (A5), donc je croyais que tu voulais 15 (B5) en C2 ( Ton
exemple renvoie 0 ??)
MAX3(A1:A6) = 7 (A4), donc je croyais que tu voulais 2 (B4) en C3 (Ton
exemple renvoie 3 qui n'est pas dans B1:B6 ... ???)


Moi, j'avais trouvé une formule qui renvoyait la correspondance B1:B6 de
A1:A6 classé par ordre décroissant :
=INDEX($B$1:$B$6;EQUIV(GRANDE.VALEUR($A$1:$A$6;LIGNE());$A$1:$A$6;0))

qui n'est pas une matricielle, mais tu peux sélectionner C1:C6, saisir la
formule en C1 puis valider par CTRL+ENTREE ( PAS EN MATRICIELLE AVEC
CTRL+ALT+ENTREE !!!)


--
Cela convient-il?
----
Pierre Fauconnier
"C'est lorsqu'il y a un temps mort qu'il faut tuer le temps..."
(remplacer NOSPAM par pfi pour me répondre. Merci)




Willy Gruner wrote:
Bonjour à toutes et tous,
Excusez-moi d'insister mais ma curiosité intellectuelle dépasse
parfois la bienseance.

Voici mon pb
De A1:A6 des valeurs à tester
De B1:B6 la base de données
De C1:C6 les cellules à renseigner.

Je cherche dans A1:A6 le maximum, je renseigne la cellule
correspondante de C1:C6 à partir de B1:B6.
Je continue dans A1:A6 avec le deuxième note juste inférieure à ce
maximum (je l'appelle le deuxième maximum), je renseigne la deuxième
cellule correspondante de C1:C6 à partir de B1:B6.
Ainsi de suite dans A1:A6 tant que la valeur n'est pas <=0

Comment créer cette formule matricielle dans C1:C6 qui tiennent
compte de ça.
En plus il faut que la somme(C1:C6)0 : donc il faut que dans la
derniere cellule renseignée de C1:C6 il y ait une partie de la
cellule correspondant de B1:B6.
Je pense que ça ne doit pas être claire alors je vous donne un
exemple :

A1:A6 : 14;-2;5;7;8;3
B1:B6 : 10;5;8;2;15;8
Donnera en :
C1:C6 : 10;0;3;2;15;0

J'espère avoir été assez clair.

PS : j'ai crée une macro VBA qui fait tous ça mais je n'ai pas su
élaborer une formule matricielle qui éviterait de lancer cette macro.

Merci d'avance
Willy


Avatar
R. O.
Bonsoir,

Il est toujours possible de déclarer une nouvelle fonction matricielle :
puisque la macro fonctionne, il n'y a plus qu'a récuperer la zone de
validation ( caller) et comme cela la formule matricielle sera des plus
simples ...

Non?

R.O.
Avatar
Willy Gruner
salut R.O,
tu peux me donner un exemple je ne comprends pas tout

Merci d'avance
Willy
Avatar
Willy Gruner
salut Pierre,
merci de t'occuper de mon cas
Est-ce que je peux t'envoyer le fichier ça sera plus clair ?

Cordialement en attendant ta réponse
Willy
Avatar
Pierre Fauconnier
Bien sûr...


--
Cela convient-il?
----
Pierre Fauconnier
"C'est lorsqu'il y a un temps mort qu'il faut tuer le temps..."
(remplacer NOSPAM par pfi pour me répondre. Merci)


Willy Gruner wrote:
salut Pierre,
merci de t'occuper de mon cas
Est-ce que je peux t'envoyer le fichier ça sera plus clair ?

Cordialement en attendant ta réponse
Willy


Avatar
R. O.
Bonsoir,

tu devrais pouvoir utiliser ce qui suit

Dans une plage ( "A4:D5" par exemple ) on met tes données
On sélectionne la ligne suivante ( A6:D6 pour l'exemple)

on tape VAZIDONC(A4:D5) et on valide par Ctrl-Maj-Entrée
...
Le code est dessous, prêt à être placé dans un module
du classeur dans lequel ces calculs seront faits
( ou dans perso.xls ...)

J'espère que cela te conviendra ,

Cordialement,

R.O.
----------------------------------------------------------
Function VAZIDONC(oussa As Variant)

Dim Lar, Hau, I, Large, Haut As Long
Dim DONNEES, RESULTATS, Ki As Variant

' infos sur la plage dans laquelle la fonction
' a été validée par Ctrl-Maj-Entrée
' c'est la plage qui reçoit les résultats

Ki = Application.Caller.Address
Haut = Range(Ki).Rows.Count
Large = Range(Ki).Columns.Count

' évitons les arguments incorrects
If VarType(oussa) <> 8204 Or Haut <> 1 Then
' cette valeur de vartype se trouve dans l'aide
' c'est un nombre comme les autres :o)
VAZIDONC = CVErr(xlErrRef)
' erreur #REF
Else


' la plage saisie en argument est interprétée comme un tableau
DONNEES = oussa
Lar = UBound(DONNEES, 2)
Hau = UBound(DONNEES, 1)
' il faut que cette plage ait des dimensions convenables
If Lar <> Large Or Hau <> 2 Then
VAZIDONC = CVErr(xlErrRef)
' erreur #REF

GoTo Fin
End If

ReDim RESULTATS(1 To 1, 1 To Large)

' A la place de la boucle ci dessous devra se trouver
' le travail fait par ta macro

For I = 1 To Large
RESULTATS(1, I) = DONNEES(1, I) + DONNEES(2, I)
' On met qq chose dans la case n°I
' en fonction de ce qui se trouve au dessus ...
' ici c'est la somme des deux du dessus ...
' why not !

Next I

' on rempli la plage cible en retournant un tableau

VAZIDONC = RESULTATS
End If
Fin:
End Function