Microsoft 365 VBA : Calculer la date de fin de trimestre

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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
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
 
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é 🙂
 
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
 
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
 
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 !
 
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 🙂 !
 
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:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
74
Réponses
3
Affichages
235
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
246
Réponses
4
Affichages
359
Retour