Microsoft 365 Convertir en VBA

PORCHER

XLDnaute Junior
Bonjour,
Je souhaiterais convertir une formule en VBA... voici ci-dessous la macro ;
Nombre de mois entre deux date
zv_Debut = CDate(TextDepart.Value) ' Date de naissance
zv_Fin = CDate(TextDateDuJour.Value) ' Date Aujourdhui

If zv_Fin <= zv_Debut Then
zv_Msg = MsgBox("La date de fin ne peut pas être antérieure à la date de début ...", 48, "Erreur")
Exit Sub
End If

nbre_mois = DATEDIF(zv_Debut;zv_Fin;"m")+(DATEDIF(zv_Debut;zv_Fin;"md")/JOUR(FIN.MOIS(zv_Fin;0)))
Txt_NbMois = FormatNumber(nbre_mois, 2) ' Deux chiffres après la virgule
Pourriez-vous SVP me corriger
Merci
 

danielco

XLDnaute Accro
Bonjour,

Essaie :

VB:
nbre_mois = DateDiff("m", zv_Debut, zv_Fin) + (Evaluate("DATEDIF(" & zv_Debut & "," & zv_Fin & ",""md"")") _
  / Day(DateSerial(Year(zv_Fin), Month(zv_Fin) + 1, 0)))
Cordialement.

Daniel
 

PORCHER

XLDnaute Junior
Bonjour daniel,
Merci pour ta réponse rapide.
Cela fonctionne: mais (exemple: zv_debut = 16/04/2019 me donne en nbre_mois 18,129 - formule Excel) et en VBA me donne(ta formule) 18
les deux chiffres après la virgule est important
Amicalement
 

PORCHER

XLDnaute Junior
Daniel pour ton information la formule Excel est celle-ci
E22 = zv_Debut
C1 = zv_Fin

=SI(E22="";"";DATEDIF(E22;$C$1;"m")+(DATEDIF(E22;$C$1;"md")/JOUR(FIN.MOIS($C$1;0))))
 

herve62

XLDnaute Barbatruc
Bonjour
Pour aider quelqu'un ici j'avais développé une appli, il y avait un combo > date de naissance puis dans sa liste excel >on retrouvait l'Age au jour de l'ouverture du fichier (via workbook open)
J'avais donc ecrit cette fonction que je te joins à adapter dans ton cas
Comme en réserve dans mon grenier , je laisse si cela peut aider
Tu entres en A > resultat en B
Après tu pourras transformer la fonction pour mettre en mois ou autre à ta mode
Comme c'est une fonction , tu pourras l'appeler aussi ( hors vba) en temps que formule dans une cellule
 

Fichiers joints

danielco

XLDnaute Accro
Daniel pour ton information la formule Excel est celle-ci
E22 = zv_Debut
C1 = zv_Fin

=SI(E22="";"";DATEDIF(E22;$C$1;"m")+(DATEDIF(E22;$C$1;"md")/JOUR(FIN.MOIS($C$1;0))))
Bonjour daniel,
Merci pour ta réponse rapide.
Cela fonctionne: mais (exemple: zv_debut = 16/04/2019 me donne en nbre_mois 18,129 - formule Excel) et en VBA me donne(ta formule) 18
les deux chiffres après la virgule est important
Amicalement
Comment as-tu défini nbre_mois ? nbre_mois ne doit pas être défini comme integer ou long mas comme single ou double. Et quelle est la valeur de zv_fin ?
Daniel
 
Dernière édition:

PORCHER

XLDnaute Junior
Bonjour Hervé et merci
Le seul problème est que au restos du coeur un enfant de 0 à 6 mois et 1 jour ou de 6 à 12 mois et 1 jour ou de 12 à 18 mois et 1 jour recois un repas enfant au 2 éme jour ne recois rien.
Ta formale est génial et rapide mail il manque les jous !
Merci encore hervé et si tu as une réponse je prends.
 

herve62

XLDnaute Barbatruc
@danielco
Ce que je fais est l'affinage au mois près avec mise en forme : impossible en formule
@PORCHER : tu es au jour près ?? avec mon fichier , il faut donc l'ouvrir tous les jours !! là pas évident au jour le jour ......mais possible , je regarde mon calcul , seul hic jongler avec les 30 et 31
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour tout le monde,
Sinon par macro avec FormulaR1C1, bestial mais simple :
VB:
Sub CalcNbMois() ' Macro
    [C3].FormulaR1C1 = "= DATEDIF(zv_Debut,zv_Fin,""m"")+(DATEDIF(zv_Debut,zv_Fin,""md"")/DAY(EOMONTH(zv_Fin,0)))"
    [C3] = [C3].Value
