Microsoft 365 somme.si en excluant les doublons

  • Initiateur de la discussion Initiateur de la discussion sebsti34
  • Date de début Date de début

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 !

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

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...
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
 
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 !!!
 
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
 
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.
 
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+
 
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.
 
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

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

Dernière édition:
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?
 
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+
 
- 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
2
Affichages
311
Réponses
4
Affichages
402
Réponses
1
Affichages
249
Réponses
6
Affichages
401
Retour