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

12poids.xlsx (8.63 Ko)

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

11poids.xlsx (10.02 Ko)

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
    Next

A+

4musclor.xlsm (16.29 Ko)

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
    Next

A+

7musclor.xlsm (16.76 Ko)

Bonjour fab40,

voyez si le fichier joint vous convient, modifiez la valeur en C2

22fab40.xlsx (6.51 Ko)

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!
Quelques combinaisons entre 0 et 1-2 kg ne fonctionneront pas en raison de l'absence de disque de 0.25 Kg!

- en colonnes [F:W], graphique sommaire de la combinaison de disques.

Bonne suée!

A+

11musclor.xlsm (36.53 Ko)

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 ) de For...Next !

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

capture 20171009 001

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+

7musclor.xlsm (42.95 Ko)

(..)

@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 If

Salut 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 , j'ai poussé les tests assez loin pour repérer un maximum de dysfonctionnements, petits ou grands.

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+

8musclor.xlsm (47.45 Ko)

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 !

Bonjour toutes et tous

moi, je me pose la question : Comment vous faites ? vous êtes fabuleusement fortiche

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

Andre13 a écrit :

moi, je me pose la question : Comment vous faites ?

C'est une très bonne question !

Malheureusement il n'y a pas vraiment de réponse directe ni simple

  1. Première Hypothèse : Nous ne soulevons pas de fonte, mais nous avons le cerveau musclé
  2. Deuxième Hypothèse : Nous avons le cerveau musclé, mais nous n'avons pas toutes les réponses
  3. Troisième Hypothèse : Nous n'avons pas toutes les réponses, mais nous n'aimons pas les problèmes non résolus
  4. Quatrième Hypothèse : Nous n'aimons pas les problèmes non résolus, mais nous avons l'esprit d'analyse
  5. Cinquième Hypothèse : Nous avons l'esprit d'analyse, mais nous aimons trouver le solution la plus proche possible du besoin
  6. 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
  7. 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
  8. 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 jusqu'à ce que

Rechercher des sujets similaires à "formule"