End Sub
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Je dirais :
VB:
Function AgeEnMois(ByVal DNais As Date) As Double
   Dim DN1er As Date, FMois As Date
   DN1er = DateSerial(Year(DNais), Month(DNais), 1)
   FMois = DateSerial(Year(Date), Month(Date) + 1, 0)
   AgeEnMois = Int(100 * (12 * (Year(Date) - Year(DNais)) + Month(Date) - Month(DNais) + 1) _
      * (Date - DNais) / (FMois - DN1er) + 0.5) / 100
   End Function
Faire Txt_NbMois.Text = AgeEnMois(CDate(TextDepart.Text))
 
Dernière édition:

danielco

XLDnaute Accro
Réponse provisoire utilisant la cellule AA10 (tu peux bien sûr la changer pour toute autre cellule inutilisée :

VB:
[AA10].Formula = "=DATEDIF(""" & Format(zv_Debut, "d/m/yyyy") & """,""" & Format(zv_Fin, "d/m/yyyy") & """,""md"")"
nbre_mois = DateDiff("m", zv_Debut, zv_Fin) + ([AA10] / Day(DateSerial(Year(zv_Fin), Month(zv_Fin) + 1, 0)))
 

BrunoM45

XLDnaute Barbatruc
Salut PORCHER,

Voici la solution au problème de DateDif que j'ai trouvé ;)
VB:
Sub Test()
  Dim zv_debut As Date, zv_fin As Date
  Dim sDateDeb As String, sDateFin As String
  Dim sForm As String
  '
  zv_debut = #4/16/2019#
  ' Convertir la date au format américain + texte
  sDateDeb = Format(zv_debut, "mm/dd/yyyy")
  zv_fin = Date
  ' Convertir la date au format américain + texte
  sDateFin = Format(zv_fin, "mm/dd/yyyy")
  ' Inclure la transformation en date des dates texte... et oui ça marche comme ça ;-)
  sForm = "datedif(" & "datevalue(""" & sDateDeb & """)" & ",datevalue(""" & sDateFin & """),""md"")"
  Debug.Print Application.Evaluate(sForm)
End Sub
@+
 

danielco

XLDnaute Accro
Réponse provisoire utilisant la cellule AA10 (tu peux bien sûr la changer pour toute autre cellule inutilisée :

VB:
[AA10].Formula = "=DATEDIF(""" & Format(zv_Debut, "d/m/yyyy") & """,""" & Format(zv_Fin, "d/m/yyyy") & """,""md"")"
nbre_mois = DateDiff("m", zv_Debut, zv_Fin) + ([AA10] / Day(DateSerial(Year(zv_Fin), Month(zv_Fin) + 1, 0)))
Bonjour tout le monde,
Sinon par macro avec FormulaR1C1, bestial mais simple :
VB:
Sub CalcNbMois() ' Macro
    [C3].FormulaR1C1 = "= DATEDIF(zv_Debut,zv_Fin,""m"")+(DATEDIF(zv_Debut,zv_Fin,""md"")/DAY(EOMONTH(zv_Fin,0)))"
    [C3] = [C3].Value
End Sub
Bonjour @sylvanu ,
Effectivement, mais je ne comprends pas pourquoi passer par une cellule. Je en'arrive pas à utiliser Evalua
Bonjour.
Je dirais :
VB:
Function AgeEnMois(ByVal DNais As Date) As Double
   Dim DN1er As Date, FMois As Date
   DN1er = DateSerial(Year(DNais), Month(DNais), 1)
   FMois = DateSerial(Year(Date), Month(Date) + 1, 0)
   AgeEnMois = Int(100 * (12 * (Year(Date) - Year(DNais)) + Month(Date) - Month(DNais) + 1) _
      * (Date - DNais) / (FMois - DN1er) + 0.5) / 100
   End Function
Faire Txt_NbMois.Text = AgeEnMois(CDate(TextDepart.Text))
Bonjour @Dranreb ,
Ta fonction renvoie 18,05. Je trouve 18,0322580645161 ? et @PORCHER :18,129 :)
Daniel
 

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