Calcul km/min et km/h VBA

Bonjour à tous,

Je coince dans mes formules de conversion si quelqu'un veut bien me donner un début de solution. je vous remercie d'avance.

Je dois ressortir à partir de la textbox1 des données converties en min au km et en km/h mais ma formule ne m'affiche pas les bons chiffres.

Cordialement

Bonjour,

Sans données je ne sais pas convertir !

Dis-nous déjà ce qu'est censée contenir la TextBox1 : quel type de données ? sous quel format ?

nb- Sachant qu'une TextBox ne contient in fine que du texte, ce qui signifie que pour utiliser ce contenu, il faudra vraisemblablement le convertir...

Bonjour,

Oui désolé

Ma textbox1 doit contenir des chiffres avec ou sans virgule ex 8,9 ou 19 (entre 7 et 22 à titre indicatif)

Cordialement

Et c'est censé être quoi ?

Ce sont des vitesses en km/h à convertir en vitesse et allure et en % aussi de cette même vitesse

Ce sont des vitesses en km/h à convertir en vitesse et allure

Tu trouves pas que ça manque un peu de précision !

km/h c'est une unité de vitesse : je veux bien la convertir en vitesse, c'est déjà une vitesse ! Mais en quelle unité ?

Et l'allure se définit comment ? et s'exprime comment ? En quelle unité ?

Bonjour à tous, merci MFerrand pour ce retour,

En effet, je m'explique, sur un tableau Excel, les formules sont correctes et font leur travail contrairement qu'en VBA.

Dans ma textbox1 on doit mettre des chiffres,

Sur les Textbox2,3,4 s'affichent des hh:mm:ss par conversion (formule) à partir de la texbox1 (Ces textsbox doivent afficher hh:mm:ss)

Le problème se pose aussi sur les Textbox 5,7,9 (allure), ces zones doivent afficher un format horaires MM:SS. (2 décimales après la virgule pas plus)

La textbox5 dépend du résultat de la textbox6, La textbox7 dépend du résultat de la textbox8, La textbox9 dépend du résultat de la textbox10

la vitesse en k/h

l'allure en min/km

J'ai corrigé les box allure et ci-joint le nouveau fichier

Cordialement

Bonjour,

Je n'ai pas essayé de comprendre tes formules ou les unités, j'ai simplement utilisé la fonction Format avec "hh:mm:ss" pour les textbox du haut, et "mm:ss" pour les textbox du milieu. A toi ensuite de voir si les valeurs affichées sont les bonnes...

Le fichier :

Bonjour à tous,

Merci pour cette réponse qui m'a aidé pour l'affichage, par contre, les Textboxs 5, 7 et 9 n'affichent plus le bon calcul. par exemple selon la formule 60/11=1,20???

et aussi j'aimerai limiter l'affichage de toutes les TextBoxs à 2 chiffres après la virgule.

Merci pour tout

Cordialement

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.

Salut M. Ferrand!

C'est bien mieux comme ça en effet... Chapeau l'artiste!

Salut et merci encore pour votre aide, le temps de digérer ce code génial mais trop sophistiqué pour moi, j'ai constaté des erreurs sur les allures calculées en min par km. J'ai pris en exemple en TextBox1 une valeur de 13, cela m'affiche ce qui suit :

Textbox5 : une allure de 12:26 alors que ça doit être à 5:42 pour une Vitesse de 11,05 km/h (Textbox6)

Idem pour la Textbox7 : 12:46 au lieu de 5:75 pour V = 10,40 km/h (Textbox8)

et la Textbox9 : 12:09 au lieu de 6:15 pour V = 9,75 km/h (Textbox10)

sur une base de calcul de 1 min/km = 60 km/h ou 1 km/h = 60 min/km

merci encore

Cordialement

Bonsoir,

C'est la fonction Format qui joue des tours !

... = Format((1 / vv) / 24, "nn:ss")

Dans l'indication du format concerné, tu remplaces "mm:ss" par "nn:ss".

Tu verras que s'affiche alors 05:26 (pas 42 qui sont des centièmes de minute et non des secondes).

Cordialement.

Bonjour à tous,

Super pour ce bon code et pour vos réponses rapides. Merci le forum, MFerrand, Ausecour.

Je vais travailler sur ce fichier avec des corrections de look, affiner peut être aussi les différents % avant de le partager.

Je reviens vers vous si jamais je ne parviens pas à solutionner certains détails.

Merci encore

Cordialement

Bonjour à vous deux,

@M.Ferrand

Je croyais que pour afficher minutes et secondes il fallait utiliser mm:ss, mais apparemment il faut mettre nn:ss? Je ne vois pas la différence entre les deux et surtout ce que signifie nn, pourrais-tu m'expliquer? Je suis perdu (je suis nouveau avec la fonction, je la pensais simple mais elle a déjà des pièges pour ce genre d'informations visiblement....)

Pour afficher heures:minutes:secondes c'est hh:mm:ss ou hh:nn:ss du coup?

Salut Ausecour,

n est le code indiqué par l'Aide pour minute avec la fonction Format (mais utilisé pour un format de cellule, ça ne fonctionnera pas).

"hh:mm:ss" fonctionne tout de même avec Format mais lorsqu'on fournit un code sans les heures, il semble que la fonction interprète alors m comme code du mois, et 0 étant le numéro de série date du 30 décembre 1899, elle renvoie 12 pour décembre, mais lui accole bien les secondes.

Note aussi en la matière qu'elle ne reconnaît pas de format pour afficher les heures au-dessus de 24...

Bonne journée.

Ah d'accord, il semble que ce soit un défaut de fonction alors...

Je me méfierai à l'avenir... Parce que dans l'aide ils ne parlent pas du tout du nn:ss

Merci pour ces explications

Rechercher des sujets similaires à "calcul min vba"