Intervalles de dates / comment savoir si une table contient un intervalle ?

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

je n'arrive pas à coder pour déterminer si un intervalle de dates est contenu dans un autre …
Pour faire simple, j'ai une feuille Base avec des données, classées par date et une feuille Passage qui présente la même structure.

J'arrive certes à déterminer une correspondance exacte en comptant les occurrences de Passage présentes dans Base grâce à un countif, voir le code en pièce jointe (d'ailleurs, encore merci au forum hier soir qui m'a aidé à voir mon erreur)

Mais mon souci vient de la notion d'intervalle de jours.
Je m'explique avec l'exemple joint :
Dans Base, les données vont du 5 janvier au 16 février 2012
Dans Passage, les données vont du 9 février au 11 février 2012

Mais comme mon code cherche une correspondance exacte et que les journées du 9, du 10 et du 11 février de la feuille Passage ne sont pas présentes dans Base, je remonte un résultat erroné, alors qu'à l'évidence, d'un point de vue des dates, Passage est bien inclus dans Base …

Quelqu'un a-t-il une idée comment gérer cette affaire d'intervalle ?

PS : le fichier joint est simplifié à l'extrème, à la fois pour une meilleure visibilité et une question de poids. Dans la réalité, il est énorme, tant en lignes qu'en colonnes, c'est pourquoi je dois passer par du code pour intégrer le résultat à un traitement régulier
 

Pièces jointes

  • Forum_gestion_dates.xlsm
    20 KB · Affichages: 53
G

Guest

Guest
Re : Intervalles de dates / comment savoir si une table contient un intervalle ?

Bonjour,

Pas sûr d'avoir tout suivi mais s'il s'agit de savoir si la cellule parcourrue par la boucle se trouve entre le début et la fin de base, un simple test devrait suffire pour compter

Code:
For Each Cellule In PeriodePassage
    Compteur = Compteur + Abs(Cellule >= DateBaseDepuis And Cellule <= DateBaseJusqua)
Next

A+

[Edit] Bonjour Sousou

Attn! ci-dessus les dates mini et maxi sont comprises dans l'interval! >= et <= à toi de voir!
 
Dernière modification par un modérateur:

sousou

XLDnaute Barbatruc
Re : Intervalles de dates / comment savoir si une table contient un intervalle ?

Bonjour
Pourquoi ne pas utiliser ceci?

For Each Cellule In PeriodePassage
If Cellule > DateBaseDepuis And celule < DateBaseJusqua Then
Compteur = Compteur + 1
' compteur = Compteur + Application.CountIf(PeriodeBase, Cellule)
End If
Next


Bonjour Hasco
 

job75

XLDnaute Barbatruc
Re : Intervalles de dates / comment savoir si une table contient un intervalle ?

Bonjour Sebast, sousou,

Fichier joint avec les plages définies dynamiquement Date1 et Date2.

Edit : salut Hasco

A+
 

Pièces jointes

  • Forum_gestion_dates(1).xls
    53 KB · Affichages: 39

Sebast

XLDnaute Impliqué
Re : Intervalles de dates / comment savoir si une table contient un intervalle ?

Bonjour Hasco, Sousou et job75,

merci pour votre aide, vous m'avez bien dépanné.

Hasco : ça marche parfaitement mais pour ne pas mourir idiot, pourquoi ABS ? J'en étais resté sur le fait ABS donnait la valeur absolue, mais ici quel besoin ?

Sousou : ça ne renvoie pas le bon résultat quand par exemple, pour tester, je mets dans Passage l'année 2025. Le test renvoie 3 entrées. De plus, pourquoi une cote devant compteur ? J'avoue ne pas saisir comment le calcul peut se faire si on occulte l'instruction ?

job75 : code très compact, qui fait le job !

à +
 

ROGER2327

XLDnaute Barbatruc
Re : Intervalles de dates / comment savoir si une table contient un intervalle ?

Bonjour à tous.


En complément des diverses remarques judicieuses déjà faites, remarquons qu'on peut trouver de nombreuses variantes à :​
VB:
    For Each Cellule In PeriodePassage
        compteur = compteur + Abs(Cellule >= DateBaseDepuis And Cellule <= DateBaseJusqua)
    Next
Par exemple :​
VB:
    For Each Cellule In PeriodePassage
        If (Cellule >= DateBaseDepuis And Cellule <= DateBaseJusqua) = True Then compteur = compteur + 1
    Next

    For Each Cellule In PeriodePassage
        If (Cellule >= DateBaseDepuis) = True And (Cellule <= DateBaseJusqua) = True Then compteur = compteur + 1
    Next

    For Each Cellule In PeriodePassage
        If (Cellule >= DateBaseDepuis) * (Cellule <= DateBaseJusqua) = 1 Then compteur = compteur + 1
    Next

    For Each Cellule In PeriodePassage
        If (Cellule >= DateBaseDepuis) = -1 And (Cellule <= DateBaseJusqua) = -1 Then compteur = compteur + 1
    Next

    For Each Cellule In PeriodePassage
        compteur = compteur - (Cellule >= DateBaseDepuis And Cellule <= DateBaseJusqua)
    Next

    For Each Cellule In PeriodePassage
        compteur = compteur + (Cellule >= DateBaseDepuis) * (Cellule <= DateBaseJusqua)
    Next


ℝOGER2327
#7123


Mercredi 25 Décervelage 141 (Saint Petiot, expert - fête Suprême Quarte)
3 Pluviôse An CCXXII, 5,4029h - fragon
2014-W04-3T12:58:01Z
 

Sebast

XLDnaute Impliqué
Re : Intervalles de dates / comment savoir si une table contient un intervalle ?

Re,

job75 : effectivement très rapide mais la différence ne se fera pas sur ce code car pas de boucle entrainant des itérations interminables.

Hasco : je comprends mieux

Roger2327 : avec ces précisions, je comprends désormais mieux les remarques de Hasco, dont le code "intégrait" directement le test. Je crois que je vais utiliser ta proposition, peut-être pas la plus compacte mais je la comprends parfaitement et pourrai donc la remployer ultérieurement.

Un grand merci à vous tous
 

Discussions similaires

Réponses
15
Affichages
1 K

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof