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
Et en passant, la même en code VBA (ou tu passe en paramètre la cellule de la date Origine et la cellule de la cible ou mettre ta date de fin de trimestre

Code:
Sub Trimestre(Origine As Range, Target As Range)

    Dim AjusteAnnée As Integer
    Dim Année As Integer
    Dim Mois As Integer

    Année = Year(Origine.Value)

    ' Calcule du 1er du mois suivant le trimestre ... moins 1 jour
    '  => pour éviter d'avoir à calculer les 30 ou 31 possibles en fin de mois

    If Month(Origine.Value) > 9 Then
        AjusteAnnée = 1
        Else
        AjusteAnnée = 0
    End If
    
    Select Case Month(Origine.Value)
        Case 1, 2, 3
            Mois = 4
        Case 4, 5, 6
            Mois = 7
        Case 7, 8, 9
            Mois = 10
        Case Else
            Mois = 1
    End Select
    
    Target.Value = DateSerial(Année + AjusteAnnée, Mois, 1) - 1

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
 

Pièces jointes

Dernière édition:
bonsoir,
VB:
Dim d As Date
d = Format(Sheets("Paramétrage").Cells(3, 3).Value, "yyyy-mm-dd")
 'dernier jour du trimestre!
Debug.Print DateSerial(Year(d), (((Month(d) - (Month(d) Mod 3)) / 3 + Abs(CBool(Month(d) Mod 3))) * 3) + 1, 1) - 1

'T1 à T4
Sheets("Paramétrage").Cells(12, 1).Value = Array("", "T1", "T2", "T3", "T4")((Month(d) - (Month(d) Mod 3)) / 3 + Abs(CBool(Month(d) Mod 3)))
 
Dernière édition:
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
 
Dernière édition:
bonsoir,
VB:
Dim d As Date
d = Format(Sheets("Paramétrage").Cells(3, 3).Value, "yyyy-mm-dd")
 'dernier jour du trimestre!
Debug.Print DateSerial(Year(d), (((Month(d) - (Month(d) Mod 3)) / 3 + Abs(CBool(Month(d) Mod 3))) * 3) + 1, 1) - 1

'T1 à T4
Sheets("Paramétrage").Cells(12, 1).Value = Array("", "T1", "T2", "T3", "T4")((Month(d) - (Month(d) Mod 3)) / 3 + Abs(CBool(Month(d) Mod 3)))
Bonjour,

Merci pour votre message, mais le code ne donne pas la date fin.
 
- 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
234
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
246
Réponses
4
Affichages
359
Retour