Remise
Résolu/Fermé
94michel
Messages postés
38
Date d'inscription
mardi 12 juin 2018
Statut
Membre
Dernière intervention
10 septembre 2020
-
11 juil. 2019 à 13:18
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 12 juil. 2019 à 08:53
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 12 juil. 2019 à 08:53
3 réponses
yg_be
Messages postés
22698
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 avril 2024
1 471
11 juil. 2019 à 13:58
11 juil. 2019 à 13:58
bonjour, que veux-tu calculer?
yg_be
Messages postés
22698
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 avril 2024
1 471
11 juil. 2019 à 18:45
11 juil. 2019 à 18:45
suggestion:
Option Explicit Type Coupon addr As String val As Currency selected As Boolean End Type Sub remise() Dim tout As Range, cell As Range, coll() As Coupon, nbr As Integer, remise As Currency, i As Integer Set tout = Sheets("Feuil1").[A1:D15] remise = CCur(Sheets("Feuil1").[E1]) nbr = 0 For Each cell In tout If IsNumeric(cell) And cell <> "" Then nbr = nbr + 1 ReDim Preserve coll(nbr) coll(nbr).addr = cell.address coll(nbr).val = CCur(cell.Value) coll(nbr).selected = False End If Next cell If match(remise, coll, 1) Then Debug.Print "ok" For i = 1 To nbr If coll(i).selected Then Debug.Print coll(i).val, coll(i).addr Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 3 Else Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 1 End If Next i Else Debug.Print "NOK" End If End Sub Private Function match(reste As Currency, coll() As Coupon, depth As Integer) As Boolean If coll(depth).val = reste Then coll(depth).selected = True match = True Else If depth = UBound(coll) Then match = False Else If match(reste, coll, depth + 1) Then match = True Else If coll(depth).val < reste Then coll(depth).selected = True If match(reste - coll(depth).val, coll, depth + 1) Then match = True Else coll(depth).selected = False match = False End If End If End If End If End If End Function
yg_be
Messages postés
22698
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 avril 2024
1 471
11 juil. 2019 à 20:27
11 juil. 2019 à 20:27
variante:
Option Explicit Type Coupon addr As String val As Currency selected As Boolean End Type Sub remise() Dim tout As Range, cell As Range, coll() As Coupon, nbr As Integer, remise As Currency, i As Integer, total As Currency Dim kp As Coupon Set tout = Sheets("Feuil1").[A1:D15] remise = CCur(Sheets("Feuil1").[E1]) nbr = 0 total = 0 For Each cell In tout If IsNumeric(cell) And cell <> "" Then nbr = nbr + 1 ReDim Preserve coll(nbr) coll(nbr).addr = cell.address coll(nbr).val = CCur(cell.Value) total = total + coll(nbr).val coll(nbr).selected = False End If Next cell If match(remise, coll, 1, total) Then Debug.Print "ok" For i = 1 To nbr If coll(i).selected Then Debug.Print coll(i).val, coll(i).addr Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 4 Else Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 1 End If Next i Else Debug.Print "NOK" For i = 1 To nbr Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 3 Next i End If End Sub Private Function match(reste As Currency, coll() As Coupon, depth As Integer, grandtotal As Currency) As Boolean Dim curval As Currency, totalrestant As Currency DoEvents curval = coll(depth).val If curval = reste Then coll(depth).selected = True match = True Exit Function End If If depth = UBound(coll) Then match = False Exit Function End If If curval < reste Then If match(reste - curval, coll, depth + 1, grandtotal - curval) Then coll(depth).selected = True match = True Exit Function End If End If totalrestant = grandtotal - curval If reste <= totalrestant Then If match(reste, coll, depth + 1, totalrestant) Then match = True Exit Function End If End If match = False End Function
94michel
Messages postés
38
Date d'inscription
mardi 12 juin 2018
Statut
Membre
Dernière intervention
10 septembre 2020
11 juil. 2019 à 21:03
11 juil. 2019 à 21:03
merci beaucoup
ça fonctionne très bien
bonne soirée
ça fonctionne très bien
bonne soirée
yg_be
Messages postés
22698
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 avril 2024
1 471
>
94michel
Messages postés
38
Date d'inscription
mardi 12 juin 2018
Statut
Membre
Dernière intervention
10 septembre 2020
12 juil. 2019 à 08:53
12 juil. 2019 à 08:53
couleurs améliorées:
Option Explicit Type Coupon addr As String val As Currency selected As Boolean End Type Sub remise() Dim tout As Range, cell As Range, coll() As Coupon, nbr As Integer, remise As Currency, i As Integer, total As Currency Dim kp As Coupon Sheets("Feuil1").[E1].Font.ColorIndex = 1 Set tout = Sheets("Feuil1").[A1:D15] remise = CCur(Sheets("Feuil1").[E1]) nbr = 0 total = 0 For Each cell In tout If IsNumeric(cell) And cell <> "" Then nbr = nbr + 1 ReDim Preserve coll(nbr) coll(nbr).addr = cell.address coll(nbr).val = CCur(cell.Value) total = total + coll(nbr).val coll(nbr).selected = False End If Next cell For i = 1 To nbr Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 1 Next i If match(remise, coll, 1, total) Then Debug.Print "ok" Sheets("Feuil1").[E1].Font.ColorIndex = 4 For i = 1 To nbr If coll(i).selected Then Debug.Print coll(i).val, coll(i).addr Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 4 Else Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 1 End If Next i Else Debug.Print "NOK" Sheets("Feuil1").[E1].Font.ColorIndex = 3 For i = 1 To nbr Sheets("Feuil1").Range(coll(i).addr).Font.ColorIndex = 3 Next i End If End Sub Private Function match(reste As Currency, coll() As Coupon, depth As Integer, grandtotal As Currency) As Boolean Dim curval As Currency, totalrestant As Currency DoEvents curval = coll(depth).val If curval = reste Then coll(depth).selected = True match = True Exit Function End If If depth = UBound(coll) Then match = False Exit Function End If If curval < reste Then If match(reste - curval, coll, depth + 1, grandtotal - curval) Then coll(depth).selected = True match = True Exit Function End If End If totalrestant = grandtotal - curval If reste <= totalrestant Then If match(reste, coll, depth + 1, totalrestant) Then match = True Exit Function End If End If match = False End Function
JvDo
Messages postés
1978
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
28 septembre 2020
856
11 juil. 2019 à 20:47
11 juil. 2019 à 20:47
Bonjour à tous,
eriiic a fait un travail intéressant sur la question que tu poses.
Si tu cherches toutes les solutions ou seulement un certain nombre, je te conseille de regarder son travail.
Si tu veux une solution, tu peux, en dehors de la macro de yg_be, utiliser le solveur d'excel.
Tu crées une zone (mes_variables_binaires) de même dimension que tes montants (15 par 4) et tu lui donnes la contrainte d'être binaire.
tu crées une formule : ma_remise-sommeprod(mes_montants*mes_variables_binaires) qui deviendra ton objectif avec valeur 0.
Tu choisis "simplexe" et tu lances le solveur qui te fournit une solution.
Tu peux mettre une MFC sur la zone de tes montants pour faire ressortir les valeurs choisies.
Cordialement
eriiic a fait un travail intéressant sur la question que tu poses.
Si tu cherches toutes les solutions ou seulement un certain nombre, je te conseille de regarder son travail.
Si tu veux une solution, tu peux, en dehors de la macro de yg_be, utiliser le solveur d'excel.
Tu crées une zone (mes_variables_binaires) de même dimension que tes montants (15 par 4) et tu lui donnes la contrainte d'être binaire.
tu crées une formule : ma_remise-sommeprod(mes_montants*mes_variables_binaires) qui deviendra ton objectif avec valeur 0.
Tu choisis "simplexe" et tu lances le solveur qui te fournit une solution.
Tu peux mettre une MFC sur la zone de tes montants pour faire ressortir les valeurs choisies.
Cordialement
94michel
Messages postés
38
Date d'inscription
mardi 12 juin 2018
Statut
Membre
Dernière intervention
10 septembre 2020
11 juil. 2019 à 21:07
11 juil. 2019 à 21:07
Bonsoir
merci pour cette solution, mais je ne comprends pas trop, si tu peux m'envoyer mon fichier avec ta formule intégrée ça ne serait pas de refus.
bonne soirée
Encore une fois Merci a vous tous.
merci pour cette solution, mais je ne comprends pas trop, si tu peux m'envoyer mon fichier avec ta formule intégrée ça ne serait pas de refus.
bonne soirée
Encore une fois Merci a vous tous.
11 juil. 2019 à 14:06
une remise de 4637,60€ avec un tableau de plusieurs montant en sélectionnant automatiquement les montants de la somme en remise.
merci
11 juil. 2019 à 14:43
11 juil. 2019 à 15:05
les cellules des colonnes A B C D sur 15 lignes sont notes des montants, dans la cellule E 1 le montant de la remise,idéal est une sélection automatique sur les connes A B C D des montants pour arriver à la remise.
Merci
11 juil. 2019 à 15:10
je ne comprends pas "changer la couleur", ni "arriver à la remise".
11 juil. 2019 à 15:13
C'est bien ça ?
Si c'est le cas, le problème est qu'il y a plusieurs combinaison possible...
Du coup sans plus de règles...