Rapport de message :*
 

Re: Calculs de dates en VBA

Titre du sujet : Re: Calculs de dates en VBA
par myDearFriend! le 23/05/2012 22:55:34

Bonsoir criscris11,

Ton classeur est un très bon support d'exercices

Je vais te donner une solution possible pour la 2ème partie de ton Userform, à toi ensuite d'adapter la démarche pour réaliser par toi-même la 3ème partie...

Tout d'abord, si tu veux utiliser DateAdd() pour ajouter un nombre d'Années, de Mois et de Jours, il te faut donc utiliser 3 fois la fonction comme suit :
   If D1 <> 0 Then
        D1 = DateAdd("yyyy", Val(Années_Plus.Value), D1)
        D1 = DateAdd("m", Val(Mois_Plus.Value), D1)
        Résultat_Date_Fin = DateAdd("y", Val(Jours_Plus.Value), D1)
    End If
 

Une autre solution consiste par exemple dans l'utilisation de la fonction DateSerial (au lieu de DateAdd), comme suit en une ligne de code au lieu de 3 :
   If D1 <> 0 Then
        Résultat_Date_Fin = DateSerial(Year(D1) + Val(Années_Plus.Value), Month(D1) + Val(Mois_Plus.Value), Day(D1) + Val(Jours_Plus.Value))
    End If

Par ailleurs, tu as du remarquer que j'ai utilisé la fonction Val() aussi, comme dans l'expression :
Val(Années_Plus.Value)
Cette façon de faire permet d'éviter un plantage si les Texbox Année, Mois ou Jours sont vides (la valeur 0 est alors pris en compte par défaut).

Au final, il te faut aussi t'assurer que la Date sera bien recalculée si l'utilisateur modifie la date de départ, le nombre d'années, le nombre de mois ou le nombre de jours : pour ce faire, il faut donc ajouter la gestion d'évènement à la sortie (exit) des Textbox Année, Mois et Jours.

Voici donc l'ensemble du code modifié correspondant au traitement de cette 2ème partie :
' ---------------------------------------------------------------------
' 2ème PARTIE DU USERFORM
' ---------------------------------------------------------------------
Private Sub Date_Début_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(Date_Début.Text)
    If T <> "" Then
        Date_Début.Text = T
        CalculValid2     'calcul et autorisation de validation
    Else
        Cancel = False  ' à modifier par True si on veut rester sur le focus pour modification
    End If
End Sub

Private Sub Années_Plus_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CalculValid2
End Sub

Private Sub Jours_Plus_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CalculValid2
End Sub

Private Sub Mois_Plus_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CalculValid2
End Sub

Private Sub CalculValid2()
Dim D1 As Date
   
    'La date est-elle présente et valable ?
    On Error Resume Next
    D1 = CDate(Date_Début.Text)
    On Error GoTo 0
   
    'Calcul durée
    If D1 <> 0 Then
        D1 = DateAdd("yyyy", Val(Années_Plus.Value), D1)
        D1 = DateAdd("m", Val(Mois_Plus.Value), D1)
        Résultat_Date_Fin = DateAdd("y", Val(Jours_Plus.Value), D1)
    End If
   
End Sub
 

J'ai testé, ça fonctionne , mais je te laisse reproduire tout ça dans ton classeur à titre d'exercice...

Cordialement,