For Each? Extraction d'un maximum pour chaque val distincte

Hello!

Je suis en difficulté pour une tâche peu compliquée je pense :

J'ai une colonne A avec un index, B avec des valeurs et je veux extraire le maximum des valeurs en B pour chaque index distinct en A.

J'ai donc pensé à un For Each mais je patine dans la semoule...

Auriez-vous la solution?

Voici l'exemple :

Bonjour,

Vous avez une possibilité en matricielle :

=MAX(SI($A$1:$A$6=D5;$B$1:$B$6))

où D5 a la valeur de l'index.

Sinon, avec un for each, à essayer :

Function MAX_SI(Plage_condition as range, Condition, Plage_Renvoi as range) as Double

Dim Pos%

for each cell in Plage_condition 'pour chaque cellule
    Pos = Pos + 1 'incrémentation de la position
    if cell.value = Condition then 'si la valeur de la cellule est l'index
        MAX_SI = application.max(MAX_SI, Plage_Renvoi.cells(Pos).value) 'MAX_SI renvoie le max entre la cellule correspondante en Plage_Renvoi et la valeur déjà contenue dans MAX_SI
    end if
next cell

End function

à saisir de la sorte sur excel :

=MAX_SI($A$1:$A$6;D5;$B$1:$B$6)

Cdlt,

Bonjour,

avec un TCD.
Tableau Croisé Dynamique (TCD) : http://www.mdf-xlpages.com/modules/smartsection/item.php?itemid=109
eric

@3GB

Merci. J'ai essayé ce code mais je ne suis pas très sûr de comment l'utiliser; d'autant que je ne sais pas ni ou placer les fonctions dans l'éditeur (dans une Feuille, Thisworkbook ou dans un module?) ni comment les appeler.

Voici ce que j'ai fait avec mais ça ne marche pas :

@Eriiic

Merci mais je sais déjà le faire avec une matricielle et un TCD.

Je dois en réalité intégrer ce code à un code existant et cela doit être obligatoirement du VBA donc.

Voici ce que j''ai écrit pour le moment (sûrement à côté de la plaque) :

Dim Index As Range
Dim AreaIndex As Range
Set AreaIndex = Range("A1:A6")
For Each Index In AreaIndex
    Range("D1") = WorksheetFunction.Max(Range("B1:B6")
Next Index

Mais ça me donne seulement le maximum tout index confondu (évidemment vu ce que j'ai écrit^^).

Auriez-vous une solution en partant de ce bout de code? :))

Vip4rk

vip4rk,

Là, il s'agit d'une fonction (utilisable dans le code) mais pensée pour être utilisée sur fichier.

Si tu dois insérer un bout de code dans un autre, il faudrait qu'on sache ce que ce code contient et l'objectif afin de voir comment agir au mieux.

En tout cas, voici ton fichier. La fonction était bien placée mais l'affectation des arguments rajoutée dans le code posait problème.

@eriiic, j'en ai profité pour rajouter un petit Application.volatile , que j'oublie à chaque fois...

@eriiic, j'en ai profité pour rajouter un petit Application.volatile , que j'oublie à chaque fois...

C'est bien, mais pas nécessaire ici (voir vraiment superflu car ralenti inutilement).

Une fonction personnalisée est toujours ré-évaluée si un de ses antécédents (paramètres passés) est modifié.
Hors là, tous les éléments lui sont passés en paramètre, elle sera donc toujours à jour même sans Volatile.

On ne la rend volatile que si elle ignore certains paramètres.
eric

Merci eriiic pour l'explication ! Je vais finir par prendre des cours particuliers avec toi .

C'est donc ça qui ralentit excessivement mes fichiers sur lesquels j'ai des fonctions personnalisées. Et saurais-tu comment faire pour que ces fonctions soient aussi "légères" que les fonctions natives d'excel ?

Comme expliqué, pour pouvoir enlever .Volatile il faut lui passer en paramètres toutes les plages de saisies qui impactent le résultat.
Ca n'est possible que pour des fonctions dont le résultat dépend uniquement de saisies.
Donc si ta fonction utilise une cellule avec formule, il faut lui passer non pas cette cellule, mais celle(s) saisie(s) en remontant jusqu'à toutes les saisies.

Si ta fonction dépend, même partiellement, d'un paramètre non saisi (couleur par exemple), tu n'as plus le choix. Obligé de rester en Volatile.
eric

Bonsoir Eriiic,

Donc si ta fonction utilise une cellule avec formule, il faut lui passer non pas cette cellule, mais celle(s) saisie(s) en remontant jusqu'à toutes les saisies.

Es-tu sûr ? Car selon moi, dès que la valeur d'un paramètre est modifiée (formule ou saisie), la fonction est réévaluée. Je n'ai pas rencontré de cas où il fallait remonter jusqu'aux saisies.

Bonjour,

Sûr, je l'étais jusqu'à ce que tu me mettes le doute. J'ai testé et tu as raison.
La fonction personnalisée est bien mise à jour sur des antécédents indirects.
C'est juste si elle utilise une plage en dur non déclarée dans les paramètres qu'il faut la laisser Volatile.
Un grand merci, ça va me simplifier le boulot dans le futur
eric

Rechercher des sujets similaires à "each extraction maximum chaque val distincte"