Filtrer une matrice et l'ordonner

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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:
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

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
924
G
Retour