Code VBA Conseils débutants

Bonjour,

Je débute sur VBA et j'ai besoin de quelques conseils pour un code.

Je cherche à simuler le temps que met un véhicule pour parcourir un 0-100m, départ arrêté.

Pour se faire, j'utilise une boucle for dans laquelle j'intègre un if pour sortir de la boucle si le 100m est atteint. Et c'est la que ca coince. Je ne pense pas adopter une structure correcte. Voici mon code :

Function tempsaccel(PMOT)

'Calcul de accel
    t = 0
    d = 0
    a = 0
    V = 0
    AA = PMOT(1)
    AB = PMOT(2)

    For i = 1 To 1000
    t = t + 0.1
    'Calcul de RPM et Puissance moteur
                If i = 1 Then RPM = 4000
                End

                If RMP > 6500 Then RPM = (V * 1000 / 3600) / (0.87) * 1 Else RPM = (V * 1000 / 3600) / (0.87) * 0.5
                End

    Puissance = AA * RPM * RPM + AB * RPM * RPM + 3

    'Calcul de Fmot
        If i = 1 Then Fmot = 200 Else Fmot = Puissance / V
        End

    'Calcul de Accel, vitesse, position
    a = Fmot / 250

    V = a * 0.1 + V

    d = V * 0.1 + d

    If d > 100 Then DAT = t
    Exit For

   Next

    tempsaccel = DAT

End Function

Mon but est de renvoyer la valeur "tempsaccel" qui correspond au temps mis par le véhicule pour parcourir les 100m.

Quelqu'un pourrait-il m'aider?

Par ailleurs, d'autres erreurs traient peut être dans mon code...

Je vous remercie

Bonjour,

Je n'ai aucune idée de la pertinence de tes calculs d'autant qu'on ne sait pas ce que contient PMOT.

par suite PMOT(1) et PMOT(2) me laissent un peu perplexe.

Ce qui est certain c'est que les 3 End que tu as semé en cours de route non rien à faire ici.

(End interrompt le déroulement de la macro...)

A+

Tout d'abord, Merci pour ta réponse!

La courbe de puissance moteur en fonction du régime s'exprimera ici en fonction du régime moteur RPM sous la forme ax²+bx, PMOT contient donc les valeurs a et b permettant de passer d'un régime moteur a une puissance.

Ainsi, PMOT(1) et PMOT(2) sont 2 valeurs que l'on va chercher dans une colonne de deux cases.

En fait, mon problème se situe surtout dans la manière de quitter la boucle for et enregistrer le temps que j'ai mis pour parcourir les 100m, c'est a dire quand la condition if d>100 devient vrai.

Bonjour,

ce que vba attend plus au niveau syntaxe :

Function tempsaccel(PMOT)
'Calcul de accel
    t = 0
    d = 0
    a = 0
    V = 0
    AA = PMOT(1)
    AB = PMOT(2)
    RPM = 4000
    For i = 1 To 1000
        t = t + 0.1
        'Calcul de RPM et Puissance moteur
        RPM = (V * 1000 / 3600) / (0.87)
        If RMP <= 6500 Then RPM = RPM / 2
        Puissance = AA * RPM * RPM + AB * RPM * RPM + 3
        'Calcul de Fmot
        If i = 1 Then Fmot = 200 Else Fmot = Puissance / V
        'Calcul de Accel, vitesse, position
        a = Fmot / 250
        V = a * 0.1 + V
        d = V * 0.1 + d
        If d > 100 Then
            tempsaccel = t
            Exit For
        End If
    Next
End Function

Il faudrait que tu prennes l'habitude de typer tes variables : VBA et les variables (mDF) : http://www.mdf-xlpages.com/modules/smartsection/item.php?itemid=51

eric

Bonjour à tous, mon code a évolué mais les résultats que j'obtiens ne me satisfont pas encore. Le voici :

Function tempsaccel(PMOT, RATIO, MASSE)

'Calcul de accel
    t = 0
    d = 0
    a = 0
    V = 0
    AA = PMOT(1)
    AB = PMOT(2)
    AC = PMOT(3)
    AD = PMOT(4)
    AE = PMOT(5)
    AF = PMOT(6)
    AG = PMOT(7)
    i = 1
    R = RATIO(1)
    MASSEV = MASSE(1)
    RAPPORT = 1

    For i = 1 To 100000000
    t = t + 0.0001

'Calcul de RPM et Puissance moteur
                If i = 1 Then
                RPM = (4000 * 2 * 3.14 / 60)
                Else
                RPM = (V) / (0.23) * R
                End If

                If RMP > (9500 * 2 * 3.14 / 60) Then
                RAPPORT = RAPPORT + 1
                    If RAPPORT = 1 Then
                    R = RATIO(1)
                    End If
                    If RAPPORT = 2 Then
                    R = RATIO(2)
                    End If
                    If RAPPORT = 3 Then
                    R = RATIO(3)
                    End If
                    If RAPPORT = 4 Then
                    R = RATIO(4)
                    End If
                    RPM = (V) / (0.23) * R
                End If

                Puissance = AA * RPM * RPM * RPM * RPM * RPM * RPM + AB * RPM * RPM * RPM * RPM * RPM + AC * RPM * RPM * RPM * RPM + AD * RPM * RPM * RPM + AE * RPM * RPM + AF * RPM + AG

'Calcul de Fmot
                If i = 1 Then
                Fmot = 2000
                Else
                Fmot = Puissance / V
                End If

