Erreur avec la fonction Datedif

Bonjour,

Là franchement je pense que je vais passer pour un c** mais tant pis

Dans le fichier joint, la fonction Datedif ne me mets pas un résultat correct, en gros il me manque un jour.

Je suis à peu près sur que d'ici 2 minutes, je vais avoir une réponse alors que perso je cherche depuis plus d'une demi heure

Y m'énerve les pros, y m'énerve

allez merci et bonne continuation.

Bonjour,

Datedif() compte la différence en jours.

Du 10 au 15 il y a 15-10=5 jours, pas 6.

Et pareil pour les mois, il faut qu'ils soient révolus : du 01/01 au 31/01 ça fait 0 mois. Du 01/01 au 01/02 ça fait 1 mois.

Ajoute un jour à ta date de fin

=DATEDIF(A2;B2+1;"md")

Ceci dit, si c'est très important Datedif est bien bugué. Entre autres avec des dates sur les années bissextiles. Et très très buguée sur 2007.

eric

Salut !

C'est l'éternel problème du nombre de piquets et du nombre d'intervalles...

Mais je suis d'accord avec Eric sur les précautions à prendre avec DATEDIF, et avec toutes les fonctions de l'espèce d'ailleurs.

Microsoft n'offre pas d'équivalent en fonction Excel. DateDiff en VBA paraît assez fiable, mais il faut passer par VBA.

La fonction FRACTION.ANNEE est d'un maniement malaisé

Selon besoins, on a intérêt à créer des fonctions personnalisées en VBA, mais c'est moins simple que dans d'autres domaines... Il faut prendre en compte la propension de VBA à inverser mois-jour en raison du format américain et donc à te modifier la date, la versatilité d'Excel à reconnaître toute date en format texte mais pas en import, alors que VBA là en principe reconnaît, sans parler des bogues auxquels ont mailler à partir les généalogistes...

Je m'étends... Bon courage dans tes calculs.

(PS- le weekend n'a pas favorisé mon intention de me lancer dans ta formule CM mais ça va venir...)

Cordialement.

Bonjour à tous les deux

Merci pour vos infos, Je vais voir pour faire autrement.

Bonne soirée

PS: Pas de problème pour le Fichier CM, MFerrand

Bonsoir,

je pense avoir trouvé une solution à mon problème

En mélangeant un peu de MFerrand et de rechercher sur le net, je suis arrivé au fichier en pièce jointe.

Il y a surement du nettoyage à faire dans les formules mais ça fonctionne.

Bonne soirée

230dates.zip (12.92 Ko)

Quel était l'objectif ?

Si tu veux obtenir les valeurs dans 3 cellules, il faut juste adapter la fonction personnalisée pour qu'elle fonctionne en matricielle.

Bouhhhhhj

Moi qui pensait avoir fait avoir fait quelque chose de pas mal, je tombe de haut.

Effectivement c'était le but recherché.

Bonne soirée

Si tu n'as pas l'habitude de coder des fonctions, cela ne vient pas spontanément...

Je vais voir ça !

Cela me fera une pause dans les CM... J'ai bien avancé mais laborieusement avec quantités de décomptes d'apothicaires... (Le dernier était le cas d'un 29 février dans le congé traité ou dans le congé un an plus tôt... d'ailleurs j'ai un correctif à apporter pour l'un des sens !

... C'est fait! J'appréhende un peu de devoir me remettre à compter lors des tests, on verra ça lorsque j'aurai fini la démarche (il me reste à parcourir le tableau [tableau VBA construit par la fonction] pour mettre des 1 dans l'une ou l'autre colonne, selon si 100% ou 50% en contrôlant le décompte des droits chaque jour, puis enfin, construire les chaînes répertoriant les dates en fonction des 1 apposés, mais je me suis demandé s'il n'aurait pas été plus simple de basculer la totalité des calculs en VBA ! Quoique le problème n'aurait pas changé à cet égard : pour les quelques cas rares où les prises en charges 100%/50% s'entrelacent, je ne vois pas comment éviter l'évaluation au jour par jour...)

Voilà : modifications minimum : 3 lignes supprimées (voir, je les ai invalidées), variable String pour résultat basculée en Variant et on lui affecte les résultats sous forme de tableau (Array).

Fonctionnement : sélection de 3 cellules au départ, on tape la fonction (pareil), mais validation matricielle (Ctrl+Maj+Entrée).

Cordialement.

79bayard-dates.zip (12.93 Ko)

J'ai jeté un oeil à ton travail MFerrand.

Pas mal

Il reste les erreurs dues au calcul de datedif par vba mais surtout je pense que le Application.Volatile est inutile vu que les cellules sont passées en paramètre.

Pas bien grave mais imaginons cette fonction répétée sur des centaines de lignes, autant se passer des calculs superflus.

eric

Salut Eric !

Je te signale que ma fonction n'utilise pas DATEDIF (qui n'est pas une fonction VBA).

