Microsoft 365 Gérer les doublons de la fonction "RANG"

Nicolas M

XLDnaute Nouveau
Bonsoir,

Je mets plusieurs dates dans les cellules d'une même ligne (par exemple de B9 à H9).
Dans la ligne du dessus (B8 à H8) j'utiliser la fonction rang pour avoir l'ordre de classement de ces diverses dates (=RANG(B9;$B$9:$H$9;1))).
Comme certaines dates sont identiques, elles apparaissent avec le même ordre de rang (deux fois le rang 4 par exemple) ce qui a pour effet de rompre la continuité dans les chiffres affichés.
Avoir deux cellules qui affichent un "ex-aequo" ne me gêne pas, mais je voudrais qu'il n'y ait pas de saut dans la numérotation.

Au lieu d'obtenir :

4463117
mercredi 20 décembre 1972mercredi 20 décembre 1972jeudi 20 décembre 1973dimanche 20 décembre 1970mardi 20 décembre 1966mardi 20 décembre 1966samedi 20 décembre 2008

Je voudrais :

3342115
mercredi 20 décembre 1972mercredi 20 décembre 1972jeudi 20 décembre 1973dimanche 20 décembre 1970mardi 20 décembre 1966mardi 20 décembre 1966samedi 20 décembre 2008
 

Phil69970

XLDnaute Barbatruc
Bonjour @Nicolas M

Comme tu as mis des images je te réponds en image c'est plus pratique pour nous 2.

Peut être comme ceci :

1724960535886.png


Qu'en penses tu ? ;)

C'est pas mal non ? 🤔
 

vgendron

XLDnaute Barbatruc
Hello @Nicolas M


Comme c'est ton premier message: déjà.. bienvenu
et ce que Phil veut te signifier, c'est que, plutot que poster une impression d'écran dont on ne pourra rien faire, il vaut mieux poster directement ton fichier anonymisé pour pouvoir travailler dessus et te proposer directement une solution (qu'on peut tester nous meme avant de te la soumettre)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bienvenue @Nicolas M sur XLD, @Phil69970 , @vgendron ,

Un fichier est indispensable...

Comme c'est votre premier message et par pure bonté (ça ne se produira que cette fois ci), un essai avec une formule pour Excel365.
  • si la ligne des dates est en ligne 1 à partir de la colonne 1 (comment le savoir sans fichier ?)
  • et si les dates sont supposées être des vraies dates au sens Excel et pas du texte (voilà aussi pourquoi un petit fichier est nécessaire),
alors la formule ci-dessous en A2 devrait le faire :
=EQUIV(A1:G1;TRIER(UNIQUE($A1:$G1;VRAI;FAUX);;1;VRAI);0)

Illustration sur le fichier à ma pomme :
1724975501546.png
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,
Pour ceux qui n'ont pas Excel365, on peut utiliser cette formule matricielle en A2 (à recopier vers la droite) :
VB:
=EQUIV(A1;SIERREUR(PETITE.VALEUR(SI((EQUIV($A1:$G1;$A1:$G1;0)=COLONNE($A1:$G1))*($A1:$G1)=0;"";(EQUIV($A1:$G1;$A1:$G1;0)=COLONNE($A1:$G1))*($A1:$G1));LIGNE(1:999));"");0)

mais il doit y avoir plus simple...

1724975710853.png
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Nicolas M, le forum,

Voyez le fichier .xlsm joint et cette fonction VBA :
VB:
Function RangX(v, tablo)
Dim d As Object, e, a
Set d = CreateObject("Scripting.Dictionary")
For Each e In tablo: d(CLng(e)) = "": Next
a = d.keys
tri a, 0, UBound(a)
RangX = Application.Match(CLng(v), a, 0)
End Function

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Le code doit être placé impérativement dans un module standard.

Formule en B8 à tirer vers la droite =RangX(B9;$B9:$H9)

Quesion : comment faites-vous pour obtenir des renvois à la ligne dans les cellules B9:H9 ?

A+
 

Pièces jointes

  • Fonction RangX.xlsm
    17.2 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Nicolas M :), bonjour à tous :),

