Valeur max avec critère

cajou08 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
cajou08 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Je débute en VBA. Je souhaite écrire une fonction affichant la valeur max d'une plage donnée respectant un certain critère (un mois donné) dans une autre plage.

J'ai trouvé des posts se rapprochant de ma question dans ce forum mais j'aimerais apprendre de mes erreurs en vous proposant ce code.

En m'appuyant sur le code que m'a transmis thev pour la recherche d'occurrences (autre topic), j'en suis là :

Public Function max_m(plage_date As Range, num_mois As Byte, plage_recherche As Range) As Double

'fct max_m : trouve la valeur mensuelle maximale dans une plage donnée
'arg1 : plage_date : plage contenant les dates
'arg2 : num_mois : numéro du mois
'arg3 : plage_recherche : plage contenant les données dont on veut trouver le max

For Each élément In plage_date
    ligne_relative = élément.Row - plage_date.Row + 1
    colonne_relative = élément.Column - plage_date.Column + 1
    If Month(élément.Value) = num_mois Then
        max_m = Application.WorksheetFunction.Max(plage_recherche.Cells(ligne_relative, colonne_relative).Value)
    End If
Next
End Function


Le souci que je rencontre, c'est que la fonction semble retourner la valeur de la cellule la plus "éloignée" dans le tri pour le mois en question et non la valeur max.

Merci par avance de votre aide

EDIT : Ajout du LANGAGE dans les balises de code.
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.


1 réponse

cajou08 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Après réflexion, j'ai amélioré le code qui semble fonctionnel même si j'imagine que ce n'est pas forcément bien écrit (j'ai ajouté un contrôle sur l'année en plus du mois) :

Public Function max_m(plage_date As Range, num_mois As Byte, plage_recherche As Range) As Double

'fct max_m : trouve la valeur mensuelle maximale dans une plage donnée
'carnet entraînement : sortie mensuelle avec le + grand kilométrage
'arg1 : plage_date : plage contenant les dates
'arg2 : num_mois : numéro du mois
'arg3 : plage_recherche : plage contenant les données

Application.Volatile

Dim annee As Integer

'annee courante du carnet d'entraînement, la valeur est stockée temporairement dans setup.F5
annee = Sheets("setup").Range("F5").Value

For Each élément In plage_date
    ligne_relative = élément.Row - plage_date.Row + 1
    colonne_relative = élément.Column - plage_date.Column + 1
    If Month(élément.Value) = num_mois _
    And Year(élément.Value) = annee Then
        If plage_recherche.Cells(ligne_relative, colonne_relative).Value > max_m Then
        max_m = plage_recherche.Cells(ligne_relative, colonne_relative).Value
        End If
    End If
Next
End Function
-1