Elle n'utilise que des fonctions VBA et fonctionne sur des dates antérieures à 1900.

Elle corrige aussi l'erreur d'Excel avant le 1er mars 1900.

Je n'ai jusqu'à présent pas noté d'erreur sur les jours avec cette méthode de calcul...

Pour l'aspect recalculable, je serais plutôt partisan de le conserver dans cette utilisation, car si à la moindre erreur de saisie, il faut la réactiver en validation matricielle sur 3 cellules, c'est facile de se louper et d'y perdre du temps, alors que ça n'alourdit le recalcul que de façon négligeable (je ne pense pas que la quantité sera telle que cela poserait problème, mais évidemment c'est à reconsidérer dans un tel cas.)

En fait cette fonction a été faite à l'origine pour un calcul d'âge (d'où les noms de variables) et réadaptée pour un calcul d'ancienneté (+1 jour...).

Cordialement.

Oui, je parlais bien de DateDiff en vba qui a ses bugs aussi.

Pour le volatile je ne suis toujours pas convaincu Pourquoi faudrait-il revalider ?

eric

Une ancienneté cela se recalcule parfois fréquemment, cela peut même donner lieu à des simulations, et en modifiant une date, on a toujours le résultat...

Pour DateDiff, je n'ai pas jusqu'à présent noté d'erreurs (contrairement à DatePart sur les calculs de semaine). Si tu as un exemple, je suis preneur. Ce sera facile à corriger de toute façon.

Encore moi

Mon cher Bayard !

Les discussion avec Eric (dont une partie figure ici), fructueuses, ce dont je le remercie, ont mis en évidence des distorsions éventuelles liées au mode de calcul, lequel est sensible à la durée inégale des mois...

Si mes souvenirs sont bons, les anciennetés se calculaient en égalisant les mois à 30 jours. Si tu me confirmes que c'est toujours le cas, il conviendrait de te faire une fonction répondant spécifiquement à ce besoin.

Quelques exemples pour illustrer :

du 29/01 au 01/03/2016, la fonction actuelle donne 1 mois et 2 jours ; une égalisation donnerait 1 mois et 3 jours

du 28/04 au 01/06 on obtient 1 mois et 5 jours alors que du 28/05 au 01/07 c'est 1 mois et 4 jours ; l'égalisation donnerait dans les deux cas 1 mois et 4 jours.

Cordialement.

MFerrand a écrit :

Voilà : modifications minimum : 3 lignes supprimées (voir, je les ai invalidées), variable String pour résultat basculée en Variant et on lui affecte les résultats sous forme de tableau (Array).

Fonctionnement : sélection de 3 cellules au départ, on tape la fonction (pareil), mais validation matricielle (Ctrl+Maj+Entrée).

Cordialement.

J'ai testé ta proposition mais je n'arrive pas à la reproduire.

Je n'ai que les années qui s'affichent, elle est où l'erreur???

anciennete

Bonjour,

Lorsqu'il s'agit d'un tableau il faut sélectionner les 3 cellules avant de valider la formule en matriciel.

eric

Dans la validation matricielle, comme l'a dit Eric.

...mais vois la suite...

Ok c'est bon j'ai réussi, en fin de compte je buggais sur la sélection des 3 cellules mais j'ai trouvé la solution ici

http://lecompagnon.info/excel/fonctionsmatricielles.htm

https://www.youtube.com/watch?v=vO_nLeonyXU&feature=player_embedded

Merci à vous deux et bonne soirée

Bonjour dominical !

Je suis venu à bout de la fonction sur les CM, mais avant de partir à la recherche du sujet d'origine, je me permets de te rappeler sur celui-ci mes dernières remarques interrogatives sur les règles de calcul de l'ancienneté... !

Cordialement.

Rechercher des sujets similaires à "erreur fonction datedif"