Formule
Bonjour a toutes et a tous,
voila je vous expose mon souci le plus clairement possible.
je suis coach sportif en musculation ,je cherche une formule qui me décompose un nombre: cette a dire si je doit mettre sur une barre olympique ( 20 kg) un poids total de 160 kg sachant que je dispose de 3 disques de 25 kg,3 disques de 20 kg 3 de 15 kg, 3 de 10 kg et ainsi de suite jusqu'a 1.25 kg.
je voudrais qu'une formule me calcule combien de disque de 25,20,15 kg ........... etc, il me faut pour compléter ma barre a 160 kg en tenant compte que ma barre fait déjà 20 kg, et que je voudrais qu' elle me le calcul que sur un coté de la barre....
j’espère avoir été assez simpliste dans mes propos
merci d'avance pour votre aide je reste a votre disposition pour de plus ample précision
Bonjour,
j'ai adapté un exemple donné par h2so4 : https://forum.excel-pratique.com/excel/equation-a-4-inconnues-t52554.html
à tester,
merci beaucoup je vais le tester et vous dirai si c'est bon ou pas
bon ben ça ne fonctionne pas hélas
je vous laisse un fichier excel pour que vous compreniez se que je désir ........je ne sais pas la formule pour y parvenir.....merci
Salut,
ne me dis pas que tu as besoin d'une formule pour ça?
Ça va plus vite de tête que d'allumer le PC...
A+
Bonjour,
A mon avis ... la formule serait beaucoup trop compliquée ...
Avec l'add-in Solveur ... problème résolu en 10 secondes ...
Ci-joint ton fichier test ...
En espèrant que cela t'aide ...
bonjour
j'avais essayé un truc à base de
PRODUITMAT(INVERSEMAT(..........);.......)
mais je n'arrive pas a rédiger les equations pour avoir une matrice carrée
cordialement
Coucou Tulipe
C'est marrant ... parce que j'ai essayé aussi en matricielle ...
Mais bon ... avec le Solveur ... tu as la gestion des contraintes à l'infini ... et surtout c'est fait en 10 secondes ...!!!
Salut l'équipe,
For x = 2 To 9
For y = Cells(x, 3) To 1 Step -1
If iFlag + (y * Cells(x, 2)) <= iPoids Then
iFlag = iFlag + ((y * Cells(x, 2)))
Cells(x, 4) = y
Exit For
End If
If iFlag = iPoids Then Exit For
Next
NextA+
Re,
rectification : moins simple que prévu!
For x = 2 To 9
For y = Cells(x, 3) To 1 Step -1
If iFlag + (y * Cells(x, 2)) <= iPoids Then
iFlag1 = 0
If x > 2 Then
For Z = x To 9
iFlag1 = iFlag1 + Cells(Z, 2)
Next
End If
If iFlag + iFlag1 <= iPoids Then
iFlag = iFlag + ((y * Cells(x, 2)))
Cells(x, 4) = y
Exit For
End If
End If
If iFlag = iPoids Then Exit For
Next
NextA+
Bonjour fab40,
voyez si le fichier joint vous convient, modifiez la valeur en C2
Salut l'équipe,
Bon dimanche à tous,
je crois que j'ai trouvé , cette fois! 8)
Bon, je ne pense pas que ma méthode me rapportera la médaille Fields non plus, hein!
Petites précisions, quand même :
- dans ton post originel, tu dis que tu disposes de 3 disques de chaque poids, dans ton fichier-exemple, de 4. Quant est-il?
- ces quantités (3) sont-elles disponibles pour la barre complète (auquel cas ça ne va pas être simple pour le calcul) ou pour le chargement du SEUL côté qu'il faut calculer?
- pour nous faciliter la vie, je pense, pour couvrir tous les cas possibles de chargement, de prévoir d'investir dans 4 disques de 0,5 Kg.
Je reviens plus tard!
A+
Salut l'équipe,
pas de réponse donc je balance ce que j'ai déjà!
- encodage du poids à lever en [A2] (cellule fusionnée) ;
- affichage du poids à calculer en [A10] ;
- combinaison en [D2:D10] : j'ai ajouté des disques de 0.5 Kg. C'est ta part dans l'effort!
- en colonnes [F:W], graphique sommaire de la combinaison de disques.
Bonne suée!
A+
Bonjour (..)
@curulis57
Belle réalisation !
J'adore la superbe indentation (beaucoup trop rare dans les codes malheureusement, mais si facile à lire)
et plus encore l'imbrication (presque perpétuelle
Dommage pour les EXIT multiples (que j'ai horreur de voir...) mais dans ce cas là, je pense malgré tout qu'il n'y a pas d'autre solution
En tout cas
Et voici une suggestion pour la version 4
Salut tout le monde,
Belle journée à tous,
@NCC1701 : merci de ton appréciation!
Tu seras content : j'ai éliminé les EXIT!
Les idées venant les unes après les autres, j'ai finalement repris tout depuis (presque) le début pour éliminer les petits problèmes qui me gênaient aux entournures... et ce n'est pas fini : j'ai repéré quelques soucis de calcul!
For a = Int(tNbDsq(1, 1) / iDiv) To 0 Step -1 '25 Kg
Erase tOK
tOK(1) = a
dFlag = a * tData(1, 1)
If Abs(dPoids - dFlag) < Abs(dPoids - dTest) Then Call TestNO(dFlag)
If dFlag = dPoids Then
iOK = 1
Call TestOK
End If
For Z = Int(tNbDsq(2, 1) / iDiv) To 0 Step -1 '20 Kg
tOK(2) = Z
dFlagZ = IIf(Z = 0, dFlag, dFlag + (Z * tData(2, 1)))
If Abs(dPoids - dFlagZ) < Abs(dPoids - dTest) Then Call TestNO(dFlagZ)
If dFlagZ = dPoids Then
iOK = 1
Call TestOK
End If
For e = Int(tNbDsq(3, 1) / iDiv) To 0 Step -1 '15 Kg
tOK(3) = e
dFlagE = IIf(e = 0, dFlagZ, dFlagZ + (e * tData(3, 1)))
If Abs(dPoids - dFlagE) < Abs(dPoids - dTest) Then Call TestNO(dFlagE)
If dFlagE = dPoids Then
iOK = 1
Call TestOK
End If
For r = Int(tNbDsq(4, 1) / iDiv) To 0 Step -1 '10 Kg
tOK(4) = r
dFlagR = IIf(r = 0, dFlagE, dFlagE + (r * tData(4, 1)))
If Abs(dPoids - dFlagR) < Abs(dPoids - dTest) Then Call TestNO(dFlagR)
If dFlagR = dPoids Then
iOK = 1
Call TestOK
End If
For t = Int(tNbDsq(5, 1) / iDiv) To 0 Step -1 '5 Kg
tOK(5) = t
dFlagT = IIf(t = 0, dFlagR, dFlagR + (t * tData(5, 1)))
If Abs(dPoids - dFlagT) < Abs(dPoids - dTest) Then Call TestNO(dFlagT)
If dFlagT = dPoids Then
iOK = 1
Call TestOK
End If
For y = Int(tNbDsq(6, 1) / iDiv) To 0 Step -1 '2,5 Kg
tOK(6) = y
dFlagY = IIf(y = 0, dFlagT, dFlagT + (y * tData(6, 1)))
If Abs(dPoids - dFlagY) < Abs(dPoids - dTest) Then Call TestNO(dFlagY)
If dFlagY = dPoids Then
iOK = 1
Call TestOK
End If
For u = Int(tNbDsq(7, 1) / iDiv) To 0 Step -1 '2 Kg
tOK(7) = u
dFlagU = IIf(u = 0, dFlagY, dFlagY + (u * tData(7, 1)))
If Abs(dPoids - dFlagU) < Abs(dPoids - dTest) Then Call TestNO(dFlagU)
If dFlagU = dPoids Then
iOK = 1
Call TestOK
End If
For i = Int(tNbDsq(8, 1) / iDiv) To 0 Step -1 '1,25 Kg
tOK(8) = i
dFlagI = IIf(i = 0, dFlagU, dFlagU + (i * tData(8, 1)))
If Abs(dPoids - dFlagI) < Abs(dPoids - dTest) Then Call TestNO(dFlagI)
If dFlagI = dPoids Then
iOK = 1
Call TestOK
End If
For o = Int(tNbDsq(9, 1) / iDiv) To 0 Step -1 '0,5 Kg
tOK(9) = o
dFlagO = IIf(o = 0, dFlagI, dFlagI + (o * tData(9, 1)))
If Abs(dPoids - dFlagO) < Abs(dPoids - dTest) Then Call TestNO(dFlagO)
If dFlagO = dPoids Then
iOK = 1
Call TestOK
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next- le poids de la barre peut être encodé en [A10] ;
- encodage de la barre totale à soulever en [A2] ;
- l'objectif du calcul s'affiche en [A7] ;
- le nombre de disques disponibles peut être paramétré en [C2:C10] ;
- en cliquant sur [C1], on peut spécifier si les disques disponibles représentent la totalité des disques disponibles (Total) ou la part disponible pour le calcul (1 côté) ;
- c'est la meilleure combinaison possible en terme de nombre de disques qui est proposée avec représentation graphique sommaire ;
- si l'objectif est impossible (ça arrive), c'est la combinaison la plus proche de l'objectif qui est proposée.
- essaie de demander une barre de 19 Kg...
Et c'est tout pour l'instant!
Dodo!
A+
(..)
@curulis57
J'ai remarqué un petit bug... voici la correction à placer tout au début de la procédure...
If [A2] = [A10] Then
MsgBox "vous n'avez pas besoin de calculer pour ça", vbCritical, "Soulevez plutôt la barre seule !"
Exit Sub
End IfSalut les sportifs,
voici la dernière version toute chaude!
Même fonctionnement que la précédente avec quelques aménagements d'affichage. Rien de bien méchant.
Grâce à la remarque de NCC
Heureusement car j'en ai trouvé des perfides...
Seule chose à expliquer :
- pour 2 disques de chaque poids, la boucle de calcul tourne +- 30.000 fois : très rapide... ;
- avec 4 disques de chaque poids, on tourne à +- 2.500.000 : moins rapide mais très acceptable... ;
- je n'ai pas eu la patience d'attendre avec 10...
Donc, si tu encodes plus de 4 disques dans ton râtelier, la macro les supprime d'office pour ramener le chiffre à 4 disques par catégorie de poids, amplement suffisant pour atteindre la quasi totalité des objectifs de répartition.
N'hésite pas à revenir pour des aménagements particuliers.
A+
Bonjour le fil
@curulis57
Encore une belle épreuve de force (brute)
J'ai compté (rien que dans la procédure principale (WorksheetChange) tu utilises 9 imbrications de For Next
Bravo !
Ce problème me rappelle depuis le début celui des "Tours de de Hanoï", je vais donc tenter une approche récursive, car je pense que c'est de toute façon la seule solution pour résoudre tous les problèmes en même temps... Laisse moi un peu de temps pour me remettre dans le bain et je reviens
Par contre on dirait que fab40 a décidé d'utiliser une calculette ou alors il a acheté plus de disques prenant en considération que le problème serait sans doute plus simple à résoudre de cette manière !
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour toutes et tous
moi, je me pose la question : Comment vous faites ?
Musclor n'a qu'à bien se tenir ^^^^
Oh faites c'est le côté gauche ou droite de la barre
bravo encore !!!
Bonjour le fil...
@Andre13
C'est une très bonne question !Andre13 a écrit :moi, je me pose la question : Comment vous faites ?
Malheureusement il n'y a pas vraiment de réponse directe ni simple
- Première Hypothèse : Nous ne soulevons pas de fonte, mais nous avons le cerveau musclé
- Deuxième Hypothèse : Nous avons le cerveau musclé, mais nous n'avons pas toutes les réponses
- Troisième Hypothèse : Nous n'avons pas toutes les réponses, mais nous n'aimons pas les problèmes non résolus
- Quatrième Hypothèse : Nous n'aimons pas les problèmes non résolus, mais nous avons l'esprit d'analyse
- Cinquième Hypothèse : Nous avons l'esprit d'analyse, mais nous aimons trouver le solution la plus proche possible du besoin
- Sixième Hypothèse : Nous aimons trouver le solution la plus proche possible du besoin, mais nous continuons à chercher tant qu'elle ne nous convient pas
- Septième Hypothèse : Nous continuons à chercher tant qu'elle ne nous convient pas, mais nous savons que nous finiront par trouver la solution idéale
- Huitième Hypothèse : Nous savons que nous finiront par trouver la solution idéale, mais nous savons aussi que d'autres trouverons une solution encore meilleure
Conclusion : nous continuons à chercher ! parce que nous aimons les défis (musclés)
Ou si tu préfères en langage plus simple