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...
Bonjour sebsti34, le forum,

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+

J'ai bien compris à quoi correspondent les données dans G6 et donc j'ai modifié avec les numéros des colonnes correspondante et la plage correspondante, j'ai mis le code dans un module standard , mais j'ai #VALEUR qui s'affiche à la place de mon résultat
 
Si je souhaite faire la même chose sauf que ce n'est pas une somme d'une colonne avec des nombres que je veux mais plutot l'équivalent d'un nb.si pour connaitre le nb de case qui contiennent du texte tout en ne prenant pas en compte les fameux doublons, la modif se fait cette fois dans le code vb?
 
le nb de case qui contiennent du texte tout en ne prenant pas en compte les fameux doublons, la modif se fait cette fois dans le code vb?
Oui, utilisez cette fonction VBA :
VB:
Function MonNombre&(plage As Range, colNom%, colDate%)
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 tablo(i, colNom) <> "" Then d(tablo(i, colNom)) = ""
Next
MonNombre = d.Count
End Function
3 arguments suffisent.

Edit : code simplifié.
 

Pièces jointes

Dernière édition:
Oui, utilisez cette fonction VBA :
VB:
Function MonNombre&(plage As Range, colNom%, colDate%)
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 _
        MonNombre = MonNombre + 1: d(tablo(i, colNom)) = ""
Next
End Function
3 arguments suffisent.

Au Top!! ça fonctionne! un grand merci!
 
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. J'ai essayé de bricoler des trucs mais le vba c est vraiment pas mon truc. j'en suis aux formules simples dans excel 😉
A la base je ne pensais pas aller aussi loin mais du coup ça m'aide énormément.
 
Bonjour sebsti34,
Puis-je avoir un retour sur ma proposition sur un autre forum, avec les fonctions UNIQUE() et FILTRE() ?
Cdlt.

En fait ça fonctionnait sur le petit tableau d'exemple mais après ça ne fonctionnait plus suivant certains cas. si c'est le dernier doublon qui possède une date en principe ça allait, mais si c'est un doublon au milieux (par exemple le V3 et qu il y a en dessous un V4 et V5 etc) ça ne fonctionnait plus.
 
Re,
Bonjour à tous,
Il faut passer par XLD pour avoir un retour ! 😡
Sinon, la même réponse avec ton fichier sur XLD.
Cdlt.

iso4219.png
 

Pièces jointes

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 If Not d.exists(tablo(i, colNom)) _
        Then MaSomme = MaSomme + tablo(i, colSomme): d(tablo(i, colNom)) = ""
Next
End Function
Si l'on veut traiter toutes les dates après Date 1 donner une date éloignée à Date 2 (01/01/2030).
 

Pièces jointes

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 If Not d.exists(tablo(i, colNom)) _
        Then MaSomme = MaSomme + tablo(i, colSomme): d(tablo(i, colNom)) = ""
Next
End Function
Si l'on veut traiter toutes les dates après Date 1 donner une date éloignée à Date 2 (01/01/2030).
nikel, ça fonctionne parfaitement. merci beaucoup
 
- 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
17
Affichages
411
Réponses
9
Affichages
386
Réponses
4
Affichages
476
Réponses
2
Affichages
384
Réponses
1
Affichages
308
Réponses
5
Affichages
142
Retour