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 Discussion :

Problème d'arrondis lors de calculs


Sujet :

VBA

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut Problème d'arrondis lors de calculs
    Bonjour à tous,

    Mon objectif et d'interpoler l'heure de passage d'un véhicule en différents points. Le véhicules se déplace à vitesse constante. J'ai deux listbox : une avec l'heure de passage du véhicule et une autre avec la distance entre chaque point deux à deux. Les distances ne sont pas cumulées et j'ai une ligne de moins dans ma liste distance comme l'illustre l'exemple suivant :

    lignes temps / lignes distance
    0.------10.0 /
    1.------0.0 / 0.------25.07 <-- tdep
    2.------0.0 / 1.------3.74 (distance entre ligne 1 et 2 de la liste du tps)
    3.------0.0 / 2.------3.74
    4.------100.0 / 3.------22.20 <-- tfin
    5.------120.0 / 4.------4.90 (distance entre ligne 4 et 5)
    6.------150.0 / 5.------6.71 <-- tdep
    7.------0.0 / 6.------7.14
    8.------0.0 / 7.------10.34
    9.------0.0 / 8.------10.44
    10.------250.0 / 9.------7.55 <-- tfin
    11.-----260.0 / 10.------5.39

    Le nombre de séries de 0 est variable. Chaque série de 0 est caractérisée par tdep et tfin (heure de début et heure de fin de la série de 0)

    (les valeurs sont ici mises juste pour l'exemple)

    le résultat que je cherche à obtenir est la colonne temps suivante :
    10,00 première série de 0 : v = (25,07+3,74+3,74+22,20)/(100-10)=0.61
    51,21 t = 10 + 25.07/v
    57,36
    63,51
    100,00
    120,00
    150,00 deuxième série de 0 : v=0.35
    170,13
    199,29
    228,72
    250,00
    260,00


    J'ai un code qui marche presque. Mes résultats sont faux, je pense à cause d'arrondis en cours de route. En effet j'obtiens la colonne temps suivante :
    10
    52,588
    58,942
    65,296
    100
    120
    150
    171,004
    201,428
    232,135
    250
    260

    Mon 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
    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
    Dim i As Integer, j As Integer
        Dim debutbloc As Integer
        Dim flagdep As Boolean
        Dim flagfin As Boolean
        Dim distance As Single
        Dim vitesse() As Single
        Dim td() As Integer
        Dim tf() As Integer
        Dim temps As Single
        Dim temps1 As Single
        Dim temps2 As Single
        Dim valeur As String
        Dim indice As Integer ' pour le tableau des vitesses
        Dim tdep, tfin As Single
     
    Liste.AddItem "10"
    Liste.AddItem "0"
    Liste.AddItem "0"
    Liste.AddItem "0"
    Liste.AddItem "100"
    Liste.AddItem "120"
    Liste.AddItem "150"
    Liste.AddItem "0"
    Liste.AddItem "0"
    Liste.AddItem "0"
    Liste.AddItem "250"
    Liste.AddItem "260"
    listdistance.AddItem "25,07"
    listdistance.AddItem "3,74"
    listdistance.AddItem "3,74"
    listdistance.AddItem "22,20"
    listdistance.AddItem "4,90"
    listdistance.AddItem "6,71"
    listdistance.AddItem "7,14"
    listdistance.AddItem "10,34"
    listdistance.AddItem "10,44"
    listdistance.AddItem "7,55"
    listdistance.AddItem "5,39"
     
     
        debutbloc = 0
        ReDim vitesse(0)
        ReDim td(0)
        ReDim tf(0)
        indice = 0
        Do
            flagdep = False
            distance = 0
            For i = debutbloc To Liste.ListCount - 1
                ' on cherche tdep
                DoEvents
                If Val(Liste.List(i)) = 0 And i > 0 Then
                    tdep = Liste.List(i - 1)
                    distance = distance + Val(listdistance.List(i - 1)) ' on ajoute la première distance
                    flagdep = True
                    td(indice) = i - 1
                    Exit For
                End If
            Next i
            ' on cherche tfin
            If flagdep = True Then    ' si tdep trouvé on cherché tfin
                flagfin = False
                For j = i + 1 To Liste.ListCount - 1
                    distance = distance + Val(listdistance.List(j - 1)) ' on rajoute les suivantes
                    DoEvents
                    If Val(Liste.List(j)) <> 0 Then
                        tfin = Liste.List(j)
                        flagfin = True
                        tf(indice) = j
                        Exit For
                    End If
                Next j
            End If
            If flagdep = False Then Exit Do
            ' on calcule la vitesse
            temps = CSng(Liste.List(tf(indice))) - CSng(Liste.List(td(indice)))
            vitesse(indice) = distance / temps
            'listvitesse.AddItem str$(vitesse(indice))
            indice = indice + 1
            ReDim Preserve vitesse(0 To indice)
            ReDim Preserve td(0 To indice)
            ReDim Preserve tf(0 To indice)
            debutbloc = j + 1
            If debutbloc > Liste.ListCount - 1 Then Exit Do
        Loop
        ReDim Preserve vitesse(0 To indice - 1)
        ReDim Preserve td(0 To indice - 1)
        ReDim Preserve tf(0 To indice - 1)
        For i = 0 To UBound(vitesse)
            For j = td(i) + 1 To tf(i) - 1
                temps1 = CSng(Liste.List(j - 1))
                temps2 = CSng(listdistance.List(j - 1)) / vitesse(i)
                temps = temps1 + temps2
                Liste.List(j) = Replace(temps, ".", ",")
            Next j
        Next i
    Ainsi avec une listebox "liste", et une "listdistance" j'espère que vous allez pouvoir exécutez ce code et m'aider à résoudre mon problème!

    Merci beaucoup d'avance.

  2. #2
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    En remplaçant Val par CSng cela règle le problème apparemment.
    Merci quand même

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/02/2014, 09h27
  2. [AC-2003] Problème de compilation lors de calculs conditionnels
    Par dds325is dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/01/2013, 10h41
  3. Réponses: 5
    Dernier message: 15/06/2012, 15h00
  4. Problème d'arrondi sur un champ (âge) calculé
    Par fanico11 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/05/2008, 15h25
  5. Problème de décimales lors d'un arrondi
    Par jgfa9 dans le forum Langage
    Réponses: 3
    Dernier message: 27/04/2008, 20h25

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