Rapport de message :*
 

Re: Calculs de dates en VBA

Titre du sujet : Re: Calculs de dates en VBA
par myDearFriend! le 24/05/2012 20:51:00

Bonsoir criscris11, le Forum,

Citation :
criscris11 a écrit :
Il me reste toutefois 2 petits détails à régler mais qui ne devrait pas trop te poser de problèmes : dans la 2ème et 3ème partie, j'ai rajouté un bouton "Validez" qui insère la date obtenue dans la cellule active et je voudrais que ce bouton soit actif seulement si la date est saisie (cà c'est bon : btnCalculValid2.Enabled = D1 <> 0) et si au moins l'une des 3 Textbox (années, mois, jours) a été renseignée (et là c'est pas bon) ou peut-être plus simple ne faire apparaître la date cherchée que si les deux conditions ci-dessus soient remplies auquel je rendrais le bouton actif si une date apparaît dans le label résultat.


Tu trouveras en pièce jointe une solution ne reprenant que la partie 2 de ton Userform, tu adapteras pour les autres parties.

J'ai utilisé le code suivant  :
Option Explicit
'-----------------------------------------------------------------------
' Auteur    : myDearFriend! - www.mdf-xlpages.com
' Date      : 24/05/2012
'-----------------------------------------------------------------------

' ======================================================
' CONTROLE DE LA SAISIE UTILISATEUR
' ======================================================
Private Sub Date_Debut_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Sub Annees_Plus_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub
 
Private Sub Mois_Plus_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Sub Jours_Plus_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub


' ======================================================
' VERIF et REFORMATAGE EN SORTIE DE SAISIE
' ======================================================
Private Sub Date_Debut_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(Date_Debut.Text)
    If T <> "" Then
        Date_Debut.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 Annees_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 Jours_Plus_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CalculValid2
End Sub


' ======================================================
' ROUTINES FORMAT et CALCUL DATE
' ======================================================
Private Function KeyNumOnly(ByVal K As Integer) As Integer
    'Autorise uniquement les touches numériques de 0 à 9 (renvoyées par Keypress)
    If K < 48 Or K > 57 Then K = 0
    KeyNumOnly = K
End Function

Private Function FormatDate(D As String) As String
    'Insèrer les /
    If Len(D) = 8 Then
        D = Left(D, 2) & "/" & Mid(D, 3, 2) & "/" & Mid(D, 5)
        If IsDate(D) Then FormatDate = D
    ElseIf Len(D) = 10 And IsDate(D) Then
        FormatDate = D
    End If
End Function

Private Sub CalculValid2()
Dim D1 As Date
    'La date début est-elle présente et valable ?
    On Error Resume Next
    D1 = CDate(Date_Debut.Text)
    On Error GoTo 0
    'Calcul date résultat
    If D1 <> 0 Then
        D1 = DateAdd("yyyy", Val(Annees_Plus.Value), D1)
        D1 = DateAdd("m", Val(Mois_Plus.Value), D1)
        Resultat_Date_Fin.Caption = DateAdd("y", Val(Jours_Plus.Value), D1)
    End If
    'Bouton VALIDER activable ?
    btnCalculValid2.Enabled = D1 <> 0 And (Date_Debut.Text <> Resultat_Date_Fin.Caption)
End Sub


' ======================================================
' VALIDATION DU FORMULAIRE
' ======================================================
Private Sub btnAnnuler_Click()
    Unload Me
End Sub

Private Sub btnCalculValid2_Click()
    Selection.Value = DateValue(Resultat_Date_Fin.Caption)
    Unload Me
End Sub
J'ai d'abord ajouté des procédures comme :
Private Sub Annees_Plus_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub
... pour n'autoriser que la saisie de chiffres dans les Textbox Annees, Mois et Jours.

Pour rendre actif (ou non) le bouton "Valider", j'ai ajouté la ligne de code suivante dans la procédure CalculValid2() :
   'Bouton VALIDER activable ?
    btnCalculValid2.Enabled = D1 <> 0 And (Date_Debut.Text <> Resultat_Date_Fin.Caption) 

Attention : j'ai supprimé aussi les lettres accentuées dans le nom de tes contrôles, Années_Plus devient Annees_Plus par exemple (ce n'est pas obligatoire, mais je te déconseille les lettres accentuées dans les noms de controle ou les nom de variables).


Citation :
criscris11 a écrit :
Deuxième chose, plus optionnelle celle-ci, comment rendre cet USF plus esthétique d'un point de vue visuel ?

Pour cela, tu peux jouer sur les propriétés des controles et du Userform (et particulièrement sur les propriétés Backcolor, Bordercolor, Forecolor, Picture et SpecialEffect). Il y a plein de choses à tester déjà là.

Dans la pièce jointe, tu verras que j'ai un peu modifié l'apparence du formulaire par ce biais, pour tenter de le rendre un peu moins austère.

Attention toutefois à ne pas trop abuser des Pictures car c'est autant de poids en plus pour ton projet.


Ton fichier finalisé sera bienvenu pour clore ce fil de discussions et je te remercie de cette intention. N'y vois pas ombrage, mais je réserve autant que possible la section de téléchargement du site aux fichiers complémentaires des tutoriels ou aux applications complètes. J'espère que tu comprends.

En espérant t'avoir aidé...

Cordialement,

EDITION : correction d'un bug mineur (voir plus loin dans ce fil)