Macro DateDiff pour calcul écart en jours

Bonjour à tous,

Je suis actuellement bloqué sur ma macro DateDiff que je n'arrive pas à faire tourner correctement (le résultat qui m'est donné ne correspond pas au résultat réel).
Je cherche en effet à obtenir l'écart en jours entre deux dates (Dateone et Datetwo).
Voici le code du Module actuel :
Public Sub CalculTempsdeCycle()
Application.ScreenUpdating = False

Dim Dateone As Date
Dim Datetwo As Date
Dim tcycle As Long
If Datetwo > Dateone Then Exit Sub

Dim i As Long
Dim i_tot As Long

Sheets("Gestion").Select

i = 5
i_tot = 5
Do Until IsEmpty(Cells(i_tot, 8)) = True
i_tot = i_tot + 1
Loop

Do Until i = i_tot

Dateone = Cells(i, 50)
Datetwo = Cells(i, 8)

Cells(i, 51) = tcycle
tcycle = DateDiff(d, Dateone, Datetwo)
i = i + 1
Loop

Application.ScreenUpdating = True
End Sub


Je vous remercie par avance pour votre aide et vos commentaires.
Bonne journée :)

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Je n'est pas bien saisie le but de ce code.. Mais pour la différence de jour, il suffit de soustraire une date à une autre dans une cellule et tu as le nombre de jours. Pas besoin de vba normalement.

    Le code
    If Datetwo > Dateone Then Exit Sub
    veut dire la 1ère date est supérieur à la 2ème ?

    Cordialement
    1. Merci eljojo,

      Je ne peux pas passer par une simple formule Excel (=DateDif) car la ligne et les cellules où se trouvent les dates ainsi que celles où se trouve la différence de jours entre ces dates n'existent pas lorsque le fichier est vierge. Ces lignes seront créées par l'utilisateur pendant l'avancement du dossier.

      Concernant Datetwo > Dateone c'est pour palier aux erreurs éventuelles que pourraient faire les utilisateurs, bloquant ainsi le sub quand la saisie est erronée.
      1. D'accord, mais les utilisateurs ne peuvent-ils pas faire une simple formule : (=cellule1-cellule2) ? Je viens encore de tester cela m'affiche le nombre de jours
      2. L'objectif est de simplifier la vie des utilisateurs ;)
        Dans l'absolu, ils peuvent, mais je souhaite qu'ils n'aient pas à le faire.
    2. Contributeur
      Bonjour
      tcycle = DateDiff("d", Dateone, Datetwo)

      mais jojo a raison

      2/dans ta macro, tu écris
      i_tot = 5
      Do Until IsEmpty(Cells(i_tot, 8)) = True
      i_tot = i_tot + 1
      Loop


      tu sembles chercher la 1° ligne non vide
      si oui essaies sans boucle
      i_tot= Columns("H").Find("*", Range("B4")).Row


      3/

      Cells(i, 51) = tcycle
      tcycle = DateDiff(d, Dateone, Datetwo)

      peut-^etre inverser les 2 lignes ?

       Michel
      1. Merci pour vos réponses.

        J'ai redéfini mes variables (et remplacé d par "d") :
            Dim Dateone As Date
        Dim Datetwo As Date
        Dim tcycle As String

        Dim i As Long
        Dim i_tot As Long


        Michel je ne comprends pas le :
        i_tot= Columns("H").Find("*", Range("B4")).Row

        Notamment la partie Range("B4"), car le module doit s'arrêter en effet lorsque les cellules de la colonne 5 (donc H) sont vides.
        La ligne 4 de mon fichier est bloquée et non modifiable par l'utilisateur, peut être est-ce la raison.
        1. Contributeur
          As tu essayer ?
        2. Oui, sans succès...
      2. Contributeur
        http://www.cjoint.com/data3/ELdiZLKqmTx_Classeur1.xlsm
        1. Merci Michel pour cet exemple.
          J'aimerais, que ma macro ne tourne pas lorsque les champs de la colonne H sont vide, et non chercher la première case non vide.

          Les premiers calculs doivent s'effectuer sur la ligne 5 pour calculer la DateDiff.
          J'avance, j'y suis presque ! :)
      3. Contributeur
        bon, si j'ai pigé: on calcule la différence de jour si il y a quelque chose dans la colonne H après la ligne 4

        essaies

        'nombre de cellules > adresse H4 non vides
        Nbre = Application.CountIf(Range("H5:H1000"), "*") '10000 à adapter
        If Nbre = 0 Then GoTo err_vide
        i_tot = 4
        For Cptr = 1 To Nbre
        i_tot = Columns("H").Find("*", Cells(i_tot, "H")).Row
        Cells(i_tot, 51) = datetwo - dateone
        Next
        Exit Sub
        'gestionnaire erreurs
        err_vide:
        MsgBox "plage vide", vbCritical
        End Sub


        nota
        Application.ScreenUpdating = True inutile: la réactivation de l'écran s'effectue automatiquement lorsque tu rend la main au système

        1. Michel, je pense avoir un problème de relation entre i et i_tot
          Je ne vois pas comment procéder sans boucle...
          Avec votre code peut-être n'ai-je plus besoin de la fonction DateDiff ?
          Public Sub CalculTempsdeCycle()

          'Calcul du temps de cycle

          Dim Dateone As Date
          Dim Datetwo As Date
          Dim tcycle As Long

          Dim i As Long
          Dim i_tot As Long

          Sheets("Gestion").Select
          i = 5

          Dateone = Cells(i, 50)
          Datetwo = Cells(i, 8)

          tcycle = DateDiff("d", Datetwo, Dateone)
          Cells(i, 51) = tcycle

          Nbre = Application.CountIf(Range("H5:H1000"), "*")
          If Nbre = 0 Then GoTo err_vide
          i_tot = 4
          For Cptr = 1 To Nbre
          i_tot = Columns("H").Find("*", Cells(i_tot, "H")).Row

          Cells(i_tot, 51) = Datetwo - Dateone
          Next

          Exit Sub
          err_vide:
          MsgBox "Plage vide", vbCritical

          End Sub

        2. Contributeur
          @AnthonyCKpour le coup de datediff, jojo, que je salue, a donné la bonne solution + simple que datediff valable si on cherche des mois ou des années..... ou années, mois, jours!!!
          tu snobes ou quoi?

          dans mon code j'ai marqué "cptr" au lieu de "i"
          c'est un crime ?

          Abandon du suivi
        3. Je ne snobe rien ni personne. Vous avez mal interprété mon message. Bonne journée.