Microsoft 365 VBA : Calculer la date de fin de trimestre

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Je n'arrive pas à dérouler la date de fin trimestre sur 10 ans par rapport à la date paramétrée.
En fait, je ne trouve pas de fonction VBA qui calcule cette date. Voici mon code :
VB:
Sub Trimestre()


Dim iMonth As Integer
    iMonth = Int((Month(Sheets("Paramétrage").Cells(3, 3).Value) - 1) / 3) * 3 + 4


Sheets("Paramétrage").Cells(12, 2).Value = EOQuarter = DateSerial(Year(Sheets("Paramétrage").Cells(3, 3).Value), iMonth, 0)
 
If Month(Sheets("Paramétrage").Cells(3, 3).Value) >= 1 And Month(Sheets("Paramétrage").Cells(3, 3).Value) <= 3 Then
Sheets("Paramétrage").Cells(12, 1).Value = "T1"
End If


If Month(Sheets("Paramétrage").Cells(3, 3).Value) > 3 And Month(Sheets("Paramétrage").Cells(3, 3).Value) <= 6 Then
Sheets("Paramétrage").Cells(12, 1).Value = "T2"
End If
 
 
If Month(Sheets("Paramétrage").Cells(3, 3).Value) > 6 And Month(Sheets("Paramétrage").Cells(3, 3).Value) <= 9 Then
Sheets("Paramétrage").Cells(12, 1).Value = "T3"

End If
 
 
If Month(Sheets("Paramétrage").Cells(3, 3).Value) > 9 And Month(Sheets("Paramétrage").Cells(3, 3).Value) <= 12 Then
Sheets("Paramétrage").Cells(12, 1).Value = "T4"
End If
 
 
 
End Sub

J'ai joint le fichier xlsm avec les résultats attendus.
 

Pièces jointes

  • Paramétrage.xlsm
    13.2 KB · Affichages: 12
Solution
Bonsoir @VBA_dev_Anne_Marie,

Pour ce que j'en ai compris, essayez le code qui suit.
La constante NbreTrimestres représente le nombre de trimestres à afficher (ici 40 car 10 ans c'est 40 trimestres)
Le code :
VB:
Sub Ntrimestres()
Const NbreTrimestres = 40
Dim d1 As Date, i As Long
   With Sheets("Paramétrage")
      .Range(.Range("a12"), .Range("a12").End(xlDown)).Resize(, 2).Clear
      d1 = .Range("c3")
      ReDim res(1 To NbreTrimestres, 1 To 2)
      For i = 1 To NbreTrimestres
         res(i, 2) = DateSerial(Year(d1), 1 + 3 * Format(d1, "q") + (i - 1) * 3, 1) - 1
         res(i, 1) = "T" & Format(res(i, 2), "q")
      Next i
      .Range("a12").Resize(NbreTrimestres, 2) = res
   End With
End Sub

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonsoir,
en formule Excel :
si une date est saisie en A1
en B1, la formule pour obtenir le dernier jour du trimestre peut être :
VB:
=DATE(ANNEE(A1);(ENT((MOIS(A1)-1)/3)+1)*3+1;1)-1

Ci joint le classeur Excel avec une fonction personnalisée (à tester bien sûr)

VB:
Public Function DJDT(d) As Date
Rem Fonction calculant le Dernier Jour Du Trimestre
DJDT = DateSerial(Year(d), (Int((Month(d) - 1) / 3) + 1) * 3 + 1, 1) - 1

End Function

Bonne soirée
Bonjour,
Je n'arrive pas à appeler votre fonction pour tester :
1671138108289.png
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
j'y ai pas pensé!

le géni c'est des chose simple auquel personne a pensé!

VB:
Dim T As Integer
T = Format(Sheets("Paramétrage").Cells(3, 3).Value, "Q")
 
Debug.Print DateSerial(Year(d), (T * 3) + 1, 1) - 1 'dernier jour du trimestre!
Sheets("Paramétrage").Cells(12, 1).Value = mapomme
Merci MaPomme
Le code retourne des erreurs, si vous avez d'autres idées, je suis preneuse car j'ai toujours pas trouvé :)
 

Phil69970

XLDnaute Barbatruc
Re

c'est-à-dire que c'est pas en cliquant que ma date doit changer.
Je dois calculer ça pour 100 feuilles

Et c'est au 20eme message que tu le dis !!!

Un fichier avec 100 feuilles et bien je dis erreur de conception !!
Et tu as 100 feuilles de paramétrage !

Si sur toutes les feuilles sont identiques tu fais une boucle sur chaque feuilles avec mon fichier que tu mets dans un module

@Phil69970
 

patricktoulon

XLDnaute Barbatruc
re
je laisse le fichier exemple au cas ou ça intéresse quelqu'un
il y a aussi une formule ultra simplifié pour calculer l'index de trimestre aussi

