XL 2016 VBA Evaluate

danielco

XLDnaute Accro
Bonjour,

Je ne vois pas où se situe mon erreur, entre ces deux lignes :
VB:
  [A10].Formula = "=DATEDIF(""" & Format(zv_Debut, "d/m/yyyy") & """,""" & Format(zv_Fin, "d/m/yyyy") & """,""md"")"
  Var = Evaluate("=DATEDIF(""" & Format(zv_Debut, "d/m/yyyy") & """,""" & Format(zv_Fin, "d/m/yyyy") & """,""md"")")

La première renvoie 1 et la seconde un erreur :
?zv_Debut
16/04/2019
?zv_Fin
17/10/2020
?[A10]
1
?var
Erreur 2015

Merci d'avance.

Daniel
 
Solution
Bonjour Daniel,

Tu as écrit : « Je ne vois pas le rapport entre le post #9 et mon problème »

Dans le code VBA de ton post #11 ci-dessus, il y a :


toto = Evaluate("=DATEDIF(""" & Format(zv_Debut, "d/m/yyyy") & """,""" &
Format(zv_Fin, "d/m/yyyy") & """,""md"")")

Le post #9 contient un lien sur le post #3 de djidji59430 ; as-tu cliqué dessus ?
si oui : djidji a d'abord mentionné une page du support Microsoft concernant
des problèmes connus de l'utilisation de l'argument "md" pour la fonction
DATEDIF() ; puis il a indiqué une façon de contourner un de ces problèmes.

alors bon, c'est vrai que...

patricktoulon

XLDnaute Barbatruc
de rien Soan

j'ajouterais qu'a mon sens cet argument voir même 'j" n'a aucune utilité dans le sens ou abs(date1-date2)te donnera le nombre de jours avec prise en compte des mois/années
(ABS) au cas ou date1<date2 a moins que l'on veuille garder le contexte "SGN" de l’opération

les fonctions date et VBA/excel toute un histoire :p :oops::rolleyes:
 

soan

XLDnaute Barbatruc
Inactif
tu as écrit : « les fonctions date et VBA/excel toute un histoire :p :oops::rolleyes: »

oui, je suis entièrement d'accord avec ta conclusion ! (même si j'aurais préféré
que les fonctions date et ce qui leur est lié soient moins compliqués !)


soan
 

danielco

XLDnaute Accro
Bonjour à tous,
à @patricktoulon : tu écris :
a oui !!!j'oubliais comparez le long de la date SVP et non son string dans Evaluate vous me ferrez plaisir
Pourtant, l'aide parle bien de "chaînes de texte" :
Capture d’écran 2020-10-18 124553.png

Et d'ailleurs, la formule :
VB:
=DATEDIF("16/4/2019";"17/10/2020";"md")
fonctionne. Que le résultat soit ou non correct, c'est autre chose. Ton classeur, très intéressant par ailleurs, ne traite pas de mon problème, sauf erreur de ma part. J'ai donc, contrairement à ce que tu écris en gras, pris le temps de le regarder.
En ce qui concerne ton code de test, je ne comprends pas trop, puisque tu évalues une chaîne de texte :
Code:
Sub test()
    For i = 1 To 10
        date1 = CDate(i & "/10/2020")
        date2 = Date    ' donc aujourdh'ui
        [A1] = "=DATEDIF(""" & CLng(date1) & """,""" & CLng(date2) & """,""md"")"
        Var = Evaluate("=DATEDIF(""" & CLng(date1) & """,""" & CLng(date2) & """,""md"")")
        MsgBox Day(date1) & "  " & Day(date2) & vbCrLf & Var
    Next
End Sub
mets :
Code:
=DATEDIF("44105";"44122";"md")
en A1 (pour i=1). Il faut donc admettre que le résultat de "Evaluate" n'est pas conforme à l'aide Excel.

Daniel
 

danielco

XLDnaute Accro
tu as écrit : « les fonctions date et VBA/excel toute un histoire :p :oops::rolleyes: »

oui, je suis entièrement d'accord avec ta conclusion ! (même si j'aurais préféré
que les fonctions date et ce qui leur est lié soient moins compliqués !)


soan
A partir du moment ou Microsoft a décidé que l'année 1900 était bissextile (pour des raisons de compatibilité ?), ça commençait fort...

Daniel
 

soan

XLDnaute Barbatruc
Inactif
@danielco

Une année est bissextile dans ces 2 cas :

1) si elle est divisible par 4 sans être divisible par 100
2) si elle est divisible par 400

Testons les 2 cas :

1) 1900 / 4 = 475 : c'est bien divisible par 4 ; 1900 / 100 = 19 : c'est divisible par 100 ➯
pour ce 1er cas, 1900 n'est pas bissextile ; 2) 1900 / 400 = 4,75 : ce n'est pas divisible
par 400 ➯ pour ce 2ème cas non plus, 1900 n'est pas bissextile

donc conclusion de 1) et 2) : 1900 n'était pas une année bissextile

plus d'infos ici : Année bissextile

j'ai testé le code VBA de Patrick : retour :


Image.jpg


➯ Microsoft a raison ; Patrick n'a pas triché en pipant son code VBA pour donner raison
à Microsoft, société sans laquelle on n'aurait pas Excel, ni les autres applications Office,
ni Windows, ni PC ; ah si, on aurait quand même des micro-ordinateurs, mais avec
CP/M (Control Program / Monitor), de la société Digital Research.


soan
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
tu oublie les 3 qui sont supprimées tout les 400 ans pour ramener le même décalage progréssif mais sur 10000 ans
Année séculaire bissextile — Wikipédia
Une année séculaire bissextile combine deux aspects :
  • ll s'agit d'une année séculaire, c'est-à-dire que son millésime s'achève par deux zéros ;
  • elle est en outre bissextile : elle possède 366 jours au lieu des 365 d'une année commune, un 29 février étant placé comme dernier jour de ce mois.
Dans le calendrier grégorien, seules les années séculaires exactement divisibles par 400 sont bissextiles : les autres années séculaires ne le sont pas. Il s'agit d'une modification des règles du calendrier julien, où toutes les années divisibles par 4 sont bissextiles, ce qui conduit à une année moyenne de 365,25 jours légèrement plus longue que l'année tropique (environ 365,242 2 jours), provoquant au fil du temps une dérive du calendrier par rapport aux équinoxes et aux solstices (une dizaine de jours en 15 siècles, lors de l'abandon progressive du calendrier julien). En supprimant 3 années bissextiles tous les 400 ans, l'année moyenne du calendrier grégorien dure 365,242 5 jours : encore un peu trop long, mais l'avance n'est que de 3 jours en 10 000 ans.
Les années séculaires bissextiles débutent toujours par un samedi. Le 29 février résultant est toujours un mardi et le 31 décembre tombe toujours un dimanche. Les lettres dominicales qui leur sont affectées sont donc toujours BA.

donc votre calcul (/4 ou /400) est donc incomplet
c'est pour cela qu'utiliser simplement le isdate("29/02/xxxx")te permet de le savoir tout de suite
 

soan

XLDnaute Barbatruc
Inactif
Daniel,

pour mon post #21, je m'étais trompé : 1900 est bien une année non bissextile ;
ce qui a été confirmé aussi par le code VBA de Patrick ; mais alors, je suis
comme toi : je ne comprends pas pourquoi Excel accepte la saisie d'une date
comme 29/02/1900 : pour moi aussi, elle devrait être refusée !

(j'ai bien sûr corrigé mon post #21)


soan
 

soan

XLDnaute Barbatruc
Inactif
Patrick,

décidément, tu as raison ! alors les dates Excel, c'est trop compliqué pour moi !

comme je suis très pragmatique, dorénavant, je m'occuperai de savoir si 1900
est vraiment bissextile ou non que s'il survient un retour vers le passé, avec
la DeLorean de Marty McFly. :p


soan
 

patricktoulon

XLDnaute Barbatruc
Daniel,

pour mon post #21, je m'étais trompé : 1900 est bien une année non bissextile ;
ce qui a été confirmé aussi par le code VBA de Patrick ; mais alors, je suis
comme toi : je ne comprends pas pourquoi Excel accepte la saisie d'une date
comme 29/02/1900 : pour moi aussi, elle devrait être refusée !


soan

je répete ma réponse #24
encore une fois je le redis excel et formule calcule les dates avec le numéro de série de date par conséquent ne relève pas l'erreur
Image vectorielle de stock de Émotion mignonne et malade avec thermomètre,  547793170

puré je me suis choppé une xldatite aigue
 

Discussions similaires

Réponses
45
Affichages
5 K
Réponses
18
Affichages
2 K
Réponses
18
Affichages
3 K

Statistiques des forums

Discussions
315 098
Messages
2 116 192
Membres
112 679
dernier inscrit
Yupanki