Bonjour, Salut Ausecour !
J'ai essayé de simplifier un peu et de rationnaliser :
D'abord, tes TextBox 2 à 19, destinés aux résultats de calculs, on ne doit pas pouvoir saisir, il convient donc de passer leur propriété Locked à True.
Ensuite lorsqu'on modifie TextBox1, il convient d'effacer le contenu des autres d'une part et de n'accepter qu'une valeur numérique. On intervient donc à la validation du contenu de la TextBox :
Private Sub TextBox1_AfterUpdate()
Dim v
Effacer
v = TextBox1.Value
If v <> "" Then
v = Replace(v, ".", ",")
If IsNumeric(v) Then
TextBox1.Value = v
Else
TextBox1.Value = ""
End If
End If
End Sub
On récupère la valeur de la TextBox dans une variable, par commodité. Si non vide, on remplace le point (décimal) éventuel par une virgule et on teste si la valeur est numérique. Si elle ne l'est pas on l'efface.
Dans tous les cas, on efface préalablement les autres TextBox, en lançant une procédure d'effacement :
Sub Effacer()
Dim i%
For i = 2 To 19
Controls("TextBox" & i).Value = ""
Next i
End Sub
Procédure de validation, qui opère les calculs :
Private Sub Valider_Click()
Dim v#, vv#, i%, p, d
If TextBox1.Value = "" Then Exit Sub
v = CDbl(TextBox1.Value)
p = Array(0.85, 0.8, 0.75)
d = Array(10, 21.1, 42.195)
For i = 2 To 4
vv = v * p(i - 2)
Controls("TextBox" & i).Value = Format((d(i - 2) / vv) / 24, "hh:mm:ss")
Controls("TextBox" & i * 2 + 1).Value = Format((1 / vv) / 24, "mm:ss")
Controls("TextBox" & i * 2 + 2).Value = Format(vv, "0.00")
Next i
For i = 11 To 19
Controls("TextBox" & i).Value = Format(v * 0.05 * (i + 2), "0.00")
Next i
End Sub
On travaille avec des variables, parce que plus simple, et des boucles, parce que ça raccourcit le code et ça va plus vite.
D'abord on s'assure que TextBox1 n'est pas vide, sinon on sort...
Si une valeur, on la récupère dans une variable v de type Double, en la convertissant en valeur numérique (dans la TextBox, c'est du texte qu'on a).
On utilise une vitesse pondérée selon la distance pour les calculs, on établit un tableau p des pondérations appliquées.
[J'ai retenu 0,85 0,8 0,75. Si tu appliques 0,9 0,85 0,75, tu modifieras. Mais tu appliques la même pondération à tes divers calculs, pas des pondérations différentes, ce qui n'aurait aucun sens !]
On dresse également un tableau des distances d : 10 21,1 42,195.
Et on peut servir en boucle nos TextBox 2 3 4, en faisant varier une variable i de 2 à 4. Et on servira simultanément les TB i*2 + 1 (= 5 7 9) pour l'allure et les TB i*2 + 2 (= 6 8 10) pour la vitesse pondérée.
A chaque tour de boucle, on calcule d'abord la vitesse pondérée dans une variable vv, à partir de v, en la pondérant par le coefficient de notre tableau p (les tableaux étant indicés à partir de 0, l'indice est i-2).
- Le temps mis est le rapport de la distance (km) par la vitesse (km/h), le résultat est en heures ; on le divise par 24 pour obtenir une valeur horaire Excel, et on applique à ce résultat un format horaire.
- L'allure, c'est le même calcul, pour une distance de 1 km ; on applique au résultat un format horaire mm:ss.
- La vitesse, on l'a calculée, on lui applique un format à 2 décimales.
Pour les TextBox 11 à 19, on les sert avec une vitesse pondérée croissante de 65% à 105% (de 5% en 5%).
Une simple boucle de 11 à 19, la pondération à appliquer sera 0,05*(i+2).
Cordialement.