Macro pour retenir un prix selon la tranche

Bonjour ça marche bien et je vous remercie beaucoup.

J'aurai souhaité votre aide si possible sur le sujet "Fusion de lignes "dont vous avez participé, mais au cas échéant merci quand même.

Bonne journée

Merci pour ce retour.

Pour la fusion, j'ai décliné. Désolé.

Bonjour ,

Je me permets de revenir vers vous car quand je charge beaucoup de lignes (genre 700.000) dans le fichier j'ai un problème de lenteur d'ouverture du fichier (il faut attendre 30mn) et quand ça s'ouvre j'ai ça qui prend du temps: Ralentissement (4 Processeur(s) %)

Merci

Function prix(cel As Range) ' cel étant la quantité réelle
For i = (Asc("J") - 64) To Cells(cel.Row, Columns.Count).End(xlToLeft).Column Step 3
    If Cells(cel.Row, i) > cel Or Cells(cel.Row, i) = "" Then Exit For
    prix = Cells(cel.Row, i + 1)
Next
End Function

Function optimum(cel As Range) ' cel étant la quantité réelle
For i = (Asc("J") - 64) To Cells(cel.Row, Columns.Count).End(xlToLeft).Column Step 3
    If Cells(cel.Row, i + 2) < cel.Offset(0, 2) And Cells(cel.Row, i + 2) <> 0 Then optimum = Cells(cel.Row, i)
Next
optimum = Application.Max(optimum, cel.Value)
End Function

Bonjour,

2 choses ...

Je me permets de revenir vers vous car quand je charge beaucoup de lignes (genre 700.000) dans le fichier j'ai un problème de lenteur d'ouverture du fichier (il faut attendre 30mn)

Comment s'effectue le chargement des lignes ?

j'ai ça qui prend du temps: Ralentissement (4 Processeur(s) %)

Function prix(cel As Range) ' cel étant la quantité réelle
For i = (Asc("J") - 64) To Cells(cel.Row, Columns.Count).End(xlToLeft).Column Step 3
    If Cells(cel.Row, i) > cel Or Cells(cel.Row, i) = "" Then Exit For
    prix = Cells(cel.Row, i + 1)
Next
End Function

Function optimum(cel As Range) ' cel étant la quantité réelle
For i = (Asc("J") - 64) To Cells(cel.Row, Columns.Count).End(xlToLeft).Column Step 3
    If Cells(cel.Row, i + 2) < cel.Offset(0, 2) And Cells(cel.Row, i + 2) <> 0 Then optimum = Cells(cel.Row, i)
Next
optimum = Application.Max(optimum, cel.Value)
End Function

Dans ce cas, il ne faut pas passer directement par la fonction, mais l'activer seulement une fois les modifications faites. Par contre cela veut dire que ce ne sera plus automatique à chaque changement de valeur.

Cela améliorera peut-être les choses, mais il faudra bien passer par ce calcul !

Je regarde pour te donner une alternative.

Comment s'effectue le chargement des lignes ?

Le chargement de lignes s'effectue en copiant-collant les nouvelles valeurs sur chaque colonne.

Mais je l'avais enregistrer sous format (.xlsm), je viens de constater qu'en l'enregistrant sous le format (.xlsb), ça prend moins de temps pour ne pas dire ça s'ouvre automatiquement.

Merci bien

et donc ? souhaites-tu que je te propose une autre solution ?

Oui si possible.

Merci

Essaie d'abord de te mettre en calcul manuel avant toute chose.

Quand tout est chargé, fais F9 qui va recalculer tout le classeur.

Bonjour,

Je me permets de revenir vers vous pour faire une modification.

Sur la première ligne en besoin exprimé de 10 qui coûte 6347, je vois en besoin optimisé 300 qui coûte 5289, mais j'ai vu qu'à la tranche 7, il y'a 30 qui coûte 1113, et j'aimerai qu'il ramène 30 au lieu de 300.

Merci

2opt.xlsm (22.30 Ko)

et pourquoi pas

Tranche 8Prix révisé 8Total tranche 8
5017,71885,5
?

Voilà c'est ça qu'il faut ramener, je l'avais pas vu.

Merci

Je pense qu'il y a une erreur de raisonnement ... à force d'avoir changé les règles.

Il faut changer la macro.

D'accord je suis preneur de toute solution.

Merci beaucoup

Voici la modification

edit : modifié

Merci ça marche sur cet exemple (en ne changeant pas les valeurs).

Si je change la valeur de la tranche 8 de 50 à 20, il ramène toujours la tranche 7 (on dirait que c'est figé à la tranche 7 à ramener) sachant que j'aimerai que le même raisonnement s'applique sur toutes les lignes.

Merci d'avance

Autant pour moi ...

Function prix(cel As Range) ' cel étant la quantité réelle
Application.Volatile
For i = (Asc("I") - 64) To Cells(cel.Row, Columns.Count).End(xlToLeft).Column Step 3
    If Cells(cel.Row, i) > cel Or Cells(cel.Row, i) = "" Then Exit For
    prix = Cells(cel.Row, i + 1)
Next
End Function

Function optimum(cel As Range) ' cel étant la quantité réelle
Application.Volatile
Total = cel.Offset(0, 2)
For i = (Asc("I") - 64) To Cells(cel.Row, Columns.Count).End(xlToLeft).Column Step 3
    If Cells(cel.Row, i) > cel And Cells(cel.Row, i + 2) < Total And Cells(cel.Row, i + 2) <> 0 Then
        optimum = Cells(cel.Row, i)
        Total = Cells(cel.Row, i + 2)
    End If
Next
optimum = Application.Max(optimum, cel.Value)
End Function

J'espère que cette fois-ci c'est la bonne !

8opt.xlsm (21.93 Ko)

Bonjour c'est presque la bonne mais il manque un détail.

En fait j'aimerai qu'il ramène en "besoin optimisé" la quantité minimale (en tranche) parmi les candidats possibles qui satisfont

Total tranche i < Total (i=1,2,3,....).

Par exemple dans le fichier joint il y'a un "besoin exprimé" de 10 , au lieu de ramener 50 (comme il le fait) qui coûte moins cher certes, je veux qu'il ramène 30 (en besoin optimisé) car 30 est plus proche de 10 (besoin exprimé) et il vérifie la condition:

Total tranche 7 <Total (=6347,6).

En gros: Toujours qu'il ramène la tranche la plus proche du besoin exprimé parmi les candidats possibles.

Merci beaucoup

4opt-bis.xlsm (22.64 Ko)

Dans cette "logique", si tu mets 10 il te proposera 30, et si tu mets 30 il te proposera 50 !

J'avoue que je ne comprends pas bien la "logique" et j'ai du mal à travailler quand je ne m'approprie pas l'objectif.

Le corps de la macro est simple, je te laisse ajuster la recherche de la valeur.

Merci beaucoup de votre disponibilité mais votre version précédente était bonne.

Bonjour,

je reviens vers vous pour pouvoir accélérer l'exécution du code , car quand je renseigne plusieurs lignes il prend beaucoup de minutes à produire le résultat attendu.

Merci

Rechercher des sujets similaires à "macro retenir prix tranche"