Somme de Nb Jours, Si Compris entre 2 dates

systmd

XLDnaute Occasionnel
Bonsoir,

Je cherche à récuperer le nombre de jour de plusieurs périodes en fonction d'une plage de 12 mois.

[edit] PJ
Merci
 
Dernière édition:

mth

XLDnaute Barbatruc
Re : Somme de Nb Jours, Si Compris entre 2 dates

Bonsoir,

Pas sûre du tout d'avoir compris la question ... :eek:
A tout hasard est-ce que cette formule irait ?

Code:
=SOMMEPROD((B12:B15>=B2)*(C12:C15<=C2)*(D12:D15))

Bonne soirée,

mth
 

ROGER2327

XLDnaute Barbatruc
Re : Somme de Nb Jours, Si Compris entre 2 dates

Bonsoir systmd, mth
Ceci, peut-être ?
Code:
[COLOR=DarkSlateGray][B]=SOMME(SI(SI(C12:C15<C$2;C12:C15;C$2)-SI(B12:B15>B$2;B12:B15;B$2)>0;SI(C12:C15<C$2;C12:C15;C$2)-SI(B12:B15>B$2;B12:B15;B$2);))[/B][/COLOR]
(Formule évidemment matricielle.)
ROGER2327
#4690


Vendredi 6 Sable 138 (Saint Navet et Perruque, humanistes, SQ)
16 Frimaire An CCXIX
2010-W49-1T22:58:33Z
 

systmd

XLDnaute Occasionnel
Re : Somme de Nb Jours, Si Compris entre 2 dates

Bonsoir ROGER2327,BCharef


Impécable :), mais j'aurais aimé une formule sans passer par les matricielles.

Je suppose que c'est du coté de SOMMEPROD qu'il faille regarder.

Merci à tous les deux, en tout cas pour les formules. ;)
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Somme de Nb Jours, Si Compris entre 2 dates

Re...
Je n'ai rien trouvé pour éviter une formule matricielle, même avec SOMMEPROD. Mais les vrais spécialistes de la formule (dont je ne suis pas) n'ont peut-être pas dit leur dernier mot…
Attendons.
ROGER2327
#4691


Vendredi 6 Sable 138 (Saint Navet et Perruque, humanistes, SQ)
16 Frimaire An CCXIX
2010-W49-1T23:20:32Z
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Somme de Nb Jours, Si Compris entre 2 dates

Suite …
On peut aussi envisager une fonction personnalisée :
Code:
[COLOR=DarkSlateGray][B]Function toto(d1, d2, p1 As Range, p2 As Range)
Dim i&, x&, wf
  toto = ""
  If p1.Rows.Count <> p2.Rows.Count Then Exit Function
  Set wf = Application.WorksheetFunction
  For i = 1 To p1.Rows.Count
    x = x + wf.Max(0, wf.Min(d2, p2.Cells(i, 1)) - wf.Max(d1, p1.Cells(i, 1)))
  Next i
  toto = x
End Function[/B][/COLOR]
Dans votre exemple,
Code:
[COLOR=DarkSlateGray][B]=toto(B2;C2;B12:B15;C12:C15)[/B][/COLOR]
renverra 102.
ROGER2327
#4692


Vendredi 6 Sable 138 (Saint Navet et Perruque, humanistes, SQ)
16 Frimaire An CCXIX
2010-W49-1T23:50:45Z
 

systmd

XLDnaute Occasionnel
Re : Somme de Nb Jours, Si Compris entre 2 dates

Ah oui!... ;)

Effectivement c'est une solution et celà sera beaucoup plus simple à l'utilisation.
je vais donc l'adopter.


Merci beaucoup, bon boulot.

Bonne soirée, euh.... matinée maintenant :)
 

systmd

XLDnaute Occasionnel
Re : Somme de Nb Jours, Si Compris entre 2 dates

Bonjour à tous

Aprés plusieurs test il subsiste une erreur.
il manque un jour à chaque décompte car les dates sont incluses

j'ai corrigé comme suit

Code:
Function toto(d1, d2, p1 As Range, p2 As Range)
Dim i&, x&, wf
  toto = ""
  If p1.Rows.Count <> p2.Rows.Count Then Exit Function
  Set wf = Application.WorksheetFunction
  For i = 1 To p1.Rows.Count
    x = x + wf.Max(0, wf.Min(d2, p2.Cells(i, 1)) - wf.Max(d1, p1.Cells(i, 1))[COLOR="Red"] +1 )

   ' en cas d'absence de date pour éviter 366
   If p1.Cells="" or  p1.Cells="" then 
      toto = ""
      Exit Function
      End If[/COLOR]
  Next i
  toto = x
End Function

[résolu]
Merci encore
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Somme de Nb Jours, Si Compris entre 2 dates

Re…
Je ne vous suis pas bien, là. En mettant votre fonction corrigée dans votre classeur, elle renvoie… …une erreur.
ROGER2327
#4697


Samedi 7 Sable 138 (Saint Birbe, juge, SQ)
17 Frimaire An CCXIX
2010-W49-2T16:46:02Z
 

Pièces jointes

  • Copie de Test sur les dates2.zip
    22.9 KB · Affichages: 42

systmd

XLDnaute Occasionnel
Re : Somme de Nb Jours, Si Compris entre 2 dates

Bonsoir ROGER2327

Voilà la bonne version je pense

Code:
Function NbJourPlage(d1, d2, p1 As Range, p2 As Range)
Dim i&, x&, wf
  NbJourPlage = ""
  If p1.Rows.Count <> p2.Rows.Count Then Exit Function
  Set wf = Application.WorksheetFunction
  For i = 1 To p1.Rows.Count
      x = x + wf.Max(0, wf.Min(d2, p2.Cells(i, 1)) - wf.Max(d1, p1.Cells(i, 1)) + 1)
    If (p1.Cells(i, 1) = "") Or (p2.Cells(i, 1) = "") Then
        NbJourPlage = ""
        Exit Function
        End If

  Next i
  NbJourPlage = x
End Function

en mode matricielle
Code:
=SOMME(SI(SI(C12:C15<C$2;C12:C15;C$2)-SI(B12:B15>B$2;B12:B15;B$2)+1>0;SI(C12:C15<C$2;C12:C15;C$2)-SI(B12:B15>B$2;B12:B15;B$2)+1;))
 

ROGER2327

XLDnaute Barbatruc
Re : Somme de Nb Jours, Si Compris entre 2 dates

Re…
Compris !
Toujours le problème des intervalles et des poteaux.

Pour ce qui est de la gestion d'éventuelles erreurs, je propose ceci :
Code:
[COLOR=DarkSlateGray][B]Function toto(d1, d2, p1 As Range, p2 As Range)
Application.Volatile
Dim i&, x&, wf
  toto = ""
  If p1.Rows.Count <> p2.Rows.Count Then Exit Function
  Set wf = Application.WorksheetFunction
  For i = 1 To p1.Rows.Count
    If IsDate(p1.Cells(i, 1)) And IsDate(p2.Cells(i, 1)) Then x = x + wf.Max(0, wf.Min(d2, p2.Cells(i, 1)) - wf.Max(d1, p1.Cells(i, 1)) + 1)
  Next i
  toto = x
End Function[/B][/COLOR]
qui permet de traiter un tableau incomplet en ignorant les lignes incomplètes ou mal remplies.
ROGER2327
#4700


Dimanche 8 Sable 138 (Conception du Père Ubu (AJ), SS)
18 Frimaire An CCXIX
2010-W49-3T00:14:16Z
 

Discussions similaires

Réponses
15
Affichages
428
Réponses
9
Affichages
532