Microsoft 365 somme.si en excluant les doublons

sebsti34

XLDnaute Nouveau
Bonjour,

après des heures à chercher et à faire des tests j'en appel aux pros

J'ai un fichier (celui que j'ai mis en exemple contient des données bidons car l'autre est une usine à gaz avec 700 lignes qui évoluent plusieurs fois par jour)

Je souhaiterais donc faire une somme de la colonne B, seulement si il y a une date en colonne D sans prendre en compte le doublon en colonne A. Dans mon tableau le bon résultat est donc 1400 et avec mes formules que j'ai testé je tombe toujours sur 1600 car je n'arrive pas à éliminer le doublon en A. Le chiffre en B sera toujours le même par rapport à la donnée en A donc peut importe quelle ligne est choisi pour la somme.
Je sais supprimer les doublons avec l'onglet données, mais je ne veux pas les supprimer, simplement ne pas les prendre en compte dans mon somme.si.
J'ai aussi essayé une formule avec SI(NB.SI afin d'afficher des 0 ou des 1 dans une colonne ajoutée à la fin mais le 1 s'ajoute bien sur le derniere doublon de la liste et c est pas forcément celui qui a une date en colonne D

quelqu'un pourrait me donner une piste?

Merci d'avance, bonne journée à tous.
 

Pièces jointes

  • exemple.xlsx
    9 KB · Affichages: 19
Solution
allez, pour aller encore un peu plus loin ... si je veux ajouter un critère de date pour que ça comptabilise uniquement entre telle date et telle date ou après telle date.
Voyez ce fichier (2) et la fonction VBA complétée avec 2 arguments supplémentaires facultatifs :
VB:
Function MaSomme#(plage As Range, colNom%, colDate%, colSomme%, Optional dat1 As Date, Optional dat2 As Date)
Dim d As Object, tablo, i&, dat, test As Boolean
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
tablo = plage 'matrice, plus rapide
For i = 1 To UBound(tablo)
    dat = tablo(i, colDate)
    test = IIf(dat1 And dat2, dat >= dat1 And dat <= dat2, True)
    If IsDate(tablo(i, colDate)) Then If test Then...

sebsti34

XLDnaute Nouveau
Re,


Parce que le NB.SI($B$5:$B9;$B9) de cette ligne va retourner 2 et non 1.
C'est pourquoi la sollution proposée en premier était correcte et pas la votre.
Vous avez voulu l'adapter sans la comprendre et cela donne un fil dont on ne se sort plus!

Cordialement
Je ne comprends pas pkoi vous dites qu il va retourner 2. Il retourne 0. la première solution ne fonctionne pas non plus sur le réel, enfin je ne réussi pas en tout cas
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Commencez par bien lire les réponses et essayez de les comprendre.

J'ai dit LE NB.SI ... va retourner 2 et non pas votre formule va retourner 2 !!!!

dans la plage B5:B9 NB.SI comptera 2 références égales = B9 !!!
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

PowerQuery est parfait pour la préparation d'un tableau de bord. Vous pouvez à peu près tout manipuler. Difficile à prendre en main au début, mais le jeu en vaut la chandelle.

Bon courage et apprentissage
 

sebsti34

XLDnaute Nouveau
bon après quelques investigations je pense que j'ai trouvé un des cas ou la formule ne fonctionne pas.
lorsque j'ai une V1, et une V2 en doublon (par rapport à ma colonne B) mais qui a une date (en colonne AH) c est bon.
Par contre lorsque j ai V1, V2, V3 et que j'ai une date sur la V2 mais pas la V3 alors ça ne fonctionne pas.
Merci à ceux qui se sont penchés sur le sujet.
 

job75

XLDnaute Barbatruc
Bonjour sebsti34, Roblochon, Sylvanu,

Je n'ai pas suivi mais d'après les essais que j'ai faits sur vos fichiers de test j'ai remarqué que les résultats par formules sont corrects si le tableau est trié d'abord sur les noms puis sur les dates.

A+
 

sebsti34

XLDnaute Nouveau
Bonjour sebsti34, Roblochon, Sylvanu,

Je n'ai pas suivi mais d'après les essais que j'ai faits sur vos fichiers de test j'ai remarqué que les résultats par formules sont corrects si le tableau est trié d'abord sur les noms puis sur les dates.

A+
le tableau est effectivement trié de base sur la colonne B. mais tous les jours des utilisateurs insère des liens au milieu avec des dates. ça fonctionne pas à 100%, c'est suivant les cas.
 

sebsti34

XLDnaute Nouveau
j'ai tenté un truc plus simple.
En pj un extract du tableau avec uniquement les colonnes qui nous importent.

J'essaye donc d'avoir une somme de la colonne B, seulement si il y a une date en D. mais dans la colonne A j'ai des doublons et je souhaiterais donc que la ligne ne soit prise en compte qu'une seule fois. la date en D n'est pas tjs en face de V1 mais parfois de V2, parfois Vx de la colonne C .

J'espère que c'est plus clair et sans ambiguïté.
 

Pièces jointes

  • reel2.xlsx
    39 KB · Affichages: 4

job75

XLDnaute Barbatruc
Voyez le fichier .xlsm joint et cette fonction VBA :
VB:
Function MaSomme#(plage As Range, colNom%, colDate%, colSomme%)
Dim d As Object, tablo, i&
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
tablo = plage 'matrice, plus rapide
For i = 1 To UBound(tablo)
    If IsDate(tablo(i, colDate)) Then If Not d.exists(tablo(i, colNom)) Then _
        MaSomme = MaSomme + tablo(i, colSomme): d(tablo(i, colNom)) = ""
Next
End Function
Le code doit être placé impérativement dans un module standard.

La fonction est utilisée en G6 et renvoie le résultat 57100,3.

Il n'est pas nécessaire que le tableau soit trié.

Edit : Je n'ai pas essayé de peaufiner : si la colonne B contient des textes la fonction renverra une erreur, c'est très bien car on sera averti.

Je ne me suis pas du tout occupé de la colonne C...
 

Pièces jointes

  • MaSomme(1).xlsm
    46.9 KB · Affichages: 8
Dernière édition:

sebsti34

XLDnaute Nouveau
Bonjour, effectivement cette solution fonctionne. Le résultat est bon, si j'insère des lignes comme cela arrive elles sont prises en compte donc bravo et merci.
Maintenant j'ai besoin de l'adapter à mon tableau qui contient des colonnes intermédiaires mais qui ne servent pas pour ce calcul. à quel niveau je dois faire des modifs svp?
 

job75

XLDnaute Barbatruc
Bonjour sebsti34, le forum,
à quel niveau je dois faire des modifs svp?
Ne pas touchze au code VBA.

Les modifs sont à faire éventuellement dans la formule de la feuille de calcul :

- 1er argument => référence de la plage contenant les données à traiter

- 2ème argument => n° de colonne des noms dans cette plage

- 3ème argument => n° de colonne des dates dans cette plage

- 4ème argument => n° de la colonne des nombres à sommer.

Vous devez absolument comprendre pourquoi j'ai mis 1;4;2 dans la formule en G6.

A+