Code VBA Conseils débutants

Y compris Power BI, Power Query et toute autre question en lien avec Excel
j
jozmich
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 25 janvier 2015
Version d'Excel : 2010 FR

Message par jozmich » 25 janvier 2015, 20:39

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 :)
Avatar du membre
galopin01
Passionné d'Excel
Passionné d'Excel
Messages : 6'348
Appréciations reçues : 159
Inscrit le : 18 septembre 2008
Version d'Excel : 2016
Téléchargements : Mes applications

Message par galopin01 » 25 janvier 2015, 20:56

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+
j
jozmich
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 25 janvier 2015
Version d'Excel : 2010 FR

Message par jozmich » 25 janvier 2015, 21:29

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.
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'307
Appréciations reçues : 373
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 25 janvier 2015, 21:56

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/smar ... ?itemid=51
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
j
jozmich
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 25 janvier 2015
Version d'Excel : 2010 FR

Message par jozmich » 26 janvier 2015, 17:48

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 ;)
Avatar du membre
galopin01
Passionné d'Excel
Passionné d'Excel
Messages : 6'348
Appréciations reçues : 159
Inscrit le : 18 septembre 2008
Version d'Excel : 2016
Téléchargements : Mes applications

Message par galopin01 » 26 janvier 2015, 18:47

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+
j
jozmich
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 25 janvier 2015
Version d'Excel : 2010 FR

Message par jozmich » 26 janvier 2015, 19:25

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
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'307
Appréciations reçues : 373
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 26 janvier 2015, 21:15

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
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
j
jozmich
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 25 janvier 2015
Version d'Excel : 2010 FR

Message par jozmich » 26 janvier 2015, 21:51

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?
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'307
Appréciations reçues : 373
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 26 janvier 2015, 23:51

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
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message