Re: Calculs de dates en VBA
#11
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 30-05-2012 17h55
Salut Didier, le forum,
Au moment où je voulais mettre ma version finale en pièce-jointe, je me suis aperçu d'un problème dans la calcul de durée (1ère partie du USF). En effet, j'ai adapté ton code que tu m'as donné sur mon post précédent mais cela ne fonctionne pas tout le temps. Je m'explique :

Du 23/01/1971 au 30/05/2012 (aujourd'hui) me donne bien 41 ans 4 mois et 8 jours.
En revanche, du 23/01/1971 au 31/05/2012 (demain) me donne 41 ans 5 mois et -22 jours ??? Pourquoi ?
Dès que je dépasse la date du jour dans "Au", j'obtiens un chiffre négatif soit les mois soit les jours ou parfois les deux (par exemple du 02/08/2008 au 31/12/2012 me donne 5 ans -7 mois et -1 jours).
Saurais-tu de quoi ça vient ?

Voici le code utilisé pour le calcul :

Private Sub CalculValid()
Dim D1 As Date, D2 As Date
    'Les dates début et fin sont-elles présentes et valables ?
    On Error Resume Next
    D1 = CDate(txtDu.Text)
    D2 = CDate(txtAu.Text)
    On Error GoTo 0
    'Calcul durée
    If D1 <> 0 And D2 <> 0 Then
        LabelAnnees = DateDiff("yyyy", D1, D2 + 1)
        LabelMois = DateDiff("m", D1, D2 + 1) - LabelAnnees.Caption * 12
        LabelJours = D2 + 1 - DateAdd("m", DateDiff("m", D1, D2 + 1), D1)
    End If
    'Bouton VALIDER activable ?
    'btnCalculValid.Enabled = D1 <> 0 And D2 <> 0
End Sub

Je joins également le fichier en précisant que ce n'est pas la version finalisée à cause des erreurs de calculs de durée.
Merci d'avance.

Pièce jointe:
zip mDF_CalculDates v3.zip   [ Taille: 32.36 Ko - Téléchargements: 618 ]
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#12
Webmestre

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

Messages: 1518

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 30-05-2012 21h29
Bonsoir criscris11, le Forum,

Ta remarque me fait découvrir un effet très gênant de la fonction DateDiff() que je pensais pourtant connaître... (on en apprend tous les jours !).

Dans l'aide VBA sur DateDiff(), il y a une phrase d'apparence anodine, mais qui ne l'est visiblement pas tant que ça : "Lors de la comparaison des dates 31 décembre et 1er janvier de l'année suivante, DateDiff avec la valeur Année ("yyyy") renvoie 1, même si la différence est seulement d'un jour.".
Etonnant, non ?
Du coup, quelques tests me confirme que DateDiff() considère 1 AN d'écart entre le 31/12/2011 et le 01/01/2012 !!! De même, il trouve 1 MOIS d'écart entre le 31/05/2012 et le 01/06/2012 !!!

Il convient donc de rectifier le tir dans le code utilisé et je te propose la solution de contournement suivante à tester. Cette solution reprends notamment mon raisonnement d'origine qui partait d'un calcul de l'écart en mois, pour en déduire ensuite les années, puis les jours  (j'ai juste ajouté un test pour réajuster l'effet indésirable tel que constaté plus haut) :
Private Sub CalculValid()
Dim D1 As Date, D2 As Date
Dim cptMtot As Integer, cptA As Integer, cptM As Integer, cptJ As Integer
    'Les dates début et fin sont-elles présentes et valables ?
    On Error Resume Next
    D1 = CDate(txtDu.Text)
    D2 = CDate(txtAu.Text)
    On Error GoTo 0
    'Calcul durée
    If D1 <> 0 And D2 <> 0 Then
        cptMtot = DateDiff("m", D1, D2)      'Combien de mois entre les 2 dates ?
        If DateAdd("m", cptMtot, D1) > D2 Then cptMtot = cptMtot - 1    'Réajustement calcul
        cptA = cptMtot \ 12                         'déduction de l'écart en année
        cptM = cptMtot - cptA * 12                  'déduction de l'écart restant en mois
        cptJ = D2 - DateAdd("m", cptMtot, D1)    'déduction de l'écart restant en jours
       
        LabelAnnees = cptA
        LabelMois = cptM
        LabelJours = cptJ
    End If
End Sub

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
#13
Régulier XLPages

Inscription: 29/07/2007
De yvelines

Messages: 59

Système d'exploitation:
PC
Version Excel utilisée:
2010, 2013
Posté le : 31-05-2012 00h40
Bonjour Didier

Juste une petite précision pour info : il y a effectivement un nette différence entre le DATEDIFF VBA et la fonction DATEDIF d'Excel.

De même le DATEDIFF existe dans les fonctions Access (fournies hors VBA) et fonctionne comme en VBA : cela oblique à effectuer un test sur le franchissement de la date anniversaire, ce qui est moins pratique, tant pour l'année que pour le mois.

Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#14
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 31-05-2012 20h41
Bonsoir Didier, chris, le forum,
Merci Didier pour la correction : effectivement (et comme confirmé par chris) après tests sur plusieurs ensembles de dates, le résultat trouvé semble être le bon.
Je touche à la fin du formulaire mais j'aurais encore une petite requête à te demander (tu vas me dire que je suis perfectionniste mais c'est surtout pour que cela soit le plus simple et le plus explicite pour les utilisateurs du fichier final) : est-il possible de combiner dans une condition If un ET et un OU comme par formule ? Cela concerne les 2 labels résultats de la partie 2 et 3 du USF. En effet, pour l'instant quand je rentre la date et que je tabule sur le txtbox suivant une date s'affiche dans le label résultat car je travaille en jour inclus alors qu'aucunes valeurs d'années, mois ou jours n'ont été renseignés. Donc en clair, je voudrais rajouter une condition OU après la première condition :
If D1 <> 0
du style :
If D1 <> 0 And (Or(Annees_Plus <> 0, Mois_Plus <> 0, Jours_Plus <> 0))
mais bien sûr ce n'est pas la bonne expression car j'ai testé et débogage of course.
Merci de bien vouloir corriger pour parfaire ma formation .

