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: 11
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

Phil69970

XLDnaute Barbatruc
Bonjour @VBA_dev_Anne_Marie

Tirer de l'aide en ligne de Bilou je te propose ceci :

VB:
Sub MonTrimestre()
Dim TheDate As Date    ' Déclare les variables.
Dim Msg
TheDate = [C3]
Msg = "Trimestre: " & DatePart("q", TheDate)
MsgBox Msg
[C12] = Msg

End Sub

Après il suffit d’associer chaque trimestre à la date qui va bien

Le 1er trimestre à Janv-Fev-Mars etc...

Merci de ton retour

@Phil69970
 

Deadpool_CC

XLDnaute Accro
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
 

Laurent78

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
 

Pièces jointes

  • Dernier Jour Trimestre.xlsm
    14.8 KB · Affichages: 3
Dernière édition:

dysorthographie

XLDnaute Accro
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:

dysorthographie

XLDnaute Accro
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:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
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.
 

Statistiques des forums

Discussions
312 103
Messages
2 085 312
Membres
102 860
dernier inscrit
fredo67