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+
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+
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.