Help ! Prescription d'un trimestre !

Law

XLDnaute Junior
Bonjour le forum,

Je travaille dans un organisme social et bute sur le problème suivant.

En fonction de la date du jour (et donc le trimestre en cours), j'aimerais connaître à tout moment la période potentiellement concernée par un contrôle, ceci sachant que :
a) les cotisations des trimestres civils sont exigibles au dernier jour du mois suivant la fin du trimestre (le 1er trimestre N est exigible le 30/04/N ; le 2ème le 31/07/N ; le 3ème le 30/09/N ; le 4ème le 31/01/N+1).
b) la période pouvant faire l'objet d'un contrôle ne peut excéder 3 ans.

3 exemples (pour être plus compréhensible) :

1. Aujourd'hui, nous sommes le 2 mai 2008. Il s'agit donc du 2ème trimestre 2008 (2T2008). Ce trimestre sera exigible le 31/07/2008. Et bien le trimestre le plus ancien sur lequel nous puissions remonter pour effectuer un contrôle est donc le 2ème trimestre 2005 (2T2005). Pour le 1er trimestre 2005 (qui était exigible le 30/04/2005), il est donc trop tard car le 30/04/2008 est dépassé.

2. Admettons que nous soyons le 28 avril 2008. Il s'agit toujours du 2ème trimestre 2008 (2T2008), trimestre qui est exigible le 31/07/2008. Là, le trimestre le plus ancien que nous pouvons contrôler sera le 1er trimestre 2005, celui-ci étant exigible le 30/04/2005, il ne sera prescrit que dans 2 jours (le 30 avril 2008).

3. Admettons que nous soyons le 15 janvier 2008. Cette date correspond au 1er trimestre 2008 (1T2008), exigible le 30/04/2008. La, le contrôle peut remontrer jusqu'au 4ème trimestre 2004, celui-ci étant exigible le 31/01/2005. Le 4ème trimestre 2004 pourra faire l'objet d'un contrôle jusqu'au 31/01/2008 inclu.

Je vous joins en PJ le début de mes laborieux travaux...
J'espère être compréhensible, et je vous remercie par avance pour votre aide ! :)
 

Pièces jointes

  • Test.xls
    33.5 KB · Affichages: 50
  • Test.xls
    33.5 KB · Affichages: 52
  • Test.xls
    33.5 KB · Affichages: 51

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Bonjour Law

regarde le code ci dessous, si j'ai bien compris les calculs à effectuer :

