Classement données avec doublons selon leur importance
Bonjour,
Je coince sur le sujet suivant :
J'ai une banque de données dans mesure et je souhaite retourner pour chaque ville un classement des mesures selon leur importance.
Dans un premier temps je fais la petite valeur qui me classe les importances dans le bon ordre mais après je n'arrive pas à joindrel nom de la mesure à son importance surtout quand il y a des doublons.
Merci d'avance
Bonjour Aloze4,
Voyez si le fichier joint peut vous aider
=SI(D$1="";"";INDIRECT(ADRESSE(EQUIV($B4;$Mesures.$A$1:$A$52;0);D$1+1;4;1;"Mesures");1))=SI(EST.IMPAIR(COLONNE());"";GRANDE.VALEUR($Mesures.$1:$1;SI(MOD(COLONNE();2)=0;(COLONNE()-2)/2;"")))
Bonjour,
je te propose 2 solutions différentes avec des fonctions personnalisées.
bonjour njhub
une fonction matricielle (plus performante)
=trimesure(libelles;mesures) à valider par ctrl-shift-Enter
où libelles est la plage contenant les libellés des mesures et où mesures est la plage contenant les mesures.
avant d'introduire cette instruction il faut sélectionner la plage qui recevra le résultat
Function trimesure(libelles,mesures)
'fonction matricielle renvoie un vecteur trié
'trie une ligne de mesures en ordre décroissant et leur libellé associé dans un vecteur
Dim vs, lib, mes, i1&, i2&, t
lib = libelles.Value
mes = mesures.Value
ReDim vs(1 To 1, 1 To 2 * UBound(mes, 2))
If UBound(lib, 2) <> UBound(mes, 2) Then Exit Function
For i1 = LBound(mes, 2) To UBound(mes, 2) - 1
For i2 = i1 + 1 To UBound(mes, 2)
If mes(1, i1) < mes(1, i2) Then
t = lib(1, i1): lib(1, i1) = lib(1, i2): lib(1, i2) = t
t = mes(1, i1): mes(1, i1) = mes(1, i2): mes(1, i2) = t
End If
Next i2
Next i1
For i1 = LBound(mes, 2) To UBound(mes, 2)
If mes(1, i1) <> 0 Then
vs(1, (i1 - 1) * 2 + 1) = lib(1, i1)
vs(1, i1 * 2) = mes(1, i1)
End If
Next i1
trimesure = vs
End Functionou
une fonction classique(moins performante mais sans doute plus simple à mettre en oeuvre)
=libmes(libelles;mesures;rang;champ)
où libelles est la plage contenant les libellés des mesures
où mesures est la plage contenant les mesures
où rang est le rang de la valeur recherchée
où champ est soit "mesure" soit "libelle" pour indiqué si l'on souhaite le libellé ou la mesure correspondant à ce rang.
Function libmes(libelles, mesures, rang, Optional champ = "libelle")
'retourne le libellé ou la mesure en position rang après tri
Dim vs, lib, mes, i1&, i2&,t
lib = libelles.Value
mes = mesures.Value
If UBound(lib, 2) <> UBound(mes, 2) Then Exit Function
For i1 = LBound(mes, 2) To UBound(mes, 2) - 1
For i2 = i1 + 1 To UBound(mes, 2)
If mes(1, i1) < mes(1, i2) Then
t = lib(1, i1): lib(1, i1) = lib(1, i2): lib(1, i2) = t
t = mes(1, i1): mes(1, i1) = mes(1, i2): mes(1, i2) = t
End If
Next i2
Next i1
If champ = "mesure" Then
libmes = mes(1, rang)
Else
libmes = lib(1, rang)
End If
End Function
Bonjour,
2 propositions à étudier.
Réalisé avec Power Query, natif Excel 2016.
Cdlt.