fonction SelRange, (alternative SI.ENS ou IFS)

Pour écrire et partager des tutoriels et des astuces (Excel, Calc et Google Sheets uniquement)
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 8'695
Appréciations reçues : 312
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 11 décembre 2018, 11:23

Bonjour,

dans les dernières versions d'excel une option de sélection a été ajoutée à certaines fonctions (.SI.ENS ou IFS)

cette option n'est pas disponibles pour toutes les fonctions et pas disponibles pour les versions plus anciennes.

je vous propose une fonction qui offre cette possibilité et que vous pourrez utiliser avec n'importe quelle fonction qui travaille avec une plage de données).
Function SelRange(r, ParamArray parm())
'sélectionne une plage en fonction de critères (comme la fonction IFs ou .SI.ENS)
' r est la plage dans laquelle sélectionner les valeurs
'paramarray() est une liste de critères de sélection, les critères de sélection sont chacun composés de 2 parties
'             la plage sur laquelle il faut vérifier le critère et le critère à vérifier

' exemple soit le tableau (avec plages nommées poids et age)
' poids age
'   40  20
'   30  25
'   50  30
' pour sélectionner les ages des poids compris entre 30 et 45
' selrange(age,poids,">=30",poids,"<=45")

' selrange retourne un tableau qui peut être exploité dans une autre fonction telle que
' Min, Max, Stdev, etc...
' =Min(selrange(age,poids,">=30",poids,"<=45"))
'
    Dim res()    'tableau contenant les valeurs sélectionnées
    For i = 1 To r.Count    'pour chaque valeur, on vérifie s'il faut la sélectionner
        For j = LBound(parm) To UBound(parm) Step 2    'on vérifie les critères, on prend les paramètres 2 par 2
            Set rc1 = parm(j)    '1er paramètre la plage sur laquelle appliquer le critère
            c1 = parm(j + 1)    ' 2eme paramètre la valeur du critère à sélectionner
            op = ""    ' opérateur peut être >,< ou = sur 1 ou 2 caractères
            For k = 1 To 2
                ch = Mid(c1, k, 1)
                If ch = "=" Or ch = "<" Or ch = ">" Then op = op & ch
            Next k
            c1 = Replace(c1, op, "")
            If op = "" Then op = "="    'si pas d'opérateur on met l'opérateur =
            ' conversion des données, donnée de la plage critère
            If IsDate(rc1(i)) Then    'date
                p1 = CDbl(rc1(i))
            ElseIf IsNumeric(rc1(i)) Then    'nombre
                p1 = rc1(i)
            Else    'texte
                p1 = Chr(34) & rc1(i) & Chr(34)
            End If
            'conversion des données, valeur critère
            If Not IsNumeric(c1) Then c1 = Chr(34) & c1 & Chr(34)    'nombre
            ev = "=" & p1 & op & c1    'equation de sélection
            If Not Application.Evaluate(ev) Then j = 9999: Exit For    'la condition n'est pas vérifiée, la donnée ne sera pas sélectionnée
        Next j
        If j < 9999 Then    'toutes les conditions sont vérifiées on sélectionne la donnée
            c = c + 1
            ReDim Preserve res(c)
            res(c) = r(i)
        End If
    Next i
    SelRange = res
End Function
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message