Bonne soirée à tous.
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#15
Régulier XLPages

Inscription: 29/07/2007
De yvelines

Messages: 59

Système d'exploitation:
PC
Version Excel utilisée:
2010, 2013
Posté le : 31-05-2012 20h57
Bonjour

en VBA (comme en requêtes sur les BD) les AND et les OR se placent comme en français plus les parenthèses.

Pas testé mais
if D1 <> 0 And (Annees_Plus <> 0 or Mois_Plus <> 0 or Jours_Plus <> 0)
 
devrait fonctionner



Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#16
Webmestre

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

Messages: 1518

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 01-06-2012 00h34
Bonsoir criscris11, chris, le Forum,

Tu as tout à fait raison chris, la fonction de feuille de calcul DATEDIF() est visiblement bien plus performante que sa cousine DateDiff() en VBA. Merci de cette info, c'est quelque chose à retenir.

Pour ta dernière demande criscris11, j'ajoute qu'on doit certainement pouvoir faire aussi comme ça :
If D1 <> 0 And Val(Annees_Plus + Mois_Plus + Jours_Plus) > 0 Then

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
#17
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 03-06-2012 18h42
Bonjour à tous,
Chose promise, chose due.
Voici le fichier finalisé avec un petite précision toutefois : les calculs se font en jours inclus c'est à dire du 03/06/2012 au 03/06/2012 est égal à 0 an 0 mois et 1 jour. Ainsi les calculs de date de début et date de fin fonctionnent de la même façon donc si vous ne travaillez pas en jours inclus il faudra modifier le code en conséquence.

Je serais ravi d'avoir vos retours à toute fin utile.
Mais avant tout, je voudrais remercier notre hôte Didier pour son travail formidable ainsi que ses précieux conseils et surtout sa grande pédagogie car en réalisant ce formulaire j'ai appris énormément.

PS : fonctionne également avec mDF XLcalendar avec un double clic dans les TxtBox.

Bonne semaine à tous.

Version 5 postée suite à l'excellente remarque de Didier.














Pièce jointe:
zip mDF_CalculDates v4.zip   [ Taille: 35.94 Ko - Téléchargements: 749 ]
zip mDF_CalculDates v5.zip   [ Taille: 36.66 Ko - Téléchargements: 754 ]
Edité par criscris11 le 05/06/2012 20:26:15
Hors Ligne
Rapport   Haut 

Re: Calculs de dates en VBA
#18
Webmestre

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

Messages: 1518

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 03-06-2012 19h50
Bonjour criscris11, chris, le Forum,

Bravo criscris11 et merci de ton partage

Tu vois, je te l'avais dit : ton classeur est un très bon support pour apprendre et c'est bien en ce fixant ce genre de petit challenge qu'on progresse au final...

D'ailleurs, ça m'a aussi permis de prendre conscience du problème lié à la fonction VBA DateDiff()... et c'est bien la preuve que ce type de projet est très utile pour qui s'y intéresse et qu'on apprend tous en permanence !


Bravo enocre criscris11 et félicitations pour ta motivation qui fait plaisir à voir.

Bien 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
#19
Webmestre

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

Messages: 1518

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 04-06-2012 20h33
Bonjour criscris11, chris, le Forum,

Petite précision criscris11, que j'ai oubliée de mentionner dans mon post précédent...

Comme tu as prévu de permettre la saisie des dates par double-clic dans les TextBox de ton userform (ce qui est, en toute objectivité, une très bonne chose ), il faut impérativement prévenir les utilisateurs que ton classeur nécessite l'installation préalable du mDF XLcalendar.

En effet, ceux qui tenteront d'utiliser ton classeur sans le mDF XLcalendar vont se confronter à un plantage du code VBA pour motif « Référence manquante ».

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
#20
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 04-06-2012 20h59
Bonsoir,
Oui effectivement mais j'ai laissé les 2 modes d'actions : soit saisie directe dans les TextBox ou soit double-clic possible si mDF Xlcalendar est installé sur le poste. Y aurait-il un conflit possible ?
Merci pour ta réponse car si conflit il y a, le code demande une petite modification et tout du moins une petite précision.
Bonne soirée.
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