Calculs de dates en VBA
#1
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 23-05-2012 21h12
Bonsoir,
Suite à mon précédent post sur les dates en VBA et grâce à Didier, je suis reparti de son fichier d'origine en divisant l'USF en trois parties : la première permet de calculer une durée=> là pas de problème grâce à notre serviteur. Mais pour la deuxième et troisième partie, je cherche à calculer une date de fin ou de début en additionnant ou soustrayant une durée en années, mois et jours. J'ai trouvé avec la fonction DateAdd mais je n'arrive qu'à écrire le code pour les années (cf. CalculValid2) et je n'arrive pas à y imbriquer les mois et les jours. Est ce la bonne procédure ?
PS : de même dès que j'ai fini de saisir la date, le calcul se déclenche alors que les 3 textbox sont forcément vides.

Merci d'avance pour vos réponses et bonne soirée.
Pièce jointe:
zip mDF_CalculDates.zip   [ Taille: 22.69 Ko - Téléchargements: 945 ]
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 23-05-2012 22h55
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,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#3
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 23-05-2012 23h27
Merci Didier pour ta réponse. Je vais tester tout cela demain et je n'hésiterai pas à te tenir informé : tout cela à titre d'exercice bien sûr ...
Bonne soirée.
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#4
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 24-05-2012 14h45
Bonjour Didier, le forum,
Didier, comme promis je viens te donner des nouvelles. J'ai bien réussi à reproduire le code dans mon fichier et qui plus est j'ai même réussi à programmer moi-même la troisième partie (pas trop dur tu me diras car tu as bien mâché le travail mais quand même...) : en tout cas merci pour le partage de tes connaissances.

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.

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

Sache d'ores et déjà que je serais honorer de poster mon fichier une fois finalisé, avec ton accord il en va de soi, sur ton site afin qu'il puisse servir d'exemple aux membres du forum.

Encore merci pour tout et à bientôt.
Cordialement.
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#5
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 24-05-2012 20h51
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)




Pièce jointe:
zip mDF_CalculDates2.zip   [ Taille: 21.88 Ko - Téléchargements: 770 ]
Edité par myDearFriend! le 24/05/2012 22:25:17

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#6
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 24-05-2012 21h39
Merci Didier pour ton aide : cela me donne déjà plein d'idées pour améliorer mon idée de départ grâce à tes compétences tant techniques que pédagogiques.

D'ici la fin de ce long week-end, je pense que j'aurai finalisé mon projet (voir peut-être même 2 modèles différents si j'ai le temps) et c'est avec plaisir que je viendrai clôturer ce fil avec le ou les fichiers concernés. Je comprends tout à fait ton point de vue concernant la section Téléchargement et j'adhère entièrement à ton principe donc je ne me sentirai en cas offusqué (et qui plus est on ne vas pas se fâché entre Bourguignons car si je suis à Rennes depuis 1991 je ne vais pas renier mes origines Côte d'Oriennes car né à Dijon. Je ne sais pas si tu es Bourguignon d'origine mais pour moi cela ne change rien bien au contraire).

Merci encore pour ton aide très précieuse et te souhaite une très bonne soirée.
A bientôt sur le forum.

Amitiés Xldiennes.
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#7
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 24-05-2012 22h02
Re criscris11,

Citation :
criscris11 a écrit : Merci Didier pour ton aide : cela me donne déjà plein d'idées pour améliorer mon idée de départ grâce à tes compétences tant techniques que pédagogiques.

D'ici la fin de ce long week-end, je pense que j'aurai finalisé mon projet (voir peut-être même 2 modèles différents si j'ai le temps) et c'est avec plaisir que je viendrai clôturer ce fil avec le ou les fichiers concernés. Je comprends tout à fait ton point de vue concernant la section Téléchargement et j'adhère entièrement à ton principe donc je ne me sentirai en cas offusqué (et qui plus est on ne vas pas se fâché entre Bourguignons car si je suis à Rennes depuis 1991 je ne vais pas renier mes origines Côte d'Oriennes car né à Dijon. Je ne sais pas si tu es Bourguignon d'origine mais pour moi cela ne change rien bien au contraire).

Merci encore pour ton aide très précieuse et te souhaite une très bonne soirée.
A bientôt sur le forum.

Amitiés Xldiennes.

Content que ça te convienne.
heu... « Amitiés XLpagiennes», hein ?!

Cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#8
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 24-05-2012 22h03
Didier,
En testant un peu plus en profondeur (je me met à la place du novice qui va utiliser l'USF), j'ai découvert un léger bug : quand la date est saisie et que l'on rentre un nombre d'années dans le contrôle correspondant, le bouton Validez ne s'active pas alors qu'il y aura certains cas où on n'aura à ajouter qu'un certain nombre d'années uniquement.
Merci de ta compréhension.

Oui désolé, l'habitude sans doute : cela ne se reproduira plus

Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#9
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 24-05-2012 22h20
Arf, je n'avais pas vu, tu as raison il y a une erreur dans le code :
Private Sub Années_Plus_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CalculValid2
End Sub
... il faut remplacer le « é » par un « e » sans accent (oubli de ma part).

Je rectifie plus haut et remets la pièce jointe conforme.

Note cependant, que le test d'activation du bouton (et recalcul de la date) n'intervient que lorsque les TextBox perdent le focus (évènement Exit). Il faut donc sortir du TextBox (par la touche TAB ou un clic souris) pour que le traitement se déclenche...
 
Cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#10
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 24-05-2012 22h29
Il n'y a pas de mal : l'erreur est humaine .
Et puis de toute façon, c'est la faute des accents lol.

Bonne soirée à toi et merci pour la correction.
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes