Formule sans datedif

dhiouf

XLDnaute Occasionnel
Bonjour à toute et à tous,

J’ai 3 formules pour calculer le nombre en années, mois et jours exacte entre deux dates. Mon problème je n’arrive pas à les rendre en code VBA.

Formule pour calculer les années : B1=ENT((datefin – datedébut +2)/365.25)

Code VBA :
Dim datefin As Date, datedébut As Date
datefin = textbox1.text
datedébut = textbox2.text
textbox3.text =INT((datefin – datedébut + 2)/365.25) ‘çà marche

Formule différence en mois, une fois les années soustraites :
B2=ENT(MOD(datefin – datedébut+2;365.25)/(365.25/12))

Code VBA : ?

Formule différence en jours, une fois les années et les mois soustraits :
B3=ENT(MOD((datefin-datedébut+2);(365.25/12)))

Code VBA : ?

Avez-vous une idée
Merci d’avance.
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : Formule sans datedif

Bonjour Mesdames, Messieurs

Pourquoi ne pas vouloir utiliser DateDiff ?

Ci-dessous exemple tiré de l'aide VBA
Code:
Dim TheDate As Date    ' Déclare les variables.
Dim Msg
TheDate = InputBox("Entrez une date")
Msg = "Jours à compter d'aujourd'hui: " & DateDiff("j", Now, TheDate)
MsgBox Msg
 

Dranreb

XLDnaute Barbatruc
Re : Formule sans datedif

Bonjour.
je le ferais comme ça peut être:
VB:
Dim DateFin As Date, DateDébut As Date, DifJ As Long, DifM As Long, DifA As Long
DateFin = TextBox1.Text
DateDébut = TextBox2.Text
DifJ = DateFin - DateDébut
DifM = Int(DifJ / 30.436875): DifJ = DifJ - Int(DifM * 30.436875)
DifA = DifM \ 12: DifM = DifM - DifA * 12
Du moins c'est comme ça que j'aurais fais sans DateDiff.
je ne savais même pas que cette fonction existait en VB
Cordialement
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : Formule sans datedif

la fonction DateDiff est paramétrable

Voir l'aide VBA à ce sujet.
DateDiff, fonction


Renvoie une valeur de type Variant (Long) indiquant le nombre d'intervalles de temps entre deux dates données.

Syntaxe

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

La syntaxe de la fonction DateDiff comprend les arguments nommés suivants :

Élément Description
interval Expression de chaîne correspondant à l'intervalle de temps utilisé pour calculer la différence entre date1 et date2.
date1, date2 De type Variant (Date), représentent les deux dates utilisées dans le calcul.
firstdayofweek Facultatif. Constante précisant le premier jour de la semaine. Si aucune valeur n'est précisée, la valeur par défaut est dimanche.
Firstweekofyear Facultatif. Constante précisant la première semaine de l'année. Si aucune valeur n'est précisée, la première semaine est par défaut celle du 1er janvier.



Valeurs

L'argument interval peut prendre les valeurs suivantes :

Valeur Description
yyyy Année
q Trimestre
m Mois
y Jour de l'année
d Jour
w Jour de la semaine
ww Semaine
h Heure
n Minute
s Seconde



L'argument firstdayofweek peut prendre les valeurs suivantes :

Constante Valeur Description
vbUseSystem 0 Utilise le paramètre de l'API NLS.
vbSunday 1 Dimanche (valeur par défaut)
vbMonday 2 Lundi
vbTuesday 3 Mardi
vbWednesday 4 Mercredi
vbThursday 5 Jeudi
vbFriday 6 Vendredi
vbSaturday 7 Samedi



Constante Valeur Description
vbUseSystem 0 Utilise le paramètre de l'API NLS.
vbFirstJan1 1 Commencer par la semaine du 1er janvier (valeur par défaut).
vbFirstFourDays 2 Commencer par la première semaine comportant au moins quatre jours dans l'année nouvelle.
vbFirstFullWeek 3 Commencer par la première semaine complète de l'année.



Remarques

Utilisez la fonction DateDiff pour déterminer le nombre d'intervalles de temps spécifiés entre deux dates. Par exemple, utilisez DateDiff pour calculer le nombre de jours entre deux dates ou le nombre de semaines entre la date d'aujourd'hui et la fin de l'année.

Pour calculer le nombre de jours entre date1 et date2, vous pouvez utiliser les valeurs Jour de l'année ("y") ou Jour ("d"). Si l'argument interval est Jour de la semaine ("w"), DateDiff renvoie le nombre de semaines entre les deux dates. Si date1 tombe un lundi, DateDiff calcule le nombre de lundi jusqu'à date2. La valeur date2 est prise en compte, mais pas la valeur date1. Si l'argument interval est Semaine ("ww"), la fonction DateDiff renvoie le nombre de semaines calendaires entre les deux dates. Le nombre de dimanches entre date1 et date2 est calculé. DateDiff prend en compte date2 si cette date tombe un dimanche, mais pas date1, même s'il s'agit également d'un dimanche.

Si date1 est postérieure à date2, la fonction DateDiff renvoie un nombre négatif.

L'argument firstdayofweek a une incidence sur les calculs qui utilisent les symboles d'intervalle "w" et "ww".

Si date1 ou date2 est un littéral date, l'année spécifiée devient un élément permanent de la date. Toutefois, si date1 ou date2 apparaît entre guillemets (" ") et si vous n'indiquez pas l'année, l'année en cours est insérée dans le code chaque fois que l'expression date1 ou date2 est évaluée. Vous pouvez ainsi écrire du code qui sera réutilisable au fil des années.

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.

Note Pour date1 et date2, si la valeur de la propriété Calendar est Grégorien, la date fournie par l'utilisateur doit être du même type. S'il s'agit d'un calendrier Hijri, la date doit prendre la valeur Hijri.
Post Scriptum: Bonjour Dranreb
 

Dranreb

XLDnaute Barbatruc
Re : Formule sans datedif

Bonjour TempusFugit (un pseudo prédestiné à traiter cette question on dirait)
La fin de l'aide:
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.
...me donne à penser que quoi qu'on lui demande comme intervalle, cette fonction ne conviendra pas, même pas pour renvoyer une base pour un calcul complémentaire.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Formule sans datedif

Bonjour,

Voir PJ

Pour accéder à à Datedif() en VBA, utiliser Evaluate()

x = [datedif(A1,today(),"y")]


x = Evaluate("datedif(A1,today(),""y"")")



Code:
Private Sub CommandButton1_Click()
  Me.TextBox3 = Evaluate("datedif(" & "datevalue(""" & cvDate(Me.TextBox1) & """)" & ",datevalue(""" & cvDate(Me.TextBox2) & """),""y"")")
  Me.TextBox4 = Evaluate("datedif(" & "datevalue(""" & cvDate(Me.TextBox1) & """)" & ",datevalue(""" & cvDate(Me.TextBox2) & """),""ym"")")
  Me.TextBox5 = Evaluate("datedif(" & "datevalue(""" & cvDate(Me.TextBox1) & """)" & ",datevalue(""" & cvDate(Me.TextBox2) & """),""md"")")
End Sub

Function cvDate(d)
 p1 = InStr(d, "/")
 P2 = InStr(p1 + 1, d, "/")
 cvDate = Mid(d, p1 + 1, P2 - p1) & Left(d, p1) & Mid(d, P2 + 1)
End Function

JB
 

Pièces jointes

  • DateDifVBA.xls
    41.5 KB · Affichages: 134
Dernière édition:

dhiouf

XLDnaute Occasionnel
Re : Formule sans datedif

Si, on a pas le droit de savoir pourquoi vous ajoutez 2,5 jour à la différence, ni pourquoi la durée moyenne en jour de votre année n'est pas de 365,2425...

Excusé moi c'est pas 2.5 jour mais 2 jours

exemple du 01/01/2011 au 31/12/2011
nban =ENT((A2-B2+2)/365.25) = 1 an
nbm =ENT(MOD(A2-B2+2;365.25)/(365.25/12)) = 0 mois
nbj =ENT(MOD((A2-B2+2);(365.25/12))) = 0 jour
 

pierrejean

XLDnaute Barbatruc
Re : Formule sans datedif

Bonjour a tous

Ton calcul est, bien sur, curieux

J'ai néanmoins essayé de le respecter

Teste

Code:
Sub test()
x = CDate(Range("A1"))
y = CDate(Range("B1"))
an = Int((y - x + 2.5) / 365.25)
mois = Int((y - x + 2.5 - an * 365.25) / (365.25 / 12))
jours = Int((y - x + 2.5) - an * 365.25 - mois * (365.25 / 12))
End Sub

Edit : Remplace 2.5 par 2
 

Discussions similaires

Réponses
4
Affichages
389

Statistiques des forums

Discussions
312 347
Messages
2 087 499
Membres
103 562
dernier inscrit
soso21