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

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

  • Terrier-test1.xlsm
    17.4 KB · Affichages: 7
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

Hasco

XLDnaute Barbatruc
Repose en paix
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

  • Terrier-test1.xlsm
    24.4 KB · Affichages: 15

terrier

XLDnaute Junior
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.
 

terrier

XLDnaute Junior
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

  • Terrier-test2.xlsx
    17.1 KB · Affichages: 8

Hasco

XLDnaute Barbatruc
Repose en paix
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:

Hasco

XLDnaute Barbatruc
Repose en paix
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
 

job75

XLDnaute Barbatruc
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

  • Terrier-test(1).xlsm
    22.9 KB · Affichages: 0
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 714
Messages
2 112 144
Membres
111 440
dernier inscrit
foret_noire