Rang selon plusieurs critéres

Bonjour à Toutes et tous !

Une fois de plus j'aurais besoin de votre aide précieuse !

Je dois utiliser la fonction "=rang(" pour trier des données selon plusieurs critères.

Le fichier en PJ représente les numéros de commande par date (aaaammjj) et par client (pivot). Un client peut passer plusieurs commandes par jour et j'aurais besoin d'affecter un rang par commande en fonction de la date et du client. (le vrai fichier de travail fait 250k lignes ...)

A noter que les numéros de commande sont croissants dans le temps (la 41293732 étant passée avant la 41293777). J'ai besoin que l'ordre du rang soit dans l'ordre croissant des commandes (de la plus ancienne à la plus récente)

J'ai bien essayé d'utiliser le calcul matricielle et la somme.prod mais je bute sur l'ordre croissant des commandes.

Peut être qu'une âme charitable et surtout plus talentueuse que moi saura m'aider ....

A votre bon cœur ...

D'avance merci.

Cordialement.

LASpiro.

42test.xlsx (20.70 Ko)

Bonjour,

=SOMMEPROD(--($C$2:$C$625=C2)*($B$2:$B$625=B2)*($A$2:$A$625<A2))+1

donnera le rang de la facture pour le même client dans la même journée.

Cordialement.

Bonjour MFerrand,

Merci beaucoup pour ta réponse !!

Néanmoins j'ai oublié de préciser ( et apparemment ça a son importance) un numéro de commande peut être plusieurs fois sur une même journée en fonction du nombre d'article commandé.

De ce fait mes rangs ne sont pas de 1 en 1 mais de 1 en 8 en 5 en 14 .... en fonction du nombre d'article commandé...

Vois tu une alternative à ce léger problème ?

Désolé de cet oubli ...

Et d'avance merci bcp !

Cordialement.

33test2.xlsx (14.76 Ko)

Je vois que tu n'as pas essayé la formule !

Si si je l'ai essayé.

Les rangs dans le fichier test2 sont issues de ta formule. j'ai copié en valeur pour vérifier les résultats.

Dans le premier fichier de test j'avais supprimé les doublons et quand je l'ai fait sur le fichier brut je n'ai pas de rang 2 car les numéros de commandes existent en plusieurs fois.

35test2.xlsx (14.76 Ko)

Tu me remets le même fichier, sans la formule ! C'est tout de même un peu fort ! Comment pourrais-tu constater que la formule donne les résultats que tu attends si tu la laisses de côté !

Bonjour MFerrand,

Excuse moi pour cette réponse tardive mais j'étais en week-end et nos amis de la SNCF n'ont pas facilité mon retour.

Ci-joint le fichier de test où j'ai laissé cette fois la formule pour que tu puisse constater par toi même

A ta disposition pour de plus amples information...

39test2.xlsx (18.42 Ko)

Bonsoir,

La formule donne parfaitement le bon résultat ! Quoi d'autre ?

Bonsoir,

Je pense qu'il y a une légère incompréhension entre le résultat attendu et obtenu dans ce cas.

si je prends l'exemple de la commande 41293777 sont rang est bien le "1" par contre ce que je souhaitais est que la commande 41293778 affiche le rang "2" et non "9" parce que la commande 41293777 existe 8 fois.

Il faudrait que l'incrémentation soit de 1 en 1 peu importe le nombre de fois qu'un même numéro de commande existe.

Vois tu ce que je souhaite ?

D'avance merci !!

Bonsoir,

J'avais bien signalé que la formule renvoyait la même valeur que la fonction RANG, si celle-ci avait pu être utilisée. Il m'avait semblé que c'était ce que tu voulais d'ailleurs, mais ce n'est apparemment pas le cas...

Faire ce que tu demandes en formules est un peu compliqué , même en utilisant plusieurs colonnes...

NB.SI n'accepte que des plages de cellules, et refuse des matrices calculées, et FREQUENCE serait d'un emploi malaisé... On va donc opérer de façon plus simple par VBA .

Sub RangClientJour()
    Dim aa, rng(), i%, r%
    With ActiveSheet.Range("A1").CurrentRegion
        .Sort key1:=.Cells(1, 2), key2:=.Cells(1, 3), key3:=.Cells(1, 1), _
         order1:=xlAscending, order2:=xlAscending, order3:=xlAscending, _
         Header:=xlYes
        aa = .Value
    End With
    ReDim rng(1 To UBound(aa), 0)
    For i = 2 To UBound(aa)
        If aa(i, 2) = aa(i - 1, 2) And aa(i, 3) = aa(i - 1, 3) Then
            If aa(i, 1) <> aa(i - 1, 1) Then r = r + 1
            rng(i, 0) = r
        Else
            r = 1: rng(i, 0) = r
        End If
    Next i
    rng(1, 0) = "Rang"
    ActiveSheet.Range("E1").Resize(UBound(aa)).Value = rng
End Sub

Beaucoup moins compliqué qu'avec formules, aussi simpliste que si on numérotait à la main !

Cordialement.

36laspiro-test2.xlsm (24.69 Ko)

Formidable !!

Merci bcp pour ta patience et ton talent !

Bonne continuation.

Rechercher des sujets similaires à "rang criteres"