Code:
Sub test2()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)
Select Case t
    Case 1
        madate1 = DateSerial(Year(Date), 1, 1)
        madate2 = DateSerial(Year(Date), 3, 31)
    Case 2
        madate1 = DateSerial(Year(Date), 4, 1)
        madate2 = DateSerial(Year(Date), 6, 30)
    Case 3
        madate1 = DateSerial(Year(Date), 7, 1)
        madate2 = DateSerial(Year(Date), 9, 30)
    Case 4
        madate1 = DateSerial(Year(Date), 10, 1)
        madate2 = DateSerial(Year(Date), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DatePart("q", DateAdd("yyyy", -3, madate1), 2, 2) & "T" & Year(DateAdd("yyyy", -3, madate1))
Range("C6").Value = DateSerial(Year(madate2), Month(madate2) + 2, 0)
End Sub

bonne journée
@+
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re

attention, la date de référence doit être renseignée en C1, si tu veux que ce soit la date du jour, rajoute la ligne de code ci dessous :

Code:
[B]Range("C1").Value = Date[/B]
madate = Range("C1").Value

@+
 

Law

XLDnaute Junior
Re : Help ! Prescription d'un trimestre !

Bonjour Law

regarde le code ci dessous, si j'ai bien compris les calculs à effectuer :

Code:
Sub test2()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)
Select Case t
    Case 1
        madate1 = DateSerial(Year(Date), 1, 1)
        madate2 = DateSerial(Year(Date), 3, 31)
    Case 2
        madate1 = DateSerial(Year(Date), 4, 1)
        madate2 = DateSerial(Year(Date), 6, 30)
    Case 3
        madate1 = DateSerial(Year(Date), 7, 1)
        madate2 = DateSerial(Year(Date), 9, 30)
    Case 4
        madate1 = DateSerial(Year(Date), 10, 1)
        madate2 = DateSerial(Year(Date), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DatePart("q", DateAdd("yyyy", -3, madate1), 2, 2) & "T" & Year(DateAdd("yyyy", -3, madate1))
Range("C6").Value = DateSerial(Year(madate2), Month(madate2) + 2, 0)
End Sub

bonne journée
@+

Bonjour Pierrot93,
Avant tout, merci de me venir en aide.
J'ai recopié ton code et l'ai adapté en transformant simplement les Ranges C en Range B pour coller à mon modèle (résultats dans la colonne "B").

Voilà ce que j'ai relevé :

1. Si en B1 (C1 dans ton code), on saisit par exemple en date du jour le 05/01/2008, en date de début du contrôle, la macro renvoie le 1T2005. Or, ce devrait être le 4T2004, celui-ci étant exigible le 31/01/2005, il reste encore 25 jours avant qu'il ne soit prescrit (il le sera le 31/01/2008).

2. Dans le même ordre d'idées, si en B1 (C1 dans ton code), on saisit par exemple en date du jour le 10/04/2008, en date de début du contrôle, la macro renvoie le 2T2005. La macro devrait renvoyer le 1T2005, car celui-ci est exigible le 30/04/2005, il reste encore 20 jours avant qu'il ne soit prescrit (il le sera le 30/04/2008).

3. Enfin, mais là c'est entièrement de ma faute car je ne m'y suis pas arrêté en expliquant mon problème, au niveau de la date de fin du contrôle (C6 dans ton code), la macro doit également tenir compte du fait qu'un trimestre devient exigible au dernier jour du mois suivant la fin du trimestre. Je m'explique en prenant l'exemple d'aujourd'hui. Nous sommes le 02/05/2008, il s'agit du 2T2008. Ce trimestre ne sera exigible que le 31/07/2008. Donc il ne peut pas entrer dans la période de contrôle. La macro, qui à l'heure actuelle renvoit "31/07/2008" (serait-il possible qu'elle renvoit un résultat au même format qu'en C5 ??) devrait dans l'exemple renvoyer le 1T2008 (qui est devenu exigible depuis le 30/04/2008).

J'espère que je me suis bien fait comprendre... :((
Si tu as besoin de davantage d'informations, surtout n'hésites pas ! :)
Et merci une nouvelle fois !
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re

code modifié pour C5 et C6, mais pas tout compris sur le calcul de la "fin étendue controle".... sans doute à revoir..

Code:
Sub test2()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)

Select Case t
    Case 1
        madate1 = DateSerial(Year(Date), 1, 1)
        madate2 = DateSerial(Year(Date), 3, 31)
    Case 2
        madate1 = DateSerial(Year(Date), 4, 1)
        madate2 = DateSerial(Year(Date), 6, 30)
    Case 3
        madate1 = DateSerial(Year(Date), 7, 1)
        madate2 = DateSerial(Year(Date), 9, 30)
    Case 4
        madate1 = DateSerial(Year(Date), 10, 1)
        madate2 = DateSerial(Year(Date), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DatePart("q", DateAdd("yyyy", -3, DateAdd("m", -1, madate1)), 2, 2) & "T" & Year(DateAdd("yyyy", -3, DateAdd("m", -1, madate1)))
Range("C6").Value = DatePart("q", DateAdd("m", 1, madate2), 2, 2) & "T" & Year(DateAdd("m", 1, madate2))
End Sub

@+
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re

j'ai re modifié le code comme suit, il restait à tort des appels à la fonction "date" :

Code:
Sub test()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)

