XL 2013 Compter le nombre de samedi sans les doublons

@Tech

XLDnaute Nouveau
Bonjour,

J’ai besoin de votre aide car cela fait deux jours que je cherche une solution…
J'ai une colonne de dates comme celle qui suit:

Colonne C
03/09/2020
04/09/2020
05/09/2020 Samedi (doublon)
05/09/2020 Samedi (doublon)
06/09/2020
07/09/2020
12/09/2020 Samedi
13/09/2020
14/09/2020

Comment compter le nombre samedi en ignorant les doublons?
J’ai plus de 200 000 lignes et je suis sur Excel 2013.

Avec la formule ci-dessous je compte le nombre de samedi total mais avec les doublons…
=SOMMEPROD((JOURSEM(C1:C10)=7)*1)

Vous savez comment je peux faire ?

Merci d'avance, et bon week-end !
 
Solution
Re,

Une version v2 de la fonction avec deux paramètres:
=CompterSamediUnique(Plage As Range, Optional annee)
  • Plage est la zone des dates
  • annee est l'année concernée. Si annee est omis, alors on examine toutes les dates sans considération d'année.


Le code de la fonction :
VB:
Function CompterSamediUnique(Plage As Range, Optional annee)
Dim dico, xcell, t, i&, AN
   Application.ScreenUpdating = False
   AN = IIf(IsMissing(annee), "*", annee)
   Set dico = CreateObject("scripting.dictionary")
   t = Plage.Value
   For i = 1 To UBound(t)
      If t(i, 1) <> "" Then If IsDate(t(i, 1)) Then If Year(t(i, 1))...

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Tech, bienvenue sur XLD :),
Bonjour @njhub :)

Pour 200 000 lignes de dates, je pense qu'une fonction personnalisée est plus rapide.
La fonction dans la cellule F2:
VB:
=CompterSamediUnique1(C2:C200001)

Cliquez sur le bouton bleu pour initialiser 200 000 lignes de dates.

Le code de la fonction est dans module1:
VB:
Function CompterSamediUnique1(Plage As Range) As Long
Dim dico, xcell
   Set dico = CreateObject("scripting.dictionary")
   For Each xcell In Plage
      If xcell <> "" Then If IsDate(xcell) Then If Weekday(xcell) = 7 Then dico(CStr(xcell)) = ""
   Next xcell
   CompterSamediUnique1 = dico.Count
End Function
 

Pièces jointes

  • @Tech- Samedi Uniq- v1a.xlsm
    19.8 KB · Affichages: 21
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,
Une version plus rapide.
Code de la fonction:
VB:
Function CompterSamediUnique1(Plage As Range) As Long
Dim dico, xcell, t, i&
   Application.ScreenUpdating = False
   Set dico = CreateObject("scripting.dictionary")
   t = Plage.Value
   For i = 1 To UBound(t)
      If t(i, 1) <> "" Then If IsDate(t(i, 1)) Then If Weekday(t(i, 1)) = 7 Then dico(CStr(t(i, 1))) = ""
   Next i
   CompterSamediUnique1 = dico.Count
End Function
 

Pièces jointes

  • @Tech- Samedi Uniq- v1b.xlsm
    20.5 KB · Affichages: 9

@Tech

XLDnaute Nouveau
Bonjour à tous,

Merci pour votre réactivité et votre temps...

J'ai essayé avec la solution de njhub, cela fonctionne, mais c'est un peu lent...
La solution de mapomme fonctionne très bien et est beaucoup plus rapide...

Aussi, J'ai une autre question pour mapomme!
Serait il possible de filtrer l'année?
Ex:
Cellule F2 pour 2018
Cellule F3 pour 2019
Cellule F3 pour 2020

Merci d'avance pour votre patience :)
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Une version v2 de la fonction avec deux paramètres:
=CompterSamediUnique(Plage As Range, Optional annee)
  • Plage est la zone des dates
  • annee est l'année concernée. Si annee est omis, alors on examine toutes les dates sans considération d'année.


Le code de la fonction :
VB:
Function CompterSamediUnique(Plage As Range, Optional annee)
Dim dico, xcell, t, i&, AN
   Application.ScreenUpdating = False
   AN = IIf(IsMissing(annee), "*", annee)
   Set dico = CreateObject("scripting.dictionary")
   t = Plage.Value
   For i = 1 To UBound(t)
      If t(i, 1) <> "" Then If IsDate(t(i, 1)) Then If Year(t(i, 1)) Like AN Then If Weekday(t(i, 1)) = 7 Then dico(CStr(t(i, 1))) = ""
   Next i
   CompterSamediUnique = dico.Count
End Function
 

Pièces jointes

  • @Tech- Samedi Uniq- v2.xlsm
    20.2 KB · Affichages: 7

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 761
Messages
2 112 588
Membres
111 611
dernier inscrit
downex