Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

  • Initiateur de la discussion Initiateur de la discussion Nnaks
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Nnaks

XLDnaute Nouveau
Bonjour chers amis internautes,

Je me permets de solliciter votre aide pour résoudre une colle que je n'arrive pas à trouver.
Ce serait au moyen d'un résolution simple ou d'un code VBA que je pourrais éventuellement trouver la solution à mon problème que voici:
J'ai un certain nombre de clients i=20 dont la demande est Di
Un certain nombre d'usines j=10 dont la capacité est Bj
Je souhaite déterminer un facteur "Id" qui représente le nombre maximum de clients dont la demande totale ne dépasse pas la capacité d'une usine donnée.
Sur le fichier joint, on a une colonne avec les demandes des clients, un ligne avec les capacités des usines et une ligne correspondant au facteur donné.
D'après ce que j'ai pu comprendre, c'est que pour chaque "Id"(j), par exemple pour l'usine 1 dont la capacité est de 89, c'est de trouver le nombre maximal de clients dont la demande totale (en sommant leurs demandes) est inférieure ou égale à 89. Le choix de ces clients devrait être en plus précisé.... :/

Je galère et je ne vois pas comment est ce que je pourrai y arriver.
J'espère avoir bien expliqué le problème et vous remercie d'avance pour votre aide.
 

Pièces jointes

Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Bonjour Staple1600,

C'est exactement la même histoire, le même projet sauf que c'est une autre étape.

Si je dois éclaircir un point, dis le moi pour rendre la tâche plus facile 🙂

Merci en tout cas.
 
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Bonsoir Nnaks,

Un essai de solution avec une macro utilisant le solveur. Voici les instructions de Microsoft pour le faire:




J'ai rajouté des cellules dans deux colonnes intermédiaires utilisées par le solveur: colonnes C et D.
J'ai rajouté des cellules dans la ligne 5 qui contiennent la capacité max des commandes par les clients.

Je suis novice en matière de solveur, je ne sais pas si j'ai utilisé ni les bons paramètres pour le solveur ni surtout la bonne méthode, mais ça a l'air de donner des résultats pas trop incohérents.

NB: il est apparu quelquefois lors du premier calcul une fenêtre 'étrange'. En cliquant sur 'continuer', la macro poursuit normalement son traitement et cette fenêtre ne surgit plus par la suite.

Nota: macro élaborée sous Excel 10 !

Rem: j'ai joint différents jeux de valeurs de capacité d'usines pour tester la vitesse. Les vitesses sont ceux de ma bien bien vieille machine maintenant (2007 - Intel Core 2 CPU 6420 @ 2.13GHz - 2 Go mémoire)
 

Pièces jointes

Dernière édition:
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Bonsoir à tous,

Il me semble que le problème est très simple : on trie sur la colonne B et on somme les valeurs tant que la somme est inférieure à bj :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Range, plage As Range, bj, i&
Set r = [E5:N5] 'à adapter
If Intersect(Target, r) Is Nothing Then Exit Sub
Cancel = True
Set plage = Range("B3", Cells(Rows.Count, 2).End(xlUp)) 'à adapter
If plage.Row < 3 Then Exit Sub
Application.ScreenUpdating = False
r.Resize(Rows.Count - r.Row + 1).ClearContents 'RAZ
plage.Offset(, -1).Resize(, 2).Sort plage, Header:=xlNo 'tri colonne B
For Each r In r
  bj = r(-1)
  For i = 1 To plage.Count
    If Application.Sum(plage.Resize(i)) > bj Then Exit For
  Next
  r = i - 1
  r(2).Resize(i - 1) = plage(1, 0).Resize(i - 1).Value
Next
plage.Offset(, -1).Resize(, 2).Sort plage(1, 0), Header:=xlNo 'tri colonne A
End Sub
J'ai choisi le double-clic pour lancer la macro, on peut utiliser toute autre méthode.

Fichier joint.

Edit : précision : sous la plage jaune s'affichent les numéros des clients.

A+
 

Pièces jointes

Dernière édition:
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Bonjour à tous, job75 🙂

Bonsoir à tous,

Il me semble que le problème est très simple : on trie sur la colonne B et on somme les valeurs tant que la somme est inférieure à bj :