Select Case t
    Case 1
        madate1 = DateSerial(Year(madate), 1, 1)
        madate2 = DateSerial(Year(madate), 3, 31)
    Case 2
        madate1 = DateSerial(Year(madate), 4, 1)
        madate2 = DateSerial(Year(madate), 6, 30)
    Case 3
        madate1 = DateSerial(Year(madate), 7, 1)
        madate2 = DateSerial(Year(madate), 9, 30)
    Case 4
        madate1 = DateSerial(Year(madate), 10, 1)
        madate2 = DateSerial(Year(madate), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DatePart("q", DateAdd("yyyy", -3, DateAdd("m", -1, madate1)), 2, 2) & "T" & Year(DateAdd("yyyy", -3, DateAdd("m", -1, madate1)))
Range("C6").Value = DatePart("q", DateAdd("m", 1, madate2), 2, 2) & "T" & Year(DateAdd("m", 1, madate2))
End Sub

@+
 

Law

XLDnaute Junior
Re : Help ! Prescription d'un trimestre !

Re

j'ai re modifié le code comme suit, il restait à tort des appels à la fonction "date" :

Code:
Sub test()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)

Select Case t
    Case 1
        madate1 = DateSerial(Year(madate), 1, 1)
        madate2 = DateSerial(Year(madate), 3, 31)
    Case 2
        madate1 = DateSerial(Year(madate), 4, 1)
        madate2 = DateSerial(Year(madate), 6, 30)
    Case 3
        madate1 = DateSerial(Year(madate), 7, 1)
        madate2 = DateSerial(Year(madate), 9, 30)
    Case 4
        madate1 = DateSerial(Year(madate), 10, 1)
        madate2 = DateSerial(Year(madate), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DatePart("q", DateAdd("yyyy", -3, DateAdd("m", -1, madate1)), 2, 2) & "T" & Year(DateAdd("yyyy", -3, DateAdd("m", -1, madate1)))
Range("C6").Value = DatePart("q", DateAdd("m", 1, madate2), 2, 2) & "T" & Year(DateAdd("m", 1, madate2))
End Sub

@+


Merci beaucoup pour ta collaboration Pierrot93.

Mais bouh, les 2 bugs suivants demeurent :

1. Dans ta macro, si en date de référence (C1) tu saisis la date du jour (02/05/2008), alors en date de début du contrôle (C5), la macro donne le 1T2005. Ce trimestre était exigible le 30/04/2005. Donc aujourd'hui le 02/05/2008, il est prescrit. La macro ne doit donc pas renvoyer le 1T2005 mais le 2T2005.

2. Pour ce qui concerne la "fin étendue contrôle", je me suis sans doute mal exprimé. En fait, pour qu'un trimestre puisse faire partie de la période de trois ans susceptible de faire l'objet d'un contrôle, il faut qu'il soit prescrit. S'il ne l'est pas, il ne peut pas faire l'objet d'un contrôle. En conséquence, aujourd'hui le 02/05/2008, nous sommes au cours du 2T2008. Ce trimestre ne sera exigible que le 31/07/2008. C'est donc seulement le 01/08/2008 qu'un contrôle pourra retenir ce trimestre dans sa période contrôlée. Mais à aujourd'hui le 02/05/2008, le trimestre le plus récent susceptible de faire l'objet d'un contrôle est le 1T2008, ce dernier étant prescrit depuis le 30/04/2008.

J'espère que cette fois je suis parvenu à me faire comprendre ! :)

Merci pour la modif de C6 (passage d'une date jj/mm/aaaa en date de trimestre type 2T2008) ! :)

Bonne journée à toi Pierrot !
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re

reprends le fichier d'origine que tu avais posté, et remplis plusieurs colonnes avec des dates différentes et les résultats attendus en fonction des differents cas. ce sera plus facile pour t'aider... car là je suis un peu perdu avec toutes ces dates...
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re

un truc m'échappe tout de même, à la vue de ton fichier, avec des dates de départ différentes 26/12/2007 et 05/01/2008 nous arrivons avec un début de controle identique... idem pour les 28/03/2008 et 30/04/2008... en l'état vois pas trop la règle à appliquer...
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re

je viens juste de comprende pour le "début controle", enfin je crois, à priori donne le résultat escompté :

Code:
Option Explicit
Sub test()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)

Select Case t
    Case 1
        madate1 = DateSerial(Year(madate), 1, 1)
        madate2 = DateSerial(Year(madate), 3, 31)
    Case 2
        madate1 = DateSerial(Year(madate), 4, 1)
        madate2 = DateSerial(Year(madate), 6, 30)
    Case 3
        madate1 = DateSerial(Year(madate), 7, 1)
        madate2 = DateSerial(Year(madate), 9, 30)
    Case 4
        madate1 = DateSerial(Year(madate), 10, 1)
        madate2 = DateSerial(Year(madate), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DateSerial(Year(madate2), Month(madate2) + 2, 0)

Range("C6").Value = DatePart("q", DateAdd("yyyy", -3, DateAdd("m", -1, madate)), 2, 2) & "T" & Year(DateAdd("yyyy", -3, DateAdd("m", -1, madate)))

End Sub

manque plus que la fin de contrôle...;

@+
 

Law

XLDnaute Junior
Re : Help ! Prescription d'un trimestre !

Re

je viens juste de comprende pour le "début controle", enfin je crois, à priori donne le résultat escompté :

Code:
Option Explicit
Sub test()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)

Select Case t
    Case 1
        madate1 = DateSerial(Year(madate), 1, 1)
        madate2 = DateSerial(Year(madate), 3, 31)
    Case 2
        madate1 = DateSerial(Year(madate), 4, 1)
        madate2 = DateSerial(Year(madate), 6, 30)
    Case 3
        madate1 = DateSerial(Year(madate), 7, 1)
        madate2 = DateSerial(Year(madate), 9, 30)
    Case 4
        madate1 = DateSerial(Year(madate), 10, 1)
        madate2 = DateSerial(Year(madate), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DateSerial(Year(madate2), Month(madate2) + 2, 0)

Range("C6").Value = DatePart("q", DateAdd("yyyy", -3, DateAdd("m", -1, madate)), 2, 2) & "T" & Year(DateAdd("yyyy", -3, DateAdd("m", -1, madate)))

End Sub

manque plus que la fin de contrôle...;

@+

Magnifique Pierrot, là tu as tout bon !
Je ne vais pas t'embêter davantage avec la date de fin de contrôle, ce que tu as fait est déjà énorme. Je trouverai bien une solution !
Merci encore, et bonne journée à toi (chez moi il est 00h27, on est le 03/05/08, je vais dormir ! :) )
Ciao ciao !
 

Pierrot93

XLDnaute Barbatruc
Re : Help ! Prescription d'un trimestre !

Re,

j'arrive au résultat.... enfin j'espère.... à tester dans tous les cas de figure.

Code:
Option Explicit
Sub test()
Dim t As Byte, madate As Date, madate1 As Date, madate2 As Date
madate = Range("C1").Value
t = DatePart("q", madate, 2, 2)
Range("C2").Value = t & "T" & Year(madate)
Select Case t
    Case 1
        madate1 = DateSerial(Year(madate), 1, 1)
        madate2 = DateSerial(Year(madate), 3, 31)
    Case 2
        madate1 = DateSerial(Year(madate), 4, 1)
        madate2 = DateSerial(Year(madate), 6, 30)
    Case 3
        madate1 = DateSerial(Year(madate), 7, 1)
        madate2 = DateSerial(Year(madate), 9, 30)
    Case 4
        madate1 = DateSerial(Year(madate), 10, 1)
        madate2 = DateSerial(Year(madate), 12, 31)
End Select
Range("C3").Value = madate1
Range("C4").Value = madate2
Range("C5").Value = DateSerial(Year(madate2), Month(madate2) + 2, 0)
Range("C6").Value = DatePart("q", DateAdd("yyyy", -3, DateAdd("m", -1, madate)), 2, 2) _
    & "T" & Year(DateAdd("yyyy", -3, DateAdd("m", -2, madate)))
Range("C7").Value = DatePart("q", DateAdd("q", 11, DateAdd("yyyy", -3, DateAdd("m", -1, madate))), 2, 2) _
    & "T" & Year(DateAdd("q", 11, DateAdd("yyyy", -3, DateAdd("m", -1, madate))))
End Sub

une bonne nuit à toi:rolleyes: et bonne fin d'après midi aux autres.
@+
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 976
dernier inscrit
kaizertv2001@gmailcom