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 :

Problème de dépassement de capacité [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut Problème de dépassement de capacité
    Bonjour à tous

    J'ai un petit problème avec ma macro.
    Ma macro effectue une différence entre deux date en termes d'années, de mois et de jours.

    Le code est le suivant:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Function vbaDateDiff(ByVal FirstDateCell As String, ByVal SecondDateCell As String, ByVal StringCode As String) As Long
        dte = FirstDateCell
        dte2 = SecondDateCell
        vbaDateDiff = Application.Evaluate("DATEDIF(DATEVALUE(""" & FirstDateCell & """),DATEVALUE(""" & SecondDateCell & """),""" & StringCode & """)")
    End Function
     
    Sub t()
     
     'calcul
     Dim test As Range
    Dim test23 As Range
    Dim diff As Integer
    Dim dest As Range
     
    Dim jr As Integer
    Dim mo As Integer
    Dim an As Integer
    With ActiveSheet
     
     
        Set test = .Range("J1")
        Set test23 = .Range("AH1")
        Set dest = .Range("AQ1")
        For i = 0 To .Columns(1).Find("TH*", , , , xlByColumns, xlPrevious).Row - 1
            If IsDate(test.Offset(i, 0)) Then
                diff = test.Offset(i, 0) - test23.Offset(i, 0)
                If diff <= 0 Then
                    jr = vbaDateDiff(Format(test.Offset(i, 0), "mm/dd/yyyy"), Format(test23.Offset(i, 0), "mm/dd/yyyy"), "md")
                    mo = vbaDateDiff(Format(test.Offset(i, 0), "mm/dd/yyyy"), Format(test23.Offset(i, 0), "mm/dd/yyyy"), "ym")
                    an = vbaDateDiff(Format(test.Offset(i, 0), "mm/dd/yyyy"), Format(test23.Offset(i, 0), "mm/dd/yyyy"), "y")
                    dest.Offset(i, 0) = an
                    dest.Offset(i, 1) = mo
                    dest.Offset(i, 2) = jr
                Else
                    jr = vbaDateDiff(Format(test23.Offset(i, 0), "mm/dd/yyyy"), Format(test.Offset(i, 0), "mm/dd/yyyy"), "md")
                   mo = vbaDateDiff(Format(test23.Offset(i, 0), "mm/dd/yyyy"), Format(test.Offset(i, 0), "mm/dd/yyyy"), "ym")
                   an = vbaDateDiff(Format(test23.Offset(i, 0), "mm/dd/yyyy"), Format(test.Offset(i, 0), "mm/dd/yyyy"), "y")
                     dest.Offset(i, 0) = an
                    dest.Offset(i, 1) = mo
                  dest.Offset(i, 2) = jr
            End If
            End If
        Next i
    End With
    End Sub
    Lorsque j'exécute la macro j'ai un message d'erreur me disant qu'il y a un dépassement de capacité.

    Je constate que quand je supprime dans la colonne de J les dates de l'année 1900, la macro fonctionne. Le problème est que les données que je supprime sont indispensables.

    Pouvez-vous m'aider s'il vous plait?

    Cdt
    Tiviia
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Je n'ai pas regardé en profondeur. Cependant avec ton message d'erreur :

    => remplace tous tes "Integer" par des "Long" ou des "Double" et dis moi si le problème persiste !

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Bonjour Kimy_Ire

    Lorsque je remplace par les "INTEGER" par "DOUBLE" Ou "Long"; j'ai un message erreur de compatibilité ....

    Je ne sais plus quoi faire

  4. #4
    Membre averti
    Homme Profil pro
    Ctrl Gestion
    Inscrit en
    Octobre 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ctrl Gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 177
    Points : 363
    Points
    363
    Par défaut
    Bonjour Tiviia, Kimy_ire, le Forum,

    La piste indiquée par Kimy_Ire me parait bonne, j'ai juste remplacer :

    Diff as integer
    par
    Diff as double

    et cela ne provoque pas d'erreur d'exécution.

    Slts

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    C'est probablement dû à une incompatibilité de type. Essai comme ceci :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Function vbaDateDiff(ByVal FirstDateCell As Long, ByVal SecondDateCell As Long, ByVal StringCode As String) As Long
     
        vbaDateDiff = DateDiff(StringCode, FirstDateCell, SecondDateCell)
     
    End Function
     
    Sub t()
     
    Dim Test As Range
    Dim test23 As Range
    Dim diff As Long
    Dim dest As Range
     
    Dim jr As Long
    Dim mo As Long
    Dim an As Long
    Dim I As Long
     
        With ActiveSheet
     
            Set Test = .Range("J1")
            Set test23 = .Range("AH1")
            Set dest = .Range("AQ1")
     
            For I = 0 To .Columns(1).Find("TH*", , , , xlByColumns, xlPrevious).Row - 1
     
                If IsDate(Test.Offset(I, 0)) Then
     
                    diff = CLng(Test.Offset(I, 0)) - CLng(test23.Offset(I, 0))
     
                    jr = IIf(diff <= 0, vbaDateDiff(Test.Offset(I, 0), test23.Offset(I, 0), "d"), vbaDateDiff(test23.Offset(I, 0), Test.Offset(I, 0), "d"))
                    mo = IIf(diff <= 0, vbaDateDiff(Test.Offset(I, 0), test23.Offset(I, 0), "m"), vbaDateDiff(test23.Offset(I, 0), Test.Offset(I, 0), "m"))
                    an = IIf(diff <= 0, vbaDateDiff(Test.Offset(I, 0), test23.Offset(I, 0), "yyyy"), vbaDateDiff(test23.Offset(I, 0), Test.Offset(I, 0), "yyyy"))
     
                    dest.Offset(I, 0) = an
                    dest.Offset(I, 1) = mo
                    dest.Offset(I, 2) = jr
     
                End If
     
            Next I
     
        End With
     
    End Sub
    Hervé.

    Re,

    Pas rafraîchi mais Kimy_Ire effectivement mis le doigt dessus le problème ;o)

    Hervé.

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Bonjour

    Je vous remercie m'avoir répondu .

    Theze, je viens de tester ton code. Il s'exécute sans erreurs, mais quand j'analyse les résultats je constate que la macro calcul la différence entre deux date avec des unités de temps différents (années, mois, jours),c'est le même résultat dans des unités de temps différents.

    Mais je veux avoir le résultat en année mois jours.

    Par exemple: la différence entre le 02/03/2012 et 01/02/2013 est 1 an 1 mois 1 jour.

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Voilà qui, je crois, devrait te convenir :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Function vbaDateDiff(FirstDateCell As Long, SecondDateCell As Long, StringCode As String) As Long
     
        Dim Temp As Long
     
        'inverse les valeurs si nécessaire
        If FirstDateCell > SecondDateCell Then
     
            Temp = FirstDateCell
            FirstDateCell = SecondDateCell
            SecondDateCell = Temp
     
        End If
     
        vbaDateDiff = Application.Evaluate("DATEDIF(" & FirstDateCell & "," & SecondDateCell & ",""" & StringCode & """)")
     
    End Function
     
    Sub t()
     
    Dim test As Range
    Dim test23 As Range
    Dim dest As Range
    Dim I As Long
     
        With ActiveSheet
     
            Set test = .Range("J1")
            Set test23 = .Range("K1")
            Set dest = .Range("M1")
     
            For I = 0 To .Columns(1).Find("TH*", , , , xlByColumns, xlPrevious).Row - 1
     
                If IsDate(test.Offset(I, 0)) Then
     
                    dest.Offset(I, 2) = vbaDateDiff(test.Offset(I, 0), test23.Offset(I, 0), "md")
                    dest.Offset(I, 1) = vbaDateDiff(test.Offset(I, 0), test23.Offset(I, 0), "ym")
                    dest.Offset(I, 0) = vbaDateDiff(test.Offset(I, 0), test23.Offset(I, 0), "y")
     
                End If
     
            Next I
     
        End With
     
    End Sub
    Hervé.

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Bonjour Theze

    Dans un premier temps, je te remercie infiniment de l'aide que tu m'a apporté.

    Ton code fonctionne !!

    C'est génial !

    Je remercie également les autres qui ont participé à la discussion!

    Un GRAND MERCI à TOUS !

    Cdt
    Tiviia

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Bonjour à tous

    Avec le code suivant je peux calculer la différence entre deux dates en année, mois et jours.

    Je viens de constater que j'ai des valeurs négatives de jours.

    Comment faire pour ne plus avoir ce problème??


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Function vbaDateDiff(FirstDateCell As Long, SecondDateCell As Long, StringCode As String) As Long
     
        Dim Temp As Long
     
        'inverse les valeurs si nécessaire
        If FirstDateCell > SecondDateCell Then
     
            Temp = FirstDateCell
            FirstDateCell = SecondDateCell
            SecondDateCell = Temp
     
        End If
     
        vbaDateDiff = Application.Evaluate("DATEDIF(" & FirstDateCell & "," & SecondDateCell & ",""" & StringCode & """)")
     
    End Function
     
    Sub t()
     
    Dim test As Range
    Dim test23 As Range
    Dim dest As Range
    Dim I As Long
     
        With ActiveSheet
     
            Set test = .Range("J1")
            Set test23 = .Range("K1")
            Set dest = .Range("M1")
     
            For I = 0 To .Columns(1).Find("TH*", , , , xlByColumns, xlPrevious).Row - 1
     
                If IsDate(test.Offset(I, 0)) Then
     
                    dest.Offset(I, 2) = vbaDateDiff(test.Offset(I, 0), test23.Offset(I, 0), "md")
                    dest.Offset(I, 1) = vbaDateDiff(test.Offset(I, 0), test23.Offset(I, 0), "ym")
                    dest.Offset(I, 0) = vbaDateDiff(test.Offset(I, 0), test23.Offset(I, 0), "y")
     
                End If
     
            Next I
     
        End With
     
    End Sub
    Cdt
    Tiviia

  10. #10
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Sur quelles dates par exemple car à partir de ton classeur test, je n'ai constaté aucune différence de jour en négatif ?
    As-tu testé avec la fonction DATEDIF() dans Excel comme ci-dessous par exemple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =DATEDIF(J2;L2;"md")
    Hervé.

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Bonjour

    Oui j'ai testé manuellement; je trouve toujours des valeurs négatives de jours.

    Voila un nouveau fichier.
    Il faut appliquer un autofiltre pour voir les valeurs négatives de jours.

    Cdt

    Tiviia

    PS: j'ai gardé les mêmes colonnes du code.
    Fichiers attachés Fichiers attachés

  12. #12
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    Alors, modifie la fonction de façon à avoir 0 :
    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
     
    Function vbaDateDiff(FirstDateCell As Long, SecondDateCell As Long, StringCode As String) As Long
     
        Dim Temp As Long
        Dim LaDate As Long
     
        'inverse les valeurs si nécessaire
        If FirstDateCell > SecondDateCell Then
     
            Temp = FirstDateCell
            FirstDateCell = SecondDateCell
            SecondDateCell = Temp
     
        End If
     
        LaDate = Application.Evaluate("DATEDIF(" & FirstDateCell & "," & SecondDateCell & ",""" & StringCode & """)")
     
        If LaDate < 0 Then LaDate = 0
     
        vbaDateDiff = LaDate
     
    End Function
    Hervé.

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Merci hervé !

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

Discussions similaires

  1. Problème de dépassement de capacité
    Par nicolav dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/08/2009, 08h05
  2. Problème de dépassement de capacité
    Par moilou2 dans le forum VBA Access
    Réponses: 31
    Dernier message: 18/06/2008, 16h14
  3. [VBA-E] Problème de dépassement de capacité sous Excel
    Par Nicolas67 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2006, 10h36
  4. Problème de dépassement de la capacité d'un TImage
    Par fred.mathiot dans le forum Composants VCL
    Réponses: 7
    Dernier message: 28/12/2005, 11h13
  5. détection de dépassement de capacité
    Par tut dans le forum C++
    Réponses: 10
    Dernier message: 01/12/2004, 22h11

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