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 :

anomalie entre variable date


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    Bonjour,

    Voici le programme 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
     
        Dim HeureDeb As Date
        Dim HeureFin As Date
        Dim Duree As Date
        Dim Tab As Variant
            Tab = Range("A1").CurrentRegion.Value
            HeureDeb = Tab(1, 1)          
            HeureFin = Tab(1, 2)          
            Duree = Tab(1, 3)            
     
            If HeureDeb <> "00:00:00" Then                        
                If Duree = "00:00:00" And HeureFin <> "00:00:00" Then
                    Duree = Abs(HeureFin - HeureDeb)
                Else
                    If (Duree <> "00:00:00") And (HeureFin = "00:00:00") Then
                        HeureFin = HeureDeb + Duree
                    Else
                        MsgBox ("err 1")
                    End If
                End If
            Else
                MsgBox ("err 2")
            End If
     
            If HeureDeb > HeureFin Then
                MsgBox ("err 3")
            Else
                If (HeureFin - HeureDeb) <> Duree Then
                    MsgBox ("err 4")
                End If
            End If
    Le tableau "entrée" génère
    Hdeb="10:00:00"
    Hfin="00:00:00" 'cellule vide au début
    Duree="02:00:00"

    Quand je fais du pas à pas, Hfin prend la valeur "12:00:00" car le programme passe bien par :
    If (Duree <> "00:00:00") And (HeureFin = "00:00:00") Then
    HeureFin = HeureDeb + Duree

    Par contre, le message "err4" s'affiche.
    En consultant le contenu des variables (HeureFin, HeureDeb, Duree),
    j'ai bien "12:00:00-10:00:00<>02:00:00".
    If (HeureFin - HeureDeb) <> Duree Then
    MsgBox ("err 4")
    End If
    Bizarre.

    Merci pour les réponses.

    En cherchant un peu plus,
    Je peux faire une comparaison entre hdeb+hfin<>duree.
    Je ne peux pas faire une comparaison entre hfin-hdeb<>duree.

    Bizarre. Une addition ok, une soustraction ce n'est pas bon.
    J'ai essayé de mettre des parenthèses. Même constat.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Ce qui est bizarre, c'est que tu mettes des dates entre guillemets. Tu dois mettre les dates entre "#". Par exemple #09:30:00#

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 265
    Billets dans le blog
    2
    Par défaut
    Bonjour rico, Bonjour Daniel,

    Je souscris tout à fait à la remarque de Daniel, il est important de bien typer ses données dans le code, les guillemets sont réservées au texte
    Cependant je pense que ça ne vient pas de là
    Excel et VBA gèrent les heures comme des fractions de journées, donc #07:00# est en réalité stocké comme 7/24
    on se retrouve avec des nombres avec beaucoup de décimales, ce qui peut entrainer de petites différences

    pour t'en convaincre, essaye le code là (j'ai dû changer ta variable Tab en Tablo, le nom Tab est un nom réservé en VBA)

    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
    Sub test()
        Dim HeureDeb As Date
        Dim HeureFin As Date
        Dim Duree As Date
        Dim Tablo As Variant
            Tablo = Range("A1").CurrentRegion.Value
            HeureDeb = Tablo(1, 1)
            HeureFin = Tablo(1, 2)
            Duree = Tablo(1, 3)
             If HeureDeb <> #12:00:00 AM# Then
                If Duree = #12:00:00 AM# And HeureFin <> #12:00:00 AM# Then
                    Duree = Abs(HeureFin - HeureDeb)
                Else
                    If (Duree <> #12:00:00 AM#) And (HeureFin = #12:00:00 AM#) Then
                        HeureFin = HeureDeb + Duree
                    Else
                        MsgBox ("err 1")
                    End If
                End If
            Else
                MsgBox ("err 2")
            End If
     
            If HeureDeb > HeureFin Then
                MsgBox ("err 3")
            Else
                If (HeureFin - HeureDeb) <> Duree Then
                    MsgBox ("err 4")
                End If
            End If
            MsgBox Format(HeureFin - HeureDeb - Duree, "0.0000000000000000000")
    End Sub
    Toujours la même erreur mais on comprend que la différence n'est pas nulle
    Je pense qu'un arrondi à 10 décimales (par exemple) devrait arranger ce type de soucis
    Pas toujours facile de savoir où mettre les arrondis...

    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
    Sub test()
        Dim HeureDeb As Double
        Dim HeureFin As Double
        Dim Duree As Double
        Dim Tablo As Variant
            Tablo = Range("A1").CurrentRegion.Value
            HeureDeb = Round(Tablo(1, 1), 10)
            HeureFin = Round(Tablo(1, 2), 10)
            Duree = Round(Tablo(1, 3), 10)
             If HeureDeb <> 0 Then
                If Duree = 0 And HeureFin <> 0 Then
                    Duree = Abs(HeureFin - HeureDeb)
                Else
                    If (Duree <> 0) And (HeureFin = 0) Then
                        HeureFin = HeureDeb + Duree
                    Else
                        MsgBox ("err 1")
                    End If
                End If
            Else
                MsgBox ("err 2")
            End If
     
            If HeureDeb > HeureFin Then
                MsgBox ("err 3")
            Else
                If Round((HeureFin - HeureDeb), 10) <> Round(Duree, 10) Then
                    MsgBox ("err 4")
                End If
            End If
            MsgBox Format(Round(HeureFin - HeureDeb, 10) - Round(Duree, 10), "0.0000000000000000000")
    End Sub

  4. #4
    Membre confirmé
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    J'ai essayé aussi cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (HeureFin) <> (Duree + HeureDeb) Then
    sans succès.

    Avez vous une petite idée.

    Le tableau "entrée" génère
    Hdeb=10:00:00
    Hfin=00:00:00 'cellule vide au début
    Duree=02:00:00

    et non
    Hdeb="10:00:00"
    Hfin="00:00:00" 'cellule vide au début
    Duree="02:00:00"

    La comparaison avec les guillemets fonctionne.
    Par contre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (HeureFin) <> (Duree + HeureDeb)
    affiche le msg err4
    même si la comparaison retourne vrai.

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    C'est une erreur d'arrondi comme il s'en produit parfois et quui suscite un abondante littérature (cherche sur internet avec les mots erreur, calcul et virgule flottante).
    Dans ton cas, mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        HeureDeb = Round(Tabl(1, 1), 20)
        HeureFin = Round(Tabl(1, 2), 20)
        Duree = Round(Tabl(1, 3), 20)

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/05/2014, 07h51
  2. Réponses: 6
    Dernier message: 20/12/2007, 10h00
  3. comment obtenir l’intervalle de mois entre deux date
    Par looc 6699 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/02/2005, 11h08
  4. Réponses: 6
    Dernier message: 14/02/2005, 11h53
  5. calcule du nombre de jours entre 2 dates
    Par nazimb dans le forum ASP
    Réponses: 4
    Dernier message: 28/09/2004, 15h22

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