Comme @job75 (à qui j'envoie un matinal bonjour :)) fait preuve d'une bonté encore plus grande que la mienne en fournissant un fichier, je ne saurais être en reste... :D

Dans le classeur joint, deux onglets "Vraies dates" et "Dates en texte" avec pour chacun des onglets une formule pour Excel-365 et une formule pour les autres versions.

Nota bene : on attend toujours votre propre classeur ... 🤨
 

Pièces jointes

  • Nicolas M- rang sans trou- v1.xlsx
    13.7 KB · Affichages: 3

Nicolas M

XLDnaute Nouveau
Bienvenue @Nicolas M sur XLD, @Phil69970 , @vgendron ,

Un fichier est indispensable...

Comme c'est votre premier message et par pure bonté (ça ne se produira que cette fois ci), un essai avec une formule pour Excel365.
  • si la ligne des dates est en ligne 1 à partir de la colonne 1 (comment le savoir sans fichier ?)
  • et si les dates sont supposées être des vraies dates au sens Excel et pas du texte (voilà aussi pourquoi un petit fichier est nécessaire),
alors la formule ci-dessous en A2 devrait le faire :
=EQUIV(A1:G1;TRIER(UNIQUE($A1:$G1;VRAI;FAUX);;1;VRAI);0)

Illustration sur le fichier à ma pomme :
Regarde la pièce jointe 1202645

Merci beaucoup pour votre aide. Cela fonctionne.
Et sans vouloir obtenir votre pardon, je n'ai pas téléchargé le fichier car il est dans un environnement sharepoint d'entreprise qui ne me permet que l'édition sans le téléchargement :). Mais j'aurais pu reproduire ces modestes lignes sur un fichier Excel ordinaire, vous avez raison. Merci à tous.
Nicolas.
 

Nicolas M

XLDnaute Nouveau
Bonjour Nicolas M, le forum,

Voyez le fichier .xlsm joint et cette fonction VBA :
VB:
Function RangX(v, tablo)
Dim d As Object, e, a
Set d = CreateObject("Scripting.Dictionary")
For Each e In tablo: d(CLng(e)) = "": Next
a = d.keys
tri a, 0, UBound(a)
RangX = Application.Match(CLng(v), a, 0)
End Function

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Le code doit être placé impérativement dans un module standard.

Formule en B8 à tirer vers la droite =RangX(B9;$B9:$H9)

Quesion : comment faites-vous pour obtenir des renvois à la ligne dans les cellules B9:H9 ?

A+
Merci pour votre aide. Je ne pratique pas encore le VBA, mais la démonstration, une fois encore, est faite qu'il me faudra vite y remédier :)
Nicolas.
 

Nicolas M

XLDnaute Nouveau
Bonjour @Nicolas M

Comme tu as mis des images je te réponds en image c'est plus pratique pour nous 2.

Peut être comme ceci :

Regarde la pièce jointe 1202623

Qu'en penses tu ? ;)

C'est pas mal non ? 🤔
C'est top ! Merci ;).
Je comprends tout à fait cette aimable et caustique remarque, dont je tiendrai compte pour l'avenir. Juste, comme je le disais dans une autre réponse, l'environnement du fichier ne me permettait pas de télécharger. Mais un modeste effort de ma part aurait suffit pour reproduire la formule dans un fichier standard.
Je garde l'image pour mon fond d'écran.
 

Nicolas M

XLDnaute Nouveau
Hello @Nicolas M


Comme c'est ton premier message: déjà.. bienvenu
et ce que Phil veut te signifier, c'est que, plutot que poster une impression d'écran dont on ne pourra rien faire, il vaut mieux poster directement ton fichier anonymisé pour pouvoir travailler dessus et te proposer directement une solution (qu'on peut tester nous meme avant de te la soumettre)

Merci pour ta sollicitude. Je comprends tout à fait cette légitime remarque dont je tiendrai compte à l'avenir. Simplement, le fichier ne pouvait être téléchargé, alors j'ai fait au plus vite avant de quitter le bureau. On ne m'y reprendra plus, promis.
 

job75

XLDnaute Barbatruc
D'après le post #1 Nicolas M utilise de vraies dates en B9:H9.

Je voudrais savoir s'il a trouvé le moyen de les formater avec des renvois à la ligne.

Perso dans le fichier joint je me contente de mettre la ligne 10 sous forme de textes :
Code:
=TEXTE(B9;"jjjj jj"&CAR(10)&"mmmm"&CAR(10)&"aaaa")
et de masquer la ligne 9.
 

Pièces jointes

  • Fonction RangX(1).xlsm
    17.3 KB · Affichages: 3

Discussions similaires

Réponses
3
Affichages
504

Membres actuellement en ligne

Statistiques des forums

Discussions
313 902
Messages
2 103 391
Membres
108 631
dernier inscrit
tarek.kanaan