Function interval

Bonjour à tous et à toutes (formule inclusive?)

j'ai créée une fonction en vba car je crois qu'elle n'existe pas (en tous cas je ne la connais pas).

le but étant de savoir dans quel intervalle se trouve une valeur par rapport à plusieurs autres...

dans cet exemple :

la valeur 233 parmi les valeurs 1,250,500,7800,10000

se trouve dans l'intervalle [1;250]

233


1250500780010000

la fonction va donc renvoyer la valeur 1, car nous parlons du premier intervalle

dans cet exemple :

la fonction va renvoyer la valeur 0 car 233 est inférieur à 250

233



250
500
7800
10000
58623

la fonction prend trois paramètres

le premier étant la valeur que nous souhaitons comparer, la seconde étant la plage contenant les valeurs formant les différents intervalle, et enfin le type d'intervalle souhaité (inclut ou exclue)

dans cet exemple:

233 peut tout aussi bien être contenue dans le premier intervalle comme dans le second, il faut donc indiquer quel résultat nous souhaitons

233




1
233
500
7800
10000

233 est non compris dans [1;233[

ou 233 est compris dans ]1;233]


voici la fonction :

Function INTERVAL( _
    valeur As Range, _
    plage As Range, _
    include As Integer) As Integer
Application.Volatile

Dim j As Integer
j = plage.Cells.Count 'nbr de cellule
Dim k As Integer
Dim l As Integer
k = plage.Rows.Count 'nbr de ligne
l = plage.Columns.Count 'nbr de colonne

Dim chessboard(10) As Variant 'échiquier contient les valeurs de la plage
Dim i As Integer

For i = 0 To j
    If k = 1 And l > 1 Then 'travailler par ligne ou par colonne
        chessboard(i) = plage.Cells(1, 1 + i)
    ElseIf k > 1 And l = 1 Then
        chessboard(i) = plage.Cells(1 + i, 1)
    ElseIf k = 1 And l = 1 Then 'on ne peut comparer une seule valeur
        INTERVAL = 0
        Exit Function
    ElseIf k > 1 And l > 1 Then 'on ne peut comparer plusieurs lignes et colonne
        INTERVAL = 0
        Exit Function
    End If
Next i

If include = 1 Then 'intervalle de type ]--]
    For i = 0 To j 'cherche l'intervalle où se trouve valeur par rapport à plage
        If valeur <= chessboard(i) Then
            INTERVAL = i '0 étant en dehors de plage
            Exit Function
        End If
    Next i
ElseIf include = 2 Then 'intervalle de type [--[
    For i = 0 To j 'cherche l'intervalle où se trouve valeur par rapport à plage
        If valeur < chessboard(i) Then
            INTERVAL = i '0 étant en dehors de plage
            Exit Function
        End If
    Next i
End If

End Function

A cela deux problèmes :

le tableau "chessboard" ne contient que 10 valeurs, même si je sélectionne une range de plus de 10 cellules

la fonction se limite donc à comparer une valeur parmi seulement 10, dommage de se limiter

peut-on construire un tableau à l'aide d'une variable qui serait le nombre de valeur à tester?

si les valeurs sont dans le désordre, le résultat n'as plus de sens

233




700
233
500
1
10000

je doit inciter l'utilisateur à ranger ses valeurs de manière croissante

comment vérifier si mes valeurs sont bien rangées?

Merci à tous,

en espérant avoir été clair dans mes explications et dans mon code

je suis ouvert à toutes critiques constructives en dehors des questions que j'ai posées qui pourraient améliorer cette fonction

bonjour,

proposition d'adaption de ta fonction

Function INTERVAL( _
    valeur, _
    plage As Range, _
    Optional include = 1)

    'vérification de la plage
    ci = -1E+99
    For Each cell In plage
        If cell < ci Then
            INTERVAL = "plage non triée"
            Exit Function
        ElseIf cell = ci Then
            INTERVAL = "plage contient des valeurs identiques"
            Exit Function
        End If
        ci = cell.Value
    Next cell

' recherche de l'intervalle
    k = 0
    For Each cell In plage
        k = k + 1
        If (cell >= valeur And include = 1) Or (cell > valeur And include = 2) Then
            INTERVAL = k - 1
            Exit Function
        End If
    Next cell
    INTERVAL = k

End Function

Je me sens humilié...

Merci Acide Sulfurique

Encore une petite chose,

je souhaiterais ajouter un parametre optionel que je nommerais NULL

le but étant de ne pas prendre en compte des cellules vides dans la plage quand ceci serait utile pour l'utilisateur

dans cet exemple :

233


-245
500870

la fonction renvoie normalement "plage non triée"

mais avec le parametre NULL, la fonction renverrais 2

tout en conservant bien entendus les erreurs d'ordre croissant et de doublons

bonsoir,

une proposition adaptée

Function INTERVAL( _
    valeur, _
    plage As Range, _
    Optional include = 1, _
    Optional nullallowed = 0)

    'vérification de la plage
    ci = -1E+99
    For Each cell In plage
        If Not (nullallowed = 1 And cell = "") Then
            If cell < ci Then
                INTERVAL = "plage non triée"
                Exit Function
            ElseIf cell = ci Then
                INTERVAL = "plage contient des valeurs identiques"
                Exit Function
            End If
            ci = cell.Value
        End If
    Next cell

    ' recherche de l'intervalle
    k = 0
    For Each cell In plage
        If Not (nullallowed = 1 And cell = "") Then
            k = k + 1
            If (cell >= valeur And include = 1) Or (cell > valeur And include = 2) Then
                INTERVAL = k - 1
                Exit Function
            End If
        End If
    Next cell

    INTERVAL = k

End Function

Je trouve désormais cette fonction complète

Merci

Rechercher des sujets similaires à "function interval"