'Calcul de Accel, vitesse, position
         a = Fmot / MASSEV

         V = a * 0.0001 + V

         d = V * 0.0001 + d

          If d > 1000 Then

             tempsaccel = t

          Exit For
          End If

   Next

End Function

Quelques explications : en entrée, on a : PMOT(qui comprend les variables permettant d exprimer la puissance du moteur en fonction du régime), RATIO (rapports de boite de vitesse), MASSE (la masse du véhicule).

Avec ma boucle for, je fais des itérations par pas de 0.0001 seconde. A chaque itération, je calcule :

  • le régime moteur RPM, qui a une valeur par défaut si i=1. Si i différent de 1, je le calcule en fonction de la vitesse à i-1 de la voiture et des rapports de boites.
  • Si le régime moteur est suffisament élevé, je dois passer à la vitesse supérieure. Ainsi, J'ai mis en place plusieurs conditions if permettant de voir quel rapport passer si le régimé maxi est dépassé.
  • De la, je calcule la puissance en fonction du régime retenu pour l'itération en question, Fmot et j'en déduis mon accel, ma vitesse et mon déplacement. La condition if à la fin teste si le déplacment est supérieur a 100 mètre : dans ce cas la boucle s'arrete et la valeur de temps correspondante est renvoyée.

Cependant, plusieurs soucis persistent :

  • quand j'execute mon calcul ma valeur par défaut de RPM (si i=1) n'a pas d'influence sur le résultat final (j'ai essayé de changer cette valeur, aucune incidence sur le résultat)
  • Les rapports ne montent pas, je reste bloqué en première vitesse.

Quelqu'un pourrait m'éclairer sur la source du problème? J'espere avoir été assez clair... Je débute et il n'est pas simple de s'y retrouver parfois.

Je vous remercie et vous souhaite une bonne soirée

Bonsoir.

ça serait bien que tu nous donnes quelques jeux d'arguments (PMOT, RATIO, MASSE) valides pour tester ta fonction en mode débogage.

merci.

A+

Bonsoir Galopin01,

Voici les valeurs que je souhaite utiliser pour le moment ! :

MASSE : 280

RATIO et PMOT sont rentrés dans deux colonnes distinctes sur une feuille.

PMOT :

-1,00E-12 (correspond a PMOT(1))

7,00E-09

-1,00E-05

1,32E-02

-7,08E+00

1,98E+03

-2,07E+05 (correspond à PMOT(7))

RATIO :

14.8 (correspond a mon RATIO(1))

10.1

8.0

6.9

La fonction se compile bien, le résultat est, comme je le disais, moins satisfaisant

Tu peux remplacer :

                If RMP > (9500 * 2 * 3.14 / 60) Then
                RAPPORT = RAPPORT + 1
                    If RAPPORT = 1 Then
                    R = RATIO(1)
                    End If
                    If RAPPORT = 2 Then
                    R = RATIO(2)
                    End If
                    If RAPPORT = 3 Then
                    R = RATIO(3)
                    End If
                    If RAPPORT = 4 Then
                    R = RATIO(4)
                    End If
                    RPM = (V) / (0.23) * R
                End If

par :

        If RMP > (9500 * 2 * 3.14 / 60) Then
            Stop
            RAPPORT = RAPPORT + 1
            R = RATIO(RAPPORT)
            RPM = (V) / (0.23) * R
        End If

Pareil en plus court + Stop : le programme s'arrêtera si la condition est respectée.

Continue en pas à pas avec F8 en contrôlant la valeur de tes variables au fur et à mesure (en approchant le curseur souris sur la variable, ou en sélectionnant la variable ou une expression et la faire glisser dans la fenêtre Espion)

eric

Bonsoir eric,

Dans ce cas je ne comprend pas trop l'interet de mettre un "stop", puisqu'ici on ne veut pas arreter le programme mais bien ajouter un rapport pour calculer le nouveau RPM?

Dans ce cas je ne comprend pas trop l'interet de mettre un "stop", puisqu'ici on ne veut pas arreter le programme mais bien ajouter un rapport pour calculer le nouveau RPM?

Ca s'appelle du déboguage, que tu apprennes à trouver où est le pb.

Bien sûr que tu l'enlèves après.

eric

bonjour,

Dans le classeur joint un tableau affiche toutes les valeurs de toutes tes variables pour chaque valeur de i

Nota : i part toujours de 1 puisque tu as une boucle :

For i = 1 to 1000000

Donc tu n'as qu'une seule valeur pour RPM (quand i = 1 alors RPM = 2000)

le reste du temps RPM = 0

par suite ce qui détermine t c'est TOUJOURS l'incrémentation progressive de d soit

i = 290305

et t est toujours 29.0305

A+

16jozmich.xlsm (24.90 Ko)

Bonjour,

Ce fichier de débogage est 3 à 5 x plus rapide que le précédent.

Attention toutefois à ne pas dépasser 1 000 000 pour les valeurs de i mais pour le débogage ça devrait suffire largement.

A+

17jozmich.xlsm (27.95 Ko)

Bonjour,

Je n'ai pas eu le temps de me pencher sur le problème hier. Un grand merci pour votre aide!

De toute évidence ce débogage met en avant un problème dans mon code... l'acceleration "a" a l'itération 2 est absurde et la distance est toujours précédée du signe -.

Je vais essayer de comprendre ce disfonctionnement dans la journée.

Rechercher des sujets similaires à "code vba conseils debutants"