il suffit de changer la date en C3 et le tableau bleu change et se calcule tout seul
 

Pièces jointes

  • Paramétrage.xlsm
    15.2 KB · Affichages: 1

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @VBA_dev_Anne_Marie,

Pour ce que j'en ai compris, essayez le code qui suit.
La constante NbreTrimestres représente le nombre de trimestres à afficher (ici 40 car 10 ans c'est 40 trimestres)
Le code :
VB:
Sub Ntrimestres()
Const NbreTrimestres = 40
Dim d1 As Date, i As Long
   With Sheets("Paramétrage")
      .Range(.Range("a12"), .Range("a12").End(xlDown)).Resize(, 2).Clear
      d1 = .Range("c3")
      ReDim res(1 To NbreTrimestres, 1 To 2)
      For i = 1 To NbreTrimestres
         res(i, 2) = DateSerial(Year(d1), 1 + 3 * Format(d1, "q") + (i - 1) * 3, 1) - 1
         res(i, 1) = "T" & Format(res(i, 2), "q")
      Next i
      .Range("a12").Resize(NbreTrimestres, 2) = res
   End With
End Sub
 

dysorthographie

XLDnaute Accro
VB:
Sub test()
Sheets("Paramétrage").Cells(12, 1).Value = DateFinTrimestre(Sheets("Paramétrage").Cells(3, 3).Value)
End Sub

Function DateFinTrimestre(d As Date) As Date
Dim T As Integer: T = Format(d, "q")
DateFinTrimestre = DateSerial(Year(d), (T * 3) + 1, 1) - 1
End Function
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonsoir @VBA_dev_Anne_Marie,

Pour ce que j'en ai compris, essayez le code qui suit.
La constante NbreTrimestres représente le nombre de trimestres à afficher (ici 40 car 10 ans c'est 40 trimestres)
Le code :
VB:
Sub Ntrimestres()
Const NbreTrimestres = 40
Dim d1 As Date, i As Long
   With Sheets("Paramétrage")
      .Range(.Range("a12"), .Range("a12").End(xlDown)).Resize(, 2).Clear
      d1 = .Range("c3")
      ReDim res(1 To NbreTrimestres, 1 To 2)
      For i = 1 To NbreTrimestres
         res(i, 2) = DateSerial(Year(d1), 1 + 3 * Format(d1, "q") + (i - 1) * 3, 1) - 1
         res(i, 1) = "T" & Format(res(i, 2), "q")
      Next i
      .Range("a12").Resize(NbreTrimestres, 2) = res
   End With
End Sub
Oui,
J'étais sur ce code :
Sub MesTrimestre()
Dim x As Long
Dim MaDate As Date
MaDate = Sheets("Paramétrage").Cells(3, 3).Value

For x = 0 To 40
Cells(x + 12, 1) = "T" & WorksheetFunction.RoundUp((Month(DateAdd("m", x * 3, MaDate))) / 3, 0) & "-" & Year(DateAdd("m", x * 3, MaDate))
Next x

End Sub

Mais le votre est complet ! Pourriez-vous le commenter pour que je puisse mieux comprendre ?
Merci !
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonsoir @VBA_dev_Anne_Marie,

Pour ce que j'en ai compris, essayez le code qui suit.
La constante NbreTrimestres représente le nombre de trimestres à afficher (ici 40 car 10 ans c'est 40 trimestres)
Le code :
VB:
Sub Ntrimestres()
Const NbreTrimestres = 40
Dim d1 As Date, i As Long
   With Sheets("Paramétrage")
      .Range(.Range("a12"), .Range("a12").End(xlDown)).Resize(, 2).Clear
      d1 = .Range("c3")
      ReDim res(1 To NbreTrimestres, 1 To 2)
      For i = 1 To NbreTrimestres
         res(i, 2) = DateSerial(Year(d1), 1 + 3 * Format(d1, "q") + (i - 1) * 3, 1) - 1
         res(i, 1) = "T" & Format(res(i, 2), "q")
      Next i
      .Range("a12").Resize(NbreTrimestres, 2) = res
   End With
End Sub
Bonjour,

Pourriez-vous m'expliquer la fonction DateSerial, s'il vous plaît ?

Merci beaucoup :) !
 

dysorthographie

XLDnaute Accro
Bonjour,
DateSerial te retourne une date valide en fonction du nombre d'années,du nombre de mois et du nombre de jours !

J'ai bien dit nombre !
Code:
msgbox DateSerial(2023,1,1)
Msgbox DateSerial(2023,13,1)
Msgbox DateSerial(2023,1,366)
Msgbox DateSerial(Year(date)+1,1,1)
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
180

Statistiques des forums

Discussions
314 716
Messages
2 112 161
Membres
111 447
dernier inscrit
jasontantane