Il me semble bien aussi! Honte à moi! 😡 (néanmoins, ça m'a permis de mieux comprendre la manipulation du solveur - on se console comme on peut)
 
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Re,

Sur un grand tableau cette macro doit être plus rapide grâce à la variable s :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Range, plage As Range, bj, s, i&
Set r = [E5:N5] 'à adapter
If Intersect(Target, r) Is Nothing Then Exit Sub
Cancel = True
Set plage = Range("B3", Cells(Rows.Count, 2).End(xlUp)) 'à adapter
If plage.Row < 3 Then Exit Sub
Application.ScreenUpdating = False
r.Resize(Rows.Count - r.Row + 1).ClearContents 'RAZ
plage.Offset(, -1).Resize(, 2).Sort plage, Header:=xlNo 'tri colonne B
For Each r In r
  bj = r(-1): s = 0
  For i = 1 To plage.Count
    s = s + Val(plage(i))
    If s > bj Then Exit For
  Next
  r = i - 1
  r(2).Resize(i - 1) = plage(1, 0).Resize(i - 1).Value
Next
plage.Offset(, -1).Resize(, 2).Sort plage(1, 0), Header:=xlNo 'tri colonne A
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Bonsoir à tous,

Un essai par formules (grâce à une précédente astuce empruntée à R@chid 🙂 ).

nb: Les formules pour "di triées" et "Facteur Id" sont des formules matricielles.

edit : modifié fichier pour ôter la macro non utilisée.
 

Pièces jointes

Dernière édition:
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

(re)Bonsoir à tous,

Un dernier essai par formules qui liste aussi les clients.

nb: Les formules pour "di triées" et "Facteur Id" et " Σ Clients i" sont des formules matricielles.

edit : modifié fichier pour ôter la macro non utilisée.
 

Pièces jointes

Dernière édition:
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

(re) Bonjour à tous,

La méthode par solveur (v1) et la méthode de la somme des n plus petites valeurs semblent toutes les deux maximiser le nombre de clients pour une capacité donnée. Cependant la méthode du solveur maximise aussi le total des demandes des clients sélectionnés.

Les 20 clients ont pour demandes:
Client i: 1- 2- 3- 4- 5- 6- 7- 8- 9- 10-11-12-13-14-15-16-17-18-19-20
di......: 12-18-18-19-26-21-18-19-18-11-22-21-13-19-13-14-22-17-27-28


ou encore en triant:
Client i: 10-1 -13-15-16-18-2 -3 -7 -9 -4 -8 -14-6 -12-11-17-5 -19-20
di......: 11-12-13-13-14-17-18-18-18-18-19-19-19-21-21-22-22-26-27-28



Pour une capacité cible de 88,5:
La méthode "somme petites valeurs" donnent les clients: 10 - 1 - 13 - 15 - 16 - 18
soit un total de demandes égal à : 80

Pour la même capacité cible, la méthode solveur donnent les clients: 3-10-13-15-16-18
soit un total de demandes égal à : 86

Voir exemples joints:
 

Pièces jointes

Dernière édition:
Re : Déterminer le nombre maximal de valeurs inférieures à une cellule donnée.

Bonjour mapomme, le forum,

C'est un avantage indéniable du solveur de pouvoir maximiser à la fois le nombre de clients et la somme des demandes.

Peux-tu tester cependant la durée d'exécution sur un grand tableau ?

J'ai testé ma version (2) sur 60 000 lignes et des valeurs bj en E3:N3 multipliées par 3000.

Sur Win XP/Excel 2003 la durée d'exécution est de 2,70 secondes.

Avec cette version (3) la durée d'exécution passe à 1,22 seconde :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Range, plage As Range, ub As Long, S, i As Long, n As Variant
Set r = [E5:N5] 'à adapter
If Intersect(Target, r) Is Nothing Then Exit Sub
Cancel = True
Set plage = Range("B3", Cells(Rows.Count, 2).End(xlUp)) 'à adapter
Application.ScreenUpdating = False
r.Resize(Rows.Count - r.Row + 1).ClearContents 'RAZ
If plage.Row < 3 Then Exit Sub
plage.Offset(, -1).Resize(, 2).Sort plage, Header:=xlNo 'tri colonne B
ub = Application.Count(plage)
If ub < 2 Then Exit Sub
S = plage.Resize(ub) 'matrice
For i = 2 To ub
  S(i, 1) = S(i, 1) + S(i - 1, 1)
Next
For Each r In r
  n = Application.Match(r(-1), S)
  If IsNumeric(n) Then
    r = n
    r(2).Resize(n) = plage(1, 0).Resize(n).Value
  End If
Next
plage.Offset(, -1).Resize(, 2).Sort plage(1, 0), Header:=xlNo 'tri colonne A
End Sub
A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…