Microsoft 365 nombre de valeur unique en fonction de 2 critères

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 !

terrier

XLDnaute Junior
Bonjour à tous,
Avec un niveau bien basique en Excel je sèche devant une fonction très compliqué pour moi.
j'ai trouver quelque solution qui conviens à mon problème, mais ça continue d’évoluer, et c'est pour ça je reviens vers vous pour une solution plus souple.
Mon problème est le suivant :
Je souhaiterais calculer le nombre de livraison uniques "Sortie" pour chaque régions.
De même façon je vais faire avec les produits.
Avec les 2 critère que je site :
-la colonne type doit être une "Entrée"
-La colonne Régions doit correspondre à la colonne i

Capture.PNG

Le résultat que j'ai obtenue jusqu'à présent (en rouge) c'est avec cette formule =NBVAL(INDEX(UNIQUE(FILTRE(Tableau2[[Regions]:[Liv]];Tableau2[Regions]=I3;""));;1))
Merci par avance pour votre aide.
Cordialement.
 

Pièces jointes

Solution
Re bonjour,

Voici à parti de la cellule i18
En fait avec la fonction FILTRE si vous avez plusieurs critères ET vous pouvez dans le deuxième paramètres de la fonction, multiplier les test (PalgeCellules1="Valeur")*(PlageCellules2="Autre valeurs")
Remplace le signe * par un + si ce sont des OU.
NBVAL(UNIQUE(FILTRE(Tableau2[Prod];(Tableau2[[Regions]:[Regions]]=$I18)*(Tableau2[Type]="Sortie"))))

Par contre dans votre demande sur l'autre fil vous parliez de "Entrée" comme critère de type mais votre exemple montrait plutôt "Sortie". Juste un mot à changer éventuellement.


Cordialement
Re bonjour,

Voici à parti de la cellule i18
En fait avec la fonction FILTRE si vous avez plusieurs critères ET vous pouvez dans le deuxième paramètres de la fonction, multiplier les test (PalgeCellules1="Valeur")*(PlageCellules2="Autre valeurs")
Remplace le signe * par un + si ce sont des OU.
NBVAL(UNIQUE(FILTRE(Tableau2[Prod];(Tableau2[[Regions]:[Regions]]=$I18)*(Tableau2[Type]="Sortie"))))

Par contre dans votre demande sur l'autre fil vous parliez de "Entrée" comme critère de type mais votre exemple montrait plutôt "Sortie". Juste un mot à changer éventuellement.


Cordialement
 

Pièces jointes

Re bonjour,

Voici à parti de la cellule i18
En fait avec la fonction FILTRE si vous avez plusieurs critères ET vous pouvez dans le deuxième paramètres de la fonction, multiplier les test (PalgeCellules1="Valeur")*(PlageCellules2="Autre valeurs")
Remplace le signe * par un + si ce sont des OU.


Par contre dans votre demande sur l'autre fil vous parliez de "Entrée" comme critère de type mais votre exemple montrait plutôt "Sortie". Juste un mot à changer éventuellement.


Cordialement
Re,
Merci beaucoup, rapide et efficace et je suis désolé pour le retard je n’étais pas devant mon PC.
-Je viens d'apprendre quelques truc a propos la fonction Filtre et merci encore une fois d’être bien explicite.
-Oui j'ai pas fais attention je voulais bien écrire "Sortie" à la place de "Entrée".
Encore merci.
 
Bonjour,
je ne sais si vous aurez le temps de vérifier avec moi cette formule.
Je viens de découvrir une faille dans la formule, par contre je ne sais pas d’où ça viens exactement et qu'est ce que je doit faire pour la combler.
L’orque je change la dernière ligne de BD (Provence-Alpes-Côte d'Azur) "Entrée" au lieu de "Sortie", la formule ne prend pas en compte ce changement qui doit être 0 et non pas 1 comme l'indique l'image.
Alors que le critère "Sortie" est bien renseigné dans la formule :
=NBVAL(UNIQUE(FILTRE(Tableau2[Liv];(Tableau2[[Regions]:[Regions]]=$I20)*(Tableau2[Type]="Sortie"))))
Capture.PNG

Merci d'avance pour votre aide.
Terrier
Cordialement
 

Pièces jointes

Bonsoir,

Lorsque vous avez des formules imbriquées qui montrent une faiblesse, vous pouvez utiliser les outils du groupe 'Vérification des formules' de l'onglet 'Formules' ou alors décomposer les imbrications.

Dans le fichier joint en I14 j'ai mis la partie de la formule qui commence à UNIQUE(....)
La fonction FILTRE renvoie une erreur lorsqu'elle ne trouve rien et que son dernier paramètre (si vide) n'est pas renseigner. On pourrait y mettre 0 ou "" mais se serait encore compté comme une valeur par NBVAL au même titre que l'erreur.

La solution est de renvoyer le nombre de lignes uniques filtrées avec la fonction LIGNES et tester si erreur ou non :

=SIERREUR(LIGNES(UNIQUE(FILTRE(Tableau2[Liv];(Tableau2[[Regions]:[Regions]]=$I20)*(Tableau2[Type]="Sortie"))));0)


Je vous laisse corriger sur le fichier

Cordialement
 
Dernière édition:
Bonjour,

Ne pas oublier que SIERREUR peut cacher des erreurs non prévues et qu'on aurait pu éviter.
Dans un premier temps de tests divers et variés 🙂 je m'en passerai. Une fois que je serai sûr de la fonction, je remettrai SIERREUR

Cordialement
 
Bonsoir terrier, Hasco,

Voici une solution VBA, elle utilise 2 Dictionary :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, d As Object, dd As Object, i&, x$, n&, a, resu(), nn&
tablo = [Tableau2] 'tableau structuré
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
'---liste des régions---
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    If Not d.exists(x) Then
        d(x) = n 'mémorise la position de la ligne
        n = n + 1
    End If
Next i
'---tableau des résultats---
If n Then 'si le tableau n'est pas vide
    a = d.keys
    ReDim resu(UBound(a), 2) 'base 0
    For i = 0 To UBound(a)
        resu(i, 0) = a(i) '1ère colonne
    Next i
    For i = 1 To UBound(tablo)
        If tablo(i, 5) = "Sortie" Then
            x = tablo(i, 1) & Chr(1) & tablo(i, 2)
            If Not dd.exists(x) Then
                dd(x) = ""
                nn = d(tablo(i, 1)) 'récupère la position de la ligne
                resu(nn, 1) = resu(nn, 1) + 1 'comptage en 2ème colonne
            End If
        End If
    Next i
    dd.RemoveAll 'RAZ
    For i = 1 To UBound(tablo)
        If tablo(i, 5) = "Sortie" Then
            x = tablo(i, 1) & Chr(1) & tablo(i, 3)
            If Not dd.exists(x) Then
                dd(x) = ""
                nn = d(tablo(i, 1)) 'récupère la position de la ligne
                resu(nn, 2) = resu(nn, 2) + 1 'comptage en 3ème colonne
            End If
        End If
    Next i
End If
'---restitution---
Application.EnableEvents = False 'désactive les évènements
With [I3] '1ère cellule de destination, à adapter
    If n Then .Resize(n, 3) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
Edit : le séparateur Chr(1) dans la concaténation n'est pas indispensable ici.

Je l'ai mis parce que dans d'autres cas il peut être nécessaire.

A+
 

Pièces jointes

Dernière édition:
- 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
4
Affichages
356
Retour