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

VBA Access Discussion :

Comparaison nombres négatifs [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Comparaison nombres négatifs
    Bonjour,

    Une variable double peut être:
    >=10
    >=0 and <10
    =0
    > -10 and <0
    <= -10

    Je mets donc une valeur double (dix chiffres après la virgule) récupérée dans une table dans une variable double. L'idée initiale étant ensuite de faire un do case sur la variable double.

    Dans mon exemple, ma variable double contient -38,1234567890. J'espérais donc que grâce au test sur cette variable <= -10, j'allais pouvoir effectuer le traitement. Et bien non, cela ne passe pas.

    Pensant que cela était peut-être dû à la virgule (donc "," dans la variable, et "." sous-entendu dans le programme), j'ai donc récupéré la valeur entière. Fonction "int" si valeur >=0, "Fix" si non. J'obtiens alors, toujours dans mon exemple, -38. Je teste donc ce -38 dans mon do case avec les mêmes conditions que ci-dessus. L'affichage du contenu de la variable en mode pas à pas me donne pourtant bien -38. Cela ne passe pas non plus.

    Plutôt bloqué!

    Quelqu'un aurait-il une idée? Merci d'avance!!!

    Cordialement,

    JYV

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 004
    Points : 24 595
    Points
    24 595
    Par défaut
    Bonjour,

    Très étrange.

    Peut-on voir le code ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par loufab Voir le message
    Bonjour,

    Très étrange.

    Peut-on voir le code ?

    Cordialement,
    Le voilà ci-dessous.

    Cordialement,

    JYV

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    Private Sub Commande0_Click()
     
     
    Dim strLat As String 'latitude
    Dim strLon As String 'longitude
    Dim strInd As String 'indicatif
    Dim strCle As String 'cle
     
    Dim dblLat As Double 'latitude
    Dim dblLon As Double 'longitude
     
    Dim lngNbRecord As Long 'nb d'enregistrements
    Dim lngNbTemp As Long 'nb variable temporaire boucle
     
    Dim db As Database
     
    Dim rstNavDat As Recordset ' table d'origine
    Dim rstFix As Recordset ' table de destination
     
    Set db = CurrentDb()
    Set rstFix = db.OpenRecordset("Fix", dbOpenTable)
    Set rstNavDat = db.OpenRecordset("Nav", dbOpenTable)
     
    DoCmd.SetWarnings (WarningsOff)
    With rstFix
        db.Execute ("DELETE DISTINCTROW fix.* FROM fix;")
    End With
    DoCmd.SetWarnings (WarningsOn)
     
    With rstNavDat 
        .MoveFirst
        .MoveLast
        lngNbRecord = .RecordCount
        .MoveFirst
            Do
                lngNbTemp = lngNbTemp + 1
                ' MsgBox ("Fait : " + Str(lngNbTemp) + " sur " + Str(lngNbRecord))
                strCle = ![clef]
                dblLat = ![latitude]
                dblLon = ![longitude]
                strInd = ![indicatif]
                If ![typelieu] = "F" Then ' Fix
                    rstFix.AddNew
                    rstFix![clef] = strCle
                    rstFix![indicatif] = strInd
                    rstFix![latitude] = ModifLatitude(dblLat)
                    'rstFix![longitude] = ModifLongitude(lngLon)
                    rstFix.Update
                End If
            .MoveNext
            Loop While Not .EOF
    End With
     
    End Sub
     
    Function ModifLatitude(dblLati As Double) As String ' traitement des latitudes
     
    Dim intTemp As Integer
     
    intTemp = intValEntiere(dblLati)
    Select Case intTemp
        Case intTemp >= 10 'valeur entière à deux chiffres
            ModifLatitude = " " + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati))
        Case (intTemp > 0 And intTemp < 10) ' la valeur entière sera sur un chiffre, il en faut deux
            ModifLatitude = " 0" + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati)) '
        Case (intTemp = 0) ' quid?
            MsgBox ("c'est arrivé, latitude à zéro")
        Case (intTemp > -10 And intTemp < 0) ' il faut un signe moins
            ModifLatitude = "-0" + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati)) '
         Case (intTemp <= -10)
            ModifLatitude = "-" + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati))
    End Select
     
    End Function
    Function ModifLongitude(dblLong As Double) As String ' traitement des longitudes
     
    Select Case lngLong
        Case dblLong >= 10
            ModifLongitude = "0" + Str(intValEntiere(dblLong))
    End Select
     
    End Function
     
    Function intValEntiere(dblValeur) As Integer  ' renvoie la valeur entière d'un nombre
        If dblValeur >= 0 Then
            intValEntiere = Int(dblValeur)
        Else
            intValEntiere = Fix(dblValeur)
        End If
     
    End Function
     
    Function StrValDecimale(dblValeur As Double, intValEntiere As Integer) As String  ' renvoie la valeur décimale d'un nombre sous forme de caractère
     
        StrValDecimale = RTrim(Str(dblValeur - CLng(intValEntiere)))
        LongueurValDecimale = Len(StrValDecimale)
     
        Select Case LongueurValDecimale
            Case 6 ' pas d'ajout de zéro au bout
                ' StrValDecimale = StrValDecimale
            Case 5
                StrValDecimale = StrValDecimale + "0"
            Case 4
                StrValDecimale = StrValDecimale + "00"
            Case 3
                StrValDecimale = StrValDecimale + "000"
            Case 2
                StrValDecimale = StrValDecimale + "0000"
            Case 1
                StrValDecimale = StrValDecimale + "00000"
            Case 0
                StrValDecimale = StrValDecimale + "000000"
        End Select
     
    End Function

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    bonsoir,
    personnellement j'aurai écrit cette fonction 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
    Function ModifLatitude(dblLati As Double) As String ' traitement des latitudes
     
    Dim intTemp As Integer
     
    intTemp = intValEntiere(dblLati)
    Select Case intTemp
        Case Is >= 10 'valeur entière à deux chiffres
            ModifLatitude = " " + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati))
        Case 1 To 9   ' la valeur entière sera sur un chiffre, il en faut deux
            ModifLatitude = " 0" + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati)) '
        Case Is = 0 ' quid?
            MsgBox ("c'est arrivé, latitude à zéro")
        Case -9 To -1    ' il faut un signe moins
            ModifLatitude = "-0" + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati)) '
        Case Is <= -10
            ModifLatitude = "-" + Str(intValEntiere(dblLati)) + "." + StrValDecimale(dblLati, intValEntiere(dblLati))
    End Select
    End Function
    et celle-ci comme cela (elle était fausse à l'origine car elle ne testait pas la bonne variable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function ModifLongitude(dblLong As Double) As String ' traitement des longitudes
     
    Select Case dblLong
    Case Is >= 10
    	ModifLongitude = "0" + Str(intValEntiere(dblLong))
    End Select
     
    End Function
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Super, ta proposition fonctionne! Merci.
    Concernant la seconde fonction, elle n'est là que pour mémoire car il va falloir aussi que je traite les longitudes. Je vais dire que c'est un excès de copier-coller. Mais comme elle se trouve au milieu du code...
    Merci beaucoup.

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    Bonjour,
    OK super, n'oublie pas le Résolu ...

    Garde en mémoire que le Case ne traite que les cas de la variable définie dans Select.
    Ce cas de comparaison est possible mais piégeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select Case Var1
     Case Var2 = Var3 ...
    car la fonction compare l'égalité entre Var2 et Var3 et renverra toujours un booléen qu'il comparera à la valeur de Var1, donc à utiliser si Var1 est un booléen.
    L'utilisation usuelle est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select Case Var1
     Case 1
     ...
     Case 2, 4
     ...
     Case 5 To 9
     ...
     Case Is >= 10 
     ...
     Case Is <= Var2
     ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. Comparaison nombres négatifs
    Par Vandervell dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/04/2015, 16h23
  2. Problème de tri de nombre négatif dans un état
    Par loutsky dans le forum Access
    Réponses: 11
    Dernier message: 21/04/2006, 14h30
  3. comparaison nombre
    Par nicocodi dans le forum C
    Réponses: 6
    Dernier message: 26/08/2005, 12h14
  4. [D7 Ent. / XP] Trunc() sur un nombre négatif
    Par Magnus dans le forum Langage
    Réponses: 14
    Dernier message: 17/06/2005, 16h45
  5. [68000] EXT nombre négatif
    Par fastzombi dans le forum Autres architectures
    Réponses: 2
    Dernier message: 02/05/2004, 12h17

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