Grote dozen, kleine dozen.

Status
Niet open voor verdere reacties.

hondel

Gebruiker
Lid geworden
29 okt 2008
Berichten
66
Ik heb in Excel 2003 een bestel programma gemaakt.
Dit werkte prima totdat de leverancier zijn verpakkingen veranderde.
Voorheen waren de grote dozen altijd een veelvoud van de kleine dozen.
Als het kon werd er automatisch een grote doos bestel omdat dat goedkoper is.
Nu vond de leverancier het leuk om in de kleine verpakking 6 stuks en in de grote verpakking 10 stuks te doen.
Nu kan ik dus 6, 10, 12, 16, 18, 20, enz. bestellen

Excel weet hoeveel stuks hij moet bestellen alleen lukt het mij niet om iets te maken wat afrond naar de eerst volgende mogelijkheid.

Bijvoorbeeld :
Als er 7 stuks nodig zijn moet Excel er 10 van maken (1*10)
Als er 11 stuks nodig zijn moet Excel er 12 van maken (2*6)
Als er 14 stuks nodig zijn moet Excel er 16 van maken (1*10 en 1*6)
Als er 17 stuks nodig zijn moet Excel er 18 van maken (3*6)
Als er 19 stuks nodig zijn moet Excel er 20 van maken (2*10)
Enz.

Ik heb er een voorbeeld bij gedaan.

Jeroen
 

Bijlagen

Laatst bewerkt:
Hoi Hondel,

Is het niet veel eenvoudiger om altijd het maximale aantal grote verpakkingen te bereken en dit eventueel aan te vullen met een kleine verpakking?

Dan heb je in ieder geval de beste prijs.

Groet, Karel
 
In het voorbeeld heb ik voor het gemak 6 en 10 stuks gebruikt maar in werkeenheid gaat het om grotere verschillen. Bijvoorbeeld 12 en 160 stuks. Dan gaat het ook nog over een pak melk die tegenwoordig al 8 dagen houdbaar is maar de klanten willen het liefst dat pak verse melk die 10 dagen houdbaar is. Daarom is het belangrijk zo pressies mogelijk te bestellen en te zorgen dat je voorraad van de vorige dag bijna op is als de nieuwe vracht binnen komt.

Groeten, Jeroen
 
Ik heb onderstaande macro geschreven achter het voorbeeld blad dat je mee stuurde met je vraag.
Ik ben er van uitgegaan dat “Nodig” het aantal is dat je minimal wil bestellen en te bestellen het aantal is dat uiteindelijk geleverd wordt in de omverpakkingen.

Ik heb een opzet gemaakt waarin gekeken wordt hoeveel grote verpakkingen er maximaal nodig zouden zijn om het gewenste aantal te bestellen.
Dit aantal wordt steeds met een verminderd en aangevuld met het dan nog benodigde kleine verpakkingen.
Bij elke nieuwe vergelijking wordt gekeken of dit een beter resultaat geeft dan de vorige.
Als dit zo is worden de vorige gegevens vervangen door de “betere”

Het is wat complexer geworden dan gehoopt maar volgens mij geeft het wel het resultaat dat jij zoekt.

Kan je hiermee uit de voeten?

Karel
Code:
Sub verpakkingen()

Dim KleineDoos, GroteDoos, AantalKleineDoos, AantalGroteDoos
Dim AantalKleineDoosT, AantalGroteDoosT, VerschilT
Dim AantalNodig, AantalBestellen, Verschil

'********************************************************
'alleen even om te zien wat er gebeurt, kan gewist worden
Columns("H:J").ClearContents
a = 2
'********************************************************

KleineDoos = Cells(2, 3)
GroteDoos = Cells(3, 3)
AantalNodig = Cells(5, 3)

Verschil = 1000000

