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 | |||||
1 | 250 | 500 | 7800 | 10000 |
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 | ||||
-24 | 5 | 500 | 870 |
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