Filtrer une matrice et l'ordonner

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'ai une colonne contenant des chiffres (glycémies).
Il peut y avoir des cases vides (glycémies omises...).
Dans une fonction je suis parvenu à mettre dans une matrice (Gli(i)) toutes les glycémies.
Si je cherche Gli(3), la fonction me donne la 3ème glycémie.
Supposons que la 4ème glycémie corresponde à une case vide (glycémie pas faite), alors Gli(4)=0.
Supposons que la 5ème glycémie ait été elle faite, Gli(5) prendra forcément la valeur de la 5ème glycémie, mais en fait, comme la glycémie précédente n'existe pas, je voudrais que Gli(5) soit en fait Gli(4) avec évidemment la valeur de Gli(5).
En d'autres termes, je voudrais me débarrasser de toutes les glycémies nulles (une glycémie n'est jamais nulle, car sinon on est mort !).
Ensuite, je voudrais, une fois les Gli(i) épurés, les ordonner par valeurs croissantes afin de pouvoir par la suite calculer la médiane des glycémies.
Certes il existe une fonction incorporée dans Excel donnant celle-ci, le problème avec les glycémies, c'est qu'au delà d'une certaine valeur, l'appareil renvoie "Hi"...

Je joins un exemple simplifié de la feuille.
La fonction se dénomme "MedianaGlicemias" et se trouve dans le module "Fonctions".

Merci pour toute aide.
 

Pièces jointes

  • Glycémies Lucien6test.zip
    36.7 KB · Affichages: 51
C

Compte Supprimé 979

Guest
Re : Filtrer une matrice et l'ordonner

Salut Magic Doctor ;)

Tu peux essayer ce code, voir si cela te convient ;)
Code:
Function MedianaGlicemias(NomPlage As String, Optional Année As Integer = 0, Optional JourSemaine As Byte = 0) As Double
  Dim año As Integer, mes As Variant, nbjm As Byte
  Dim total As Byte, Plage, cell As Range
  Dim I As Byte, J As Byte
  Dim Gli()
 
  If Année = 0 Then año = Year(Now) Else año = Année
  mes = Right(Left(NomPlage, Len(NomPlage) - 1), Len(Left(NomPlage, Len(NomPlage) - 1)) - 9)
  Select Case mes
  Case "Enero": mes = 1
  Case "Febrero": mes = 2
  Case "Marzo": mes = 3
  Case "Abril": mes = 4
  Case "Mayo": mes = 5
  Case "Junio": mes = 6
  Case "Julio": mes = 7
  Case "Agosto": mes = 8
  Case "Septiembre": mes = 9
  Case "Octubre": mes = 10
  Case "Noviembre": mes = 11
  Case "Diciembre": mes = 12
  End Select
  nbjm = Day(DateSerial(año, mes + 1, 0))
  Set Plage = Range(NomPlage)
  For Each cell In Plage
    'essai infructueux...
    If cell.Value = "" Or cell.Value = 0 Then
      ' On ne fait rien
    Else
      I = I + 1
      'Redimensionner le tableau au fur et à mesure des valeurs
      ' en préservant celles existantes
      ReDim Preserve Gli(I) As Variant
      Gli(I) = cell.Value
      If UCase(Gli(I)) = "HI" Then Gli(I) = [Hi].Value
    End If
  Next cell
 
  ' Trier les valeurs
  'algorithme de tri (type BubbleSort) pour des petits tableaux
  'restitue le tableau trié
  Dim K%, tmp
  For I = LBound(Gli) To UBound(Gli)
    J = I
    For K = J + 1 To UBound(Gli)
      If Gli(K) <= Gli(J) Then J = K
    Next K
    If I <> J Then
      tmp = Gli(J): Gli(J) = Gli(I): Gli(I) = tmp
    End If
  Next I
  MedianaGlicemias = Gli(10)
End Function

A+
 
Dernière modification par un modérateur:

Magic_Doctor

XLDnaute Barbatruc
Re : Filtrer une matrice et l'ordonner

Bonjour,

Maintenant ça marche, grâce à l'aide du Forum et surtout de Bernard (pas du tout évident d'ordonner une matrice ; algorithme assez obscur pour le profane...).

L'intérêt de la médiane est de pouvoir obtenir un résultat qui, dans bien des cas, sera plus objectif que la moyenne. Recensez par exemple un échantillon de la population selon l'âge des individus, pour peu que se glissent quelques rares centenaires, la moyenne des âges en sera pas mal affectée, ce qui ne sera pas le cas avec la médiane des âges.

Dans cette feuille tous les calculs se font uniquement par fonctions, facilement utilisables dans d'autres applications.

Malheureusement je n'ai toujours pas réussi à faire en sorte que le PopUp reste collé au commandButton quand celui-ci l'appelle. Bernard m'avait donné une solution (autre fil) que je n'ai pas réussi à mettre en place. Peut-être cette fois-ci s'il me lit.

Bonne fin d'après-midi.
 

Pièces jointes

  • Glycémies Lucien6.zip
    47.6 KB · Affichages: 60

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 263
Membres
103 498
dernier inscrit
FAHDE