IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Calculer la différence entre 2 dates


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Par défaut Calculer la différence entre 2 dates
    Bonjour,

    Voici mon problème.

    Dans une feuille Excel (nommée base_brute), j'ai plusieurs colonnes dont 2 contiennent des dates (au format date) mais certaines cellules peuvent être vides.

    Voici un exemple :
    colonne M colonne R
    04/02/2008 04/02/2008
    30/01/2008
    30/03/2007
    30/01/2008 30/01/2008


    Il faut que je repère les dates aberrantes, c'est à dire compter le nombre de fois où la date1 (colonne M) est supérieure à la date2 (colonne R). Je ne sais pas si je suis très claire ?!

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    'Tant qu'il y a des données dans la 1ere colonne
    Do Until Sheets("base brute").Cells(i, 1) = ""
     
    date_1 = Cells(i, 13)
    date_2 = Cells(i, 18)
     
    Diff = DateDiff("d", date_2, date_1)
     
    If Sheets("base brute").Cells(i, 13) <> "" And Sheets("base brute").Cells(i, 18) <> "" And Diff > 0 Then
    cpt = cpt + 1
    i = i + 1
    Else
    i = i + 1
    End If
    Loop
     
    Sheets("indicateurs_fiabilité").Cells(63, 5) = cpt
    Ce code me renvoie "0".

    Quelqu'un peut-il me donner des pistes ?? Je suis despérée Merci

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour,

    En reprenant ton code, j'en ai écrit un autre pour tester (à adapter)
    Ceci fonctionne chez moi (si j'ai bien compris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Sub testdatediff()
     
    Dim Maplage As Range
    Dim MaFeuille As String
    Dim Macellule As Range
    Dim Cpt As Long
    Dim date_1 As Variant
    Dim date_2 As Variant
     
    MaFeuille = "TestDif"
    Set Maplage = Sheets(MaFeuille).Range("A10:A35")
     
    For Each Macellule In Maplage
        date_1 = Cells(Macellule.Row, 1).Value
        date_2 = Cells(Macellule.Row, 2).Value
     
        If Not IsDate(date_1) Or Not IsDate(date_2) Then
            Cpt = Cpt + 1
        Else
            Diff = DateDiff("d", date_2, date_1)
            If Diff > 0 Then
                Cpt = Cpt + 1
            End If
        End If
    Next
     
    MsgBox Cpt
     
    End Sub
    Tu dis.

    Edit : Cpt en type Long

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut
    bonjour,
    si j'ai bien compris, avec les données de ton exemple il est normal que cpt=0 car les trois conditions ne sont jamais remplies ensemble,ou plutot on n'a jamais DIFF>0 . (DIFF = 0 )
    si j'ai bien compris..

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Par défaut
    Merci pour vos messages.

    J'ai essayé de reprendre le code d'aalex_38, mais ça ne fonctionne pas. Le compteur s'incrémente et fait planter le PC.

    J'ai tenté un code plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    If Sheets("base brute").Cells(i, 13) <> "" And Sheets("base brute").Cells(i, 18) <> "" And Sheets("base brute").Cells(i, 13) > Sheets("base brute").Cells(i, 18) Then
        cpt = cpt + 1
        i = i + 1
    Else
        i = i + 1
    End If
    Ce code fonctionne. J'ai bien une valeur qui m'est retournée cependant le résultat est faux. C'est donc un problème de format ?!
    Si je fais la différence entre les dates (avec dateval sous Excel), j'obtient le bon nb de cellules où date1>date2.

    Je suis débutante. Ayez un peu d'indulgence car ma requête doit peut être vous paraitre bête

  5. #5
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Mon exemple plante, peux être Cpt devrait être de type long ?
    Désolé.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Le code de Aalex_38 fonctionne très bien chez moi, si l'une des 2 cellules ne contient pas une date ou si la date de la 2ème colonne est supérieure à celle de la première colonne (sinon la différence est négative) et compte tenu de votre condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Diff > Then
    Cpt = Cpt + 1 
           End If
    le compteur ne s'incrémente pas. Est-ce bien ce que vous voulez ?

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut
    peut être un problème de définition du problème?
    dans ce que j'ai compris, tu cherches à compter le nombre de couples de dates valides ( d1 n'est pas vide ET d2 non plus ET d2 - d1 est strictement(!) positif)
    Dans l'exemple ci dessous ( d1 est dans la cellule "a1"), la formule sous résultat est =SI(ET(A2<>"";B2<>"";B2-A2>0);1;0), et CPT=2 (on a 0 si d1=d2)

    "d1" + d2" + resultat
    28/01/2009+30/01/2009 1'd2>d1
    29/01/2009+29/01/2009 0'd2=d1
    08/02/2009 0 'd2 vide
    28/02/2009+23/02/2009 0'd2<d1
    20/01/2007 0'd2 vide
    30/03/2009+01/04/2009 1'd2>d1
    total: 2

    Pour obtenir ça par vba voilà une façon comme une autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim CPT As Long, CHECK As Integer, TOTAL As Long
    CPT = 0
    For Each cell In Range("a2:a7")
    CHECK = 2 'permet pour chaque cellule de vérifier, =0 si faux, 1 si vrai
    If Application.And(cell <> "", cell.Offset(0, 1) <> "", cell.Offset(0, 1) - cell > 0) Then
    CPT = CPT + 1
    CHECK = 1
    else:
    CHECK = 0
    End If
    Next cell
    TOTAL = CPT

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer la différence entre deux dates
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 18/12/2007, 09h27
  2. [Access] Calculer la différence entre 2 dates
    Par subnox dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/08/2007, 15h16
  3. [Formule] Calculer la différence entre 2 dates
    Par titof90 dans le forum Excel
    Réponses: 1
    Dernier message: 22/05/2007, 18h07
  4. [Dates] Calculer la différence entre 2 dates
    Par cyberdevelopment dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2007, 14h34
  5. Réponses: 4
    Dernier message: 18/10/2006, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo