Hum, tu dis afficher par rapport à i. Je ne vois pas comment faire ? Pour les formules pas de soucis ça roule
Hum, tu dis afficher par rapport à i. Je ne vois pas comment faire ? Pour les formules pas de soucis ça roule
Tu sais calculer la position Xt et Yt de l'objet volant à l'instant i connaissant les données initiales Xi, Yi, Xf, Yf, V et ti?
Il suffit de remplacer dans les équations donnant Xt et Yt t par i
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
pour la formule j'essaye ceci (vitesse réelle pour le moment)
Quand je soumets la formule adaptée en cellule excel me donne quelque chose de cohérent je pense
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Xt = Sheets("Tableau").Range("B11") + 83.3 * (i - Ti) * k Yt = Sheets("Tableau").Range("C11") + 83.3 * (i - Ti) * k
Bon je vais te proposer une piste pas du tout optimisée mais un premier pas pour appréhender la logique
Données:
Dans la feuille Feuil1:
Colonne 2: Avion 1: Shape en Feuil2 appelée plane1
En B2: sa position de départ Xi
En B3: sa position de départ Yi
En B4: sa position d'arrivée Xf
En B5: sa position d'arrivée Yf
En B6: sa vitesse moyenne V
En B7: son instant de décollage ti
Colonne 3: Avion 2: Shape en Feuil2 appelée Plane2
idem ....
Code générique pour positionner un objet Plane à l'instant t en prenant les données en colonne Col
Pour lancer le code sur 3 avions les 1001 premiers pas
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 'Plane: l'objet à déplacer 'Col: colonne des données 't: l'instant de photographie de la position de l'objet Plane Private Function PositionPlane(ByVal Plane As Shape, ByVal Col As Integer, ByVal t As Long) As Boolean Dim Xi As Double, Yi As Double, Xf As Double, Yf As Double, Xt As Double, Yt As Double, V As Double, D As Double Dim ti As Long Dim c As Range With Feuil1 Set c = .Cells(1, Col) 'Nom avion e ligne 1 ti = c.Offset(6) 'Ti en ligne 7 If t >= ti Then Xi = c.Offset(1) 'Xi en ligne 2 Yi = c.Offset(2) 'Yi en ligne 3 Xf = c.Offset(3) 'Xf en ligne 4 Yf = c.Offset(4) 'Yf en ligne 5 V = c.Offset(5) 'Vitesse en ligne 6 D = Sqr((Yf - Yi) ^ 2 + (Xf - Xi) ^ 2) 'Distance totale sur le plan Xt = Xi + V * (t - ti) * (Xf - Xi) / D 'Xt à l'instant t Yt = Yi + V * (t - ti) * (Yf - Yi) / D 'Yt à l'instant t If t <= ti + D / V Then 'Tant qu'on est pas encore arrivé à destination on fait bouger l'avion Plane.Left = Xt Plane.Top = Yt Else PositionPlane = True End If End If End With End Function
Bien sûr ces codes sont là uniquement à titre indicatif pour te montrer la possibilité de boucler sur une fonction paramétrée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Sub Lancement() Dim TheEnd As Integer, j As Integer, m As Integer Dim i As Long m = 3 For i = 0 To 1000 For j = 1 To m TheEnd = PositionPlane(Feuil2.Shapes("plane" & j), j + 1, i) DoEvents Next j Next i End Sub
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
merci beaucoup pour ces précieuses indications. C'est comme cela que tu as procédé pour ton premier exemple ?
Autrement mais avec la même logique.
1. Calculer la position Xt et Yt à l'instant t
2. Afficher l'objet à cet instant
3. Recommencer pour t+1
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
Avec ce genre de boucle es tu limité en nombre d'avion?
A ton avis?
j'ai mis exprès le nombre total d'avions (précisément de vols) dans une variable m
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
je préfère passer pour un âne à demander mais être sur a 100%
Bon bah super merci beaucoup pour ce code, aurais tu une piste pour que je cherche à l'améliorer ? mine de rien cela me fait bien chercher de moi même et me permet d'apprendre
voire me guider sur ton exemple premier qui est vraiment sympa
Bon après avoir tourné en rond je crois que soit j'ai fait de la merde soit je suis idiot. J'ai décortiqué ton code et la ligneà l'air de merder. Je rentre mes valeurs en colonne 2 car col = 2, puis après avoir reçu une erreur, col = 3 et du coup mes valeurs = 0 et la division est impossible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part set c = .Cells(1, Col)
EDIT : je pense que cela me sors une erreur vu que la col 3 n'est pas remplie. Ce qui me pose donc la question de "et si il n'y a que 2 avions qui doivent bouger dois je modifier le code ou bien on peut faire une sortie erreur pour continuer la boucle ?"
c'était bien la 2ieme condition qui est remplie je suis idiot. Après remplissage des 3 colonnes cela fonctionne au poil
tu peux me confirmer que la variable ti s'exprime bien en secondes ? j'ai l'impression que c'est plus le nombre d'itération, soit i
Bonjour
Oui pour cet exemple illustratif ti est le nombre d'itérations et non le temps en s.
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
D'accord. J'ai essayé de temporiser la boucle à 1s mais sans succès, avec un application wait, aurais tu une astuce ?
vire la boucle et utilise Application.ontime
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
comme ceci ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub testtime() Dim temps ThisWorkbook.Sheets("tab").[A1] = Now temps = Now + TimeValue("00:00:01") Application.OnTime temps, "lancement", , True End Sub
Tu es perdu et j'en suis la cause.
Je t'avais proposé un code et avais mentionné que c'était pédagogique et loin de répondre à ton problème.
C'était pour pouvoir te montrer qu'on peut à l'aide d'une boucle faire bouger un ensemble d'objets sans pour autant demander autant de lignes de codes que d'objets à traiter.
L'exemple donné ne répondrait guère à ton problème. Pas la peine de le considérer tel pour arriver à tes fins.
Toujours à titre d'illustration comment utiliser OnTime avec le pseudo code que je t'avais donné:
fais ces 2 déclarations en tête de module
La procédure Lancement sera modifiée comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim Cpt As Long Dim Temps As Double
Remarque, lancement appelle elle même avec ontime
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 Sub Lancement() Dim TheEnd As Integer, j As Integer, m As Integer Dim i As Long m = 3 'nombre Temps = Now + TimeValue("00:00:1") Cpt = Cpt + 1 Feuil2.[A1] = Cpt For j = 1 To m TheEnd = PositionPlane(Feuil2.Shapes("plane" & j), j + 1, Cpt) DoEvents Next j Application.OnTime Temps, "Lancement" 'ici à titre indicatif If Cpt = 60 Then Fin End Sub
ATTENTION il faudra impérativement ajouter la procédure Fin pour arrêter le processus
Je répète: Ces codes sont pour ton apprentissage et ta compréhension et non une solution à ton problème. (Qui nécessite un petit plus)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub Fin() On Error Resume Next Application.OnTime Temps, Procedure:="Lancement", Schedule:=False Cpt = 0 End Sub
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
Ah oui bien l'appel tout seul. La procédure fin afin de ne pas tomber dans une boucle infinie je suppose. Non non tu n'en es pas la cause loin de là, j'ai pas mal appris en 3 jours sur le fait de pouvoir réduire un code avec la boucle d'hier. Le VB était inconnu jusqu'il y a peu donc merci. Peut être ce projet est il trop gros pour commencer mais je vais pas renoncer avec vos aides je vais y arriver.
A furye01
Beaucoup de temps perdu au lieu de t'entraîner comme je t'ai invité à le faire à l'utilisation la plus simple de la méthode OnTime (avancement d'un seul compteur)
Ce ne sera que lorsque tu l'auras parfaitement maîtrisée (pas avant) que nous parlerons de la "vitesse" du compteur.
Cette vitesse peut s'exprimer de deux manières :
- par un "pas" d'avancement proportionnel à la vitesse voulue
- par une fréquence de "battement" du "timer/ontime" inversement proportionnelle à la vitesse voulue. Ontime utilisée "basiquement" est limitée à un "battement" par seconde. Couplée à une variable, on atteint des fréquences allant jusqu'au 3 centièmes de seconde.
Voilà.
Je ne reviendrai plus dans la présente discussion tant que j'y verrai d'autres "tentatives, approches, etc ..." sans qu'ait été totalement maîtrisée cette étape/exercice essentielle à mes yeux.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
pas de soucis. Merci de ton aide !
@unparia +1 (comme toujours)
A ma charge, j'avais fait perdre à furye01 2 journées après mon exemple d'illustration ( Quand même je lui avais signalé).
Sans retour valable de sa part, je me retire dans l'attente de la visibilité de la démarche de l’intéressé.
@furye01: Ne brûle pas les étapes dans ton apprentissage.
Cordialement.
J'utilise toujours le point comme séparateur décimal dans mes tests.
Je n'ai rien perdu, merci de votre coup de main !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager