Ne pas compté les doublons sauf 0

Résolu
Erakmur -  
 Erakmur -
Bonjour,

http://www.cjoint.com/c/GHwm2l7P0gL

Bonjour,
Je bloque sur une formule Excel. Dans le fichier joint, dans la cellule G9 de l’onglet EST, il y a une formule SOMMEPROD. Je souhaiterai que quand dans la colonne A de l’onglet Formule DI il y a un doublons de numéro (hors 0), qu’un seul numéro soit compté.
Exemple : Si le numéro 302 489 apparait plusieurs fois, seul 1 seul est comptabilisé, peu importe lequel.
En revanche, tous les numéros 0 sont comptés.
Quelqu’un a-t-il une solution ?
Cordialement

7 réponses

  1. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bon,jour

    Mon PC ne me donne pas l'accès à cjoint .
    A défaut de voir votre modèle, voyez si vous pouvez tirer quelque chose de cet exemple, et si problème déposez votre fichier sur le site où vous avez trouvé le mien
    à vous lire
    https://mon-partage.fr/f/1cjpLk8x/
    crdlmnt

    La qualité de la réponse dépend surtout de la clarté de la question, merci!
    0
    1. Erakmur
       
      Voici le fichier via ton site https://mon-partage.fr/f/vEz8vovS/

      Je pense que ta formule va multiplier le nombre et pas compter le nombre de cellule concernée. Avec le fichier, cela sera plus parlant je pense
      0
  2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonour effectivement c'est un peu lus complexe
    compte tenu du volume de données traitées, j'hésite à creuser ça en matricielle et en plus je ne suis pas sur de trouver et je ne peux vous donner qu'un conseil
    ajouter une colonne dans la feuille Formule DI, par exemple en L avec cette formule:
    =SI(OU(NB.SI($A$2:A2;A2)>1=1;A2=0);1;0)
    attention au blocage du 1° A2et pas du second dans les limites de champ

    et rajoutez une condition à votre formule SOMMEPROD: ...*(L2:L40000=1)

    à moins que quelqu'un trouve mieux ce qui reste fort possible

    crdlmnt
    0
    1. Erakmur
       
      L'idée de créer un colonne en plus peut être bonne mais le résultat de ta formule n'est pas correcte je pense. La formule doit afficher 1 si la colonne A = 0. S'il y a un seul nombre unique différent de 0, elle affiche 1. Pour les cellules vides, elle affiche rien. Jusque la, c'est pas trop dur mais si il y a plusieurs nombres identiques différents de 0, elle doit afficher la première occurrence à 1 et les autres rien et là c'est plus difficile.
      0
  3. mdo100 Messages postés 126 Date d'inscription   Statut Membre Dernière intervention   22
     
    Bonjour Erakmur, Vaucluse,

    Je ne peux pas ouvrir les fichiers joints.

    Toutefois je tente ma chance.

    Dans la colonne "A" de "A2 à A50"
    Formule matricielle a valider avec ctrl + maj + entrée

    =NBVAL($A$2:$A$50)-SOMME(N(NB.SI($A$2:$A$50;$A$2:$A$50)=1))+NB.SI($A$2:$A$50;"=0")

    Cordialement.
    0
    1. Erakmur
       
      Bonjour,

      Voici le fichier joint https://mon-partage.fr/f/vEz8vovS/
      Ta formule donne un chiffre bcp trop élevé quand je l'applique. Sans mon fichier, tu ne pourra comprendre la problématique.
      0
  4. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour à tous

    Peut être avec une petite macro (sur ma vieille machine, elle met moins d'une seconde pour trouver les 16329 valeurs sans doublon et 17737 en y ajoutant les 0)

    Const FFDI As String = "Formule DI"
    Const lideb As Byte = 2
    Const coNOT As String * 1 = "A"
    
    Public Function NbNumOT() As Long
    Dim li As Long, lifin As Long, nb As Long
    Dim dico As Object, cle, valeur As Long, cles, valeurs, nbcles As Long
    Set dico = CreateObject("scripting.dictionary")
    nb = 0
    With Sheets(FFDI)
      lifin = .Range(coNOT & Rows.Count).End(xlUp).Row
      For li = lideb To lifin
        cle = .Range(coNOT & li).Value
        If cle <> "" Then
          If dico.exists(cle) Then
            If cle = 0 Then
              dico(cle) = dico(cle) + 1
              nb = nb + 1
            End If
          Else
            dico.Add cle, 1
            nb = nb + 1
          End If
        End If
      Next li
    End With
    nbcles = dico.Count
    NbNumOT = nb
    End Function

    Cdlmnt
    0
    1. Erakmur
       
      Bonjour,
      Je vais simplifier le problème en m'inspirant des remarques de Vaucluse. Dans la colonne L de l'onglet Formule DI, il me faudrait une macro ou une fonction excel qui fasse la chose suivante:

      La formule doit afficher 1 si la colonne A = 0. S'il y a un seul nombre unique différent de 0, elle affiche 1. Pour les cellules vides, elle affiche rien. Jusque la, c'est pas trop dur mais si il y a plusieurs nombres identiques différents de 0, elle doit afficher la première occurrence à 1 et les autres rien et là c'est plus difficile. Ainsi voici l'exemple:
      Colonne A Colonne L
      1 1
      2 1
      3 1
      4 1
      1
      1
      5 1
      6 1
      5

      7 1
      7
      9 1
      10 1
      0 1
      0 1
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    =--SI(ET(A2=0;A2<>"");1;EQUIV(A2;A:A;0)=LIGNE()) 

    La prochaine fois met un fichier de 50 lignes, ça suffit.
    18 Mo, compressé en .rar que tout le monde n'a pas en plus, ça dissuade...
    eric
    0
    1. Erakmur
       
      Bonjour,
      Au début, je n'ai pas eu cette idée d'où le fichier complet. C'est après la lecture de Vaucluse que je me suis dit que le problème pouvait être réduit à quelque chose de bcp plus simple.
      0
  7. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    il y avait effectivement juste une petite coquille dans la formule (c'est ma spécialité):

    =SI(OU(NB.SI($A$2:A2;A2)=1;A2=0);1;0)

    peut être à compléter pour les lignes sans N° et sans 0, pour qu'elle n'affiche pas 1 (c'est au choix)
    :

    =SI(A2="";"";SI(OU(NB.SI($A$2:A2;A2)=1;A2=0);1;0))

    crdlmnt
    0
  8. Erakmur
     
    Les solutions de vaucluse et d'eriiic fonctionnent très bien. J'ai donc modifié l'onglet EST en conséquence en rajoutant *('Formule DI'!$L$2:$L$40000=1) à la formule du sommeprod. J'ai modifié la formule de Vaucluse en =SI(A2="";"0";SI(OU(NB.SI($A$2:A2;A2)=1;A2=0);1;0)) sinon, il y avait 3 solutions possibles.
    0
    1. Erakmur
       
      Merci à tout les 3 !
      0