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 :

Test inopérant


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Par défaut Test inopérant
    Bonjour à tous,

    J'ai un soucis avec des tests dans une macro VBA pour Excel 2003 SP2.

    Voici le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        'If ((temp <> date_6h_mat) And (temp <> date_6h_mat_plus) And (temp <> date_6h_mat_moins)) Then
        If (temp <> date_6h_mat) Then
            If (temp <> date_6h_mat_plus) Then
                If (temp <> date_6h_mat_moins) Then
                    MsgBox "ALERTE !!! YA UN MEGA PROBLEME !!!!!", 16, "ERREUR !!!"
                End If
            End If
        End If
    La variable 'temp' est locale à une sous-routine, c'est un format Date.
    Les variables 'date_6h_mat', 'date_6h_mat_plus' et 'date_6h_mat_moins' sont aussi des formats Date et sont de type 'public' à toute la macro.

    Quand je trace le prog ligne à ligne, je vois bien que :
    'temp' contient "20/06/2008 05:59:00"
    'date_6h_mat' contient "20/06/2008 06:00:00"
    'date_6h_mat_plus' contient "20/06/2008 06:01:00"
    'date_6h_mat_moins' contient "20/06/2008 05:59:00"

    Donc, que ce soit un test en une seule ligne (voir la 1ère ligne en commentaire du code) ou la succession des 3 tests, cela ne marche pas !!!
    Pourtant 'temp' et 'date_6h_mat_moins' étant égales, il ne devrait pas afficher la message box, et bien si... ARGH !!!

    Si quelqu'un a une idée, je suis preneur...

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Par défaut
    peut etre que ta variable Temp doit etre publique?

    sinon ta sous routine qui te donne Temp te renvoit elle bien la bonne valeur?

    sinon pas d'autre idee..

  3. #3
    Membre éclairé Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Par défaut
    Citation Envoyé par pyrene Voir le message
    peut etre que ta variable Temp doit etre publique?

    sinon ta sous routine qui te donne Temp te renvoit elle bien la bonne valeur?

    sinon pas d'autre idee..
    La var 'temp' est remplie à l'aide de la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function transform_timer_date(compteur As Long) As Date
    ' transforme un compteur exprimé en nbre de seconde en vraie date
    ' ATTENTION : le calcul se fait à partir de la date 01/01/1980 qui est le référentiel de la supervision
    ' une cellule (lointaine) de la feuille ouverte est utilisée pour le calcul
     
        Dim tempo As Double, tempo_date As Date
     
        tempo = compteur / 86400
        Set plage = ActiveSheet.Cells(1, 245)
        plage.FormulaLocal = "=""01/01/1980""+" & tempo & ""
        tempo_date = ActiveSheet.Cells(1, 245).Value
     
        transform_timer_date = tempo_date
    End Function
    Je vais tester le fait de la passer en 'public'.

    => je viens de la passer en 'public', et pas mieux...

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    j'isole en fonction de ce que tu nous dis (abstraction donc faite de tout le reste et notamment de l'origine des valeurs... ou de leur type réel ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Command1_Click()
      Dim temp As Date, date_6h_mat_moins As Date, date_6h_mat_plus As Date, date_6h_mat As Date
      temp = "6/20/2008 5:59:00 AM"
      date_6h_mat = "20/06/2008 06:00:00"
      date_6h_mat_plus = "20/06/2008 06:01:00"
      date_6h_mat_moins = "6/20/2008 5:59:00 AM"
      If (temp <> date_6h_mat) Then
        If (temp <> date_6h_mat_plus) Then
          If (temp <> date_6h_mat_moins) Then
             MsgBox "ALERTE !!! YA UN MEGA PROBLEME !!!!!", 16, "ERREUR !!!"
          End If
        End If
      End If
    End Sub
    et aucun message ne s'affiche ...

  5. #5
    Membre éclairé Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Par défaut
    Dis-moi UCFOUTU, je veux être sûr de bien comprendre :
    le fait de passer la variable 'temp' en "6/20/2008 5:59:00 AM" au lieu de "20/06/2008 05:59:00" et le test fonctionne ??

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Dis-voir, toi :

    je ne joue pas au poker javanais (relis ce que tu as écrit dans ta question originelle).. et-reviens ensuite, s'il te plait (mais cette fois-ci en te montrant précis, tant en ce qui concerne les types que les formats)...

    A bientôt, donc...

  7. #7
    Membre éclairé Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Dis-voir, toi :

    je ne joue pas au poker javanais (relis ce que tu as écrit dans ta question originelle).. et-reviens ensuite, s'il te plait (mais cette fois-ci en te montrant précis, tant en ce qui concerne les types que les formats)...

    A bientôt, donc...
    OKOK ce n'est pas clair, je récapitule donc !

    Les variables de type 'public' à toute la macro sont : 'date_6h_mat', 'date_6h_mat_plus' et 'date_6h_mat_moins'
    => Ce sont des formats Date.

    La variable de type 'locale', d'une sous-routine, est 'temp' et c'est un format Date également.

    Quand je trace le prog ligne à ligne, je vois bien que :
    Après un calcul par la fonction "transform_timer_date", qui se situe juste une ligne avant les tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temp = transform_timer_date(ActiveSheet.Cells(cell_ligne_derniere_base, 1).Value)
    la variable 'temp' contient bien le résultat : "20/06/2008 05:59:00"

    Sachant que suite à d'autres calculs fait précédemment :
    'date_6h_mat' contient "20/06/2008 06:00:00"
    'date_6h_mat_plus' contient "20/06/2008 06:01:00"
    'date_6h_mat_moins' contient "20/06/2008 05:59:00"

    Pour VB, il considère mes 3 tests vrai puisque le message s'affiche ! Alors que le dernier test devrait être faux, vu que visiblement 'temp' et 'date_6h_mat_moins' sont identiques...

    Je cherche toujours...

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par shkyo Voir le message
    Je cherche toujours...
    Et moi, j'attends toujours ma réponse en ce qui concerne les types (je n'ai pour l'instant que les formats d'affichage !)

  9. #9
    Membre éclairé Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Et moi, j'attends toujours ma réponse en ce qui concerne les types (je n'ai pour l'instant que les formats d'affichage !)
    Mais qu'entends-tu par "type" ?? Pour moi (mais je ne sais pas tout !), il n'y a que 2 types possibles d'une variable : 'locale' ou 'public'

    Le reste étant les formats, par exemple 'Long', 'String', 'Date', etc...

    J'ai bon ? Ou j'ai zappé quelquechose ???

    J'ajoute une précision, ces tests sont dans une sous-routine qui est appelée une bonne cinquantaine de fois sans problème !

    La seule différence avec le cas qui ne marche pas, est que la variable 'temp' contient "20/06/2008 06:00:00".
    Et au 1er test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (temp <> date_6h_mat) Then
    le résultat est faux car 'date_6h_mat' contient toujours "20/06/2008 06:00:00", donc le message ne s'affiche pas, ce qui est normal !!!

    Vous avez dit bizarre ?...

  10. #10
    Membre éclairé Avatar de shkyo
    Homme Profil pro
    Développeur Robotique - Administrateur systèmes
    Inscrit en
    Juin 2003
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Robotique - Administrateur systèmes

    Informations forums :
    Inscription : Juin 2003
    Messages : 841
    Par défaut
    J'ai enfin trouvé une solution à mon problème !!

    Je pense que la cause du problème vient du calcul sur les dates et heures. Car Excel me les affichent (à l'écran et dans les variables) sous la forme : "23/06/2008 05:59:00" mais en fait il calcule jusqu'au millième de seconde, même s'il ne l'affiche pas...

    Il est fort probable que ce soit pour ça que mon test n'était pas bon, car mes 2 valeurs n'étaient pas vraiment égales, il entrait donc dans le test !

    Pour contourner cela, j'ai séparé date et heure, et je transforme "à la main" l'heure en nombre de seconde avant de faire les tests, que je stocke dans des nouvelles variables 'public' ! Et là, ça fonctionne !

    Voici le nouveau code :
    La nouvelle fonction...
    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
    Function transform_timer_date(compteur As Long) As Date
    ' transforme un compteur exprimé en nbre de seconde en vraie date
    ' ATTENTION : le calcul se fait à partir de la date 01/01/1980 qui est le référentiel de la supervision
    ' une cellule (lointaine) de la feuille ouverte est utilisée pour le calcul
    ' codée le 08/01/2008 pour gérer les décalages de temps
     
        Dim tempo As Double, tempo_date As Date, heure As Long, min As Long, sec As Long
     
        tempo = Round((compteur / 86400), 4)
     
        Set plage = ActiveSheet.Cells(1, 245)
        plage.FormulaLocal = "=""01/01/1980""+" & tempo & ""
        tempo_date = ActiveSheet.Cells(1, 245).Value
        'calcul de l'heure en seconde pour les tests
        heure = Hour(tempo_date)
        min = Minute(tempo_date)
        sec = Second(tempo_date)
        heure_6h_comp = (((heure * 60) + min) * 60) + sec
     
        transform_timer_date = tempo_date
    End Function
    et les nouveaux tests...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        temp = transform_timer_date(ActiveSheet.Cells(cell_ligne_derniere_base, 1).Value)
        If (temp <> date_6h_mat) Then
            If (heure_6h_comp <> heure_6h_plus) Then
                If (heure_6h_comp <> heure_6h_moins) Then
                    MsgBox "ALERTE !!! YA UN MEGA PROBLEME !!!!!", 16, "ERREUR !!!"
                End If
            End If
        End If
    Voilà, tout ceci pour info, si ça peut servir à quelqu'un !

    Merci tout de même de votre aide en tout cas !

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

Discussions similaires

  1. Script test de deux chaine avec if
    Par kacedda dans le forum Linux
    Réponses: 6
    Dernier message: 02/05/2003, 15h38
  2. [XMLRAD] test de nullité
    Par Pm dans le forum XMLRAD
    Réponses: 5
    Dernier message: 29/11/2002, 10h57
  3. test collisions
    Par tatakinawa dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/06/2002, 06h03

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