'maak een lus die begint bij het maximale aantal grote ver pakkingen tot nul grote verpakkingen
For AantalGroteDoosT = Round(AantalNodig / GroteDoos, 0) + 1 To 0 Step -1
    AantalKleineDoosT = -1
    'ga dan per keer kijken hoeveel kleine verpakkinen er nodig zijn om het gewenste aantal te krijgen
    Do
        AantalKleineDoosT = AantalKleineDoosT + 1
        AantalBestellen = (AantalGroteDoosT * GroteDoos) + (AantalKleineDoosT * KleineDoos)
    Loop Until AantalBestellen >= AantalNodig
    
    VerschilT = AantalBestellen - AantalNodig
    'als het verschil kleiner is dan de vorige berekeningen, onthouw dan de nieuwe gegevens
    If VerschilT < Verschil Then
        Verschil = VerschilT
        AantalGroteDoos = AantalGroteDoosT
        AantalKleineDoos = AantalKleineDoosT
    End If
    '********************************************************
    'alleen even om te zien wat er gebeurt, kan gewist worden
    Cells(2, 8) = "aantal bestellen"
    Cells(2, 9) = "grote dozen"
    Cells(2, 10) = "kleine dozen"
    
    a = a + 1
    Cells(a, 8) = AantalBestellen
    Cells(a, 9) = AantalGroteDoosT
    Cells(a, 10) = AantalKleineDoosT
    '********************************************************
    
Next AantalGroteDoosT

AantalBestellen = (AantalGroteDoos * GroteDoos) + (AantalKleineDoos * KleineDoos)
Cells(7, 3) = AantalBestellen
Cells(10, 3) = AantalGroteDoos
Cells(9, 3) = AantalKleineDoos

End Sub
 
of
Code:
Private Sub Nodig_Click()
    [C10] = [C7] \ [C3]
    [C9] = ([C7] Mod [C3]) \ [C2]
    If ([C7] Mod [C3]) Mod [C2] > 0 Then [C9] = [C9] + 1
End Sub
 
Volgens mij is het niet de bedoeling dat ik nu reageer maar ben nu toch benieuwd :

Allereerst mijn compliment voor de ode aan eenvoud in iedere reactie die ik van jou tegen kom op dit forum SNB, GEWELDIG!

Toch is het zo dat de formule die je hier gebruikt volgens mij altijd de grootste hoeveelheid “grote dozen” gebruikt.
Dat is niet altijd de meest passende combinatie van beschikbare verpakkingen.
Voorbeeld 12 = 2X6 beter dan 10 + 6
Kan dit ook met jou oplossing ook anders?

Karel
 
@Karel 2

Dank voor je compliment.

Is dit 'beter' ?
Code:
Private Sub Nodig_Click()
  q0 = [C7] Mod [C3]
  For j = [C7] \ [C3] To 1 Step -1
    If ([C7] - j * [C3]) Mod [C2] < q0 Then
      q0 = ([C7] - j * [C3]) Mod [C2]
      [C10] = j
    End If
  Next
  [C9] = ([C7] - ([C10] * [C3])) \ [C2] + IIf(([C7] - ([C10] * [C3])) Mod [C2] > 0, 1, 0)
End Sub
 
Laatst bewerkt:
Ben je even een nacht in een hotel, wordt mijn vraag gelijk over genomen door Karel2. :thumb:

In het hotel was geen internet maar ik had wel de laptop bij dus ben in de late uurtjes nog eens aan het puzzelen geweest.
Het ziet er niet echt professioneel uit en het zal de macro ook niet echt sneller maken maar volgens mijn werkt het.
Dit is wat ik heb:
Code:
Klein = [C2]
Groot = [C3]
Stuks = [C5] - 1

Do
  Stuks = Stuks + 1
  Aantal = (Application.Ceiling(Stuks + 1, Groot) / Groot)
  Do
    Aantal = Aantal - 1
    Rest = Stuks - (Aantal * Groot)
  Loop While Aantal > 0 And Application.Floor(Rest, Klein) <> Rest
Loop While Application.Floor(Rest, Klein) <> Rest
[C7] = Stuks
P.s.

En waarom heeft niemand mijn verteld dat je ook "[C3]" kan gebruiken in plaats van "Cells(3,3)" of nog langer "Range("C3")"
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan