Résolu XL 2016 VBA Evaluate

soan

XLDnaute Accro
@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
 

patricktoulon

XLDnaute Barbatruc
je l'ai trouvé de circonstance cet emoj
pour la formule 4/400
MsgBox Val(1900 Mod 4) = 0 And Val(1900 Mod 400) = 0
pour excel il y a son homonyme
 

soan

XLDnaute Accro
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 Accro
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
 

soan

XLDnaute Accro
ah oui, ok ! cette fois j'ai compris ! (c'est bon, ça, ta température va pouvoir revenir à la normale,
vers 37° et quelques ; tu vas pouvoir retirer ton thermomètre, et aller prendre un bon repas ! :))


soan
 

patricktoulon

XLDnaute Barbatruc
c'est trop compliqué pour moi !
ben non d'autre se sont cassé la tete avant toi profite de leur expérience

VB:
'*******************************
'DAtediff perso patricktoulon
'date version 10/2019
'*******************************
Function Datediff_AMJ$(ByVal dat1, Optional ByVal dat2 = 0)
    Dim a%, m%, j%, dtemp As Date, Erreur$
    If dat2 = 0 Then dat2 = Date
    Erreur = IIf(Not IsDate(dat1), "(1)", ""): Erreur = Erreur & IIf(Not IsDate(dat2), "(2)", ""): Erreur = IIf(Erreur <> "", "Invalid Argmt(" & Erreur & ")", "")
    If Erreur <> "" Then Datediff_AMJ = Erreur: Exit Function
    dat1 = CDate(dat1): dat2 = CDate(dat2)
    If dat1 > dat2 Then dtemp = dat1: dat1 = dat2: dat2 = dtemp
    a = Evaluate("DATEDIF(" & CDbl(dat1) & "," & CDbl(dat2) & ",""y"")")
    m = Evaluate("DATEDIF(" & CDbl(dat1) & "," & CDbl(dat2) & ",""ym"")")
    j = Abs(DateSerial(Year(dat1) + a, Month(dat1) + m, Day(dat1)) - dat2)
    Datediff_AMJ = RTrim(IIf(a, a & " an" & IIf(a = 1, " ", "s "), "") & IIf(m, m & " mois ", "") & IIf(j, j & " jour" & IIf(j = 1, "", "s"), ""))
End Function

Sub test()
    MsgBox Datediff_AMJ("02/02/2020", "25/01/2017")
    MsgBox Datediff_AMJ("25/01/2017", "02/02/2020")
    MsgBox Datediff_AMJ("04/03/1970")
    MsgBox Datediff_AMJ("toto", "titi")
    MsgBox Datediff_AMJ("25/04/2016", "titi")
End Sub
et en formule
=Datediff_AMJ(A2;B2)
 

danielco

XLDnaute Accro
Soyons fous, quel était le jour de la semaine du 28/2/1900 ?
Excel :
Capture d’écran 2020-10-18 153717.png
VBA :
Capture d’écran 2020-10-18 153820.png

Et le 1/1/1900 ? Dimanche avec Excel ou lundi avec VBA ?

Daniel
 

patricktoulon

XLDnaute Barbatruc
re
VB:
Sub test()
'Soyons fous, quel était le jour de la semaine du 28/2/1900 ?
MsgBox "le 28/2/1900" & vbCrLf & "c' etait le " & Weekday(CDate("28/2/1900"), vbUseSystemDayOfWeek) & " EME jour de la semaine en FR" & vbCrLf _
& "soit un " & Format(CDate("28/2/1900"), "dddd")

End Sub
weekday ou JOURSEM ont les même arguments et donne le même résultat pour peu que l'argument mode de visual basic usesystemdate soit respecté dans les deux et par conséquent Donneront "a same résult "

les arguments vb
vbmonday=2
vbtuesday=3
vbwednesday=4
vbthursday=5
vbfriday=6
vbsaturday=7
vbsunday=
1
vbUseSystemDayOfWeek=0(c'est le joker qui va utiliser le parametre défini de ton pc)


donc!!!!
si en vba je fait

msgbox Weekday(CDate("28/02/1900"), vbmonday)et que j'obtiens 3

avec la formule je fait

=JOURSEM(DATE(1900;2;28);2) j'obtiens 3 aussi


c'est bon ça rentre ?
 
Dernière édition:

danielco

XLDnaute Accro
Non, ce n'est pas très compliqué, mais beaucoup plus grave, mon ordi doit être piraté, parce qué :
=JOURSEM(DATE(1900;2;28);2)
me donne 2 !
Capture d’écran 2020-10-18 195126.png

Et pour Excel aussi, on est bien dimanche.

Daniel
 

patricktoulon

XLDnaute Barbatruc
OU Alors tu a une version pipé us/fr Window ou office ou les deux
j'ai bien connu ça dans le temps ou je bidouillait les XP Corporate et compagnie
 

soan

XLDnaute Accro
Patrick a écrit : « j'ai bien connu ça dans le temps ou je bidouillait les XP Corporate et compagnie »
quoi, quoi, quoi ? tu étais un ancien hacker ? :p alors c'est toi qui a piraté le KGB, le FBI, la CIA,
le Pentagone, et la Maison Blanche ? j'vois d'ici Donald Trump en train d'twitter tout ça en 1ère
page des infos du Web !!! :p:D


soan
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas