Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
Bonjour,
Je n'arrive pas à appeler votre fonction pour tester :
 
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
 
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
 
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 !
 
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

Réponses
5
Affichages
235
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
169
Réponses
4
Affichages
177
Réponses
2
Affichages
201
Réponses
8
Affichages
466
  • Question Question
Microsoft 365 Problème de date
Réponses
5
Affichages
162
Réponses
10
Affichages
281
Réponses
3
Affichages
298
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…