Tipp 11.8 - Optimale Bestellmenge
Wie kann ich die optimale Bestellmenge errechnen?
Bestellungen sollten am Besten immer in einer möglichst ökonomischen Menge, in der so genannten optimalen Bestellmenge, geordert werden. Dazu rechnet man in der Betriebswirtschaft mit der Andlerschen Formel, die folgende Einflussgrößen berücksichtigt:
- Jahresbedarf = M
- konstante Bestellkosten = Bk
- Einstandspreis = p
- Zins- und Lagerkostensatz = q
Die Formel lautet:
Optimale Bestellmenge xm = Wurzel(2 x M x BK / p * q)
Beispiel: Der Jahresbedarf eines Materials liegt bei 2.000 Stück. Die konstanten Kosten betragen 40 €, der Einstandspreis liegt bei 6 €, der Zins bei 4,5 % und der Lagerkostensatz bei 5,5 %.
Frage: Wie hoch ist die optimale Bestellmenge?
Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.
Beispiel:
'Berechnet die optimale Bestellmenge Public Function OptimumQuantity(pcM As Currency, _ pcBk As Currency, _ pcP As Currency, _ pdbQ As Double, _ Optional pbRound As Boolean = False) _ As Currency '// ===================================================== '// Methode | Berechnet die optimale Bestellmenge '// ----------------------------------------------------- '// Parameter | pcM - Jahresbedarf ' pcBk - konstante Bestellkosten ' pcP - Einstandspreis ' pdbQ - Zins- und Lagerkostensatz ' zusammengefasst ' pbRound - Optional auf glatte Hundert ' auf-/abrunden ja / nein '// ----------------------------------------------------- '// Rückgabe | Currency - optimale Bestellmenge '// ----------------------------------------------------- '// Erstellt | Manuela Kulpa '// | EDV Innovation & Consulting - Dormagen '// ----------------------------------------------------- '// Beispielaufruf: '// ?OptimumQuantity(2000,40,6,0.1,False) '// ===================================================== Dim curXm As Currency On Error GoTo OptimumQuantity_Err curXm = Sqr((2& * pcM * pcBk) / (pcP * pdbQ)) If pbRound = True Then curXm = XLSRound(curXm, -2) End If OptimumQuantity = curXm OptimumQuantity_Exit: Exit Function OptimumQuantity_Err: MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modFinancial.OptimumQuantity" Resume OptimumQuantity_Exit End Function Public Sub TestOptimumQuantity() Dim cM As Currency Dim cBk As Currency Dim cP As Currency Dim dbQ As Double Dim sMsg As String Dim sFormat As String cM = 2000 cBk = 40 cP = 6 dbQ = 0.045 + 0.055 sFormat = "###,##0.00" ' Ausgabe der Informationen sMsg = "Beispielrechnung optimale Bestellmenge" & vbCrLf sMsg = sMsg & String$(45, "=") & vbCrLf sMsg = sMsg & "Jahresbedarf: " & Format$(cM, sFormat) & vbCrLf sMsg = sMsg & "konstante Bestellkosten: " & Format$(cBk, sFormat) & vbCrLf sMsg = sMsg & "Einstandspreis: " & Format$(cP, sFormat) & vbCrLf sMsg = sMsg & "Zins-/Lagerkostensatz: " & Format$(dbQ, "0%") & vbCrLf sMsg = sMsg & String$(45, "-") & vbCrLf sMsg = sMsg & "optimale Bestellmenge: " & Format$(OptimumQuantity(cM, cBk, cP, dbQ, False), sFormat) Debug.Print sMsg End Sub ' Simuliert die Excel-Runden-Funktion Public Function XLSRound(pvNumber As Variant, Optional piTyp As Integer = 2) As Double '// ===================================================== '// Methode | Rundet analog der Excel-Runden-Funktion '// Idee von | Konrad Marfurt+Luke Chung+Karl Donaubauer '// ----------------------------------------------------- '// Parameter | pvNumber - der Wert, der gerundet ' werden soll ' piTyp - Die Art, wie gerundet werden soll ' Standardmäßig auf 2 Stellen nach ' dem Komma '// ----------------------------------------------------- '// Rückgabe | Double - gerundeter Wert '// ----------------------------------------------------- '// Erstellt | Manuela Kulpa '// | EDV Innovation & Consulting - Dormagen '// ----------------------------------------------------- '// Beispielaufruf: '// ?XlsRound(368.8752) = 368,88 ' ?XlsRound(368.8752,1) = 368,9 ' ?XlsRound(368.8752,-1) = 370 ' ?XlsRound(368.8752,-2) = 400 '// ===================================================== On Error GoTo XlsRound_Err If IsNumeric(pvNumber) Then XLSRound = Fix("" & pvNumber * (10 ^ piTyp) + Sgn(pvNumber) * 0.5) / (10 ^ piTyp) End If XlsRound_Exit: On Error GoTo 0 Exit Function XlsRound_Err: MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modFinancial.XlsRound" Resume XlsRound_Exit End Function
Für das obige Beispiel ergibt sich die optimale Bestellmenge aus insgesamt 516,40 (abgerundet auf volle Hundert: 500) Stück.
Dieses Grundmodell der Beschaffungsplanung geht von diskontinuierlicher Lagerergänzung aus. Erfolgt der Zugang aber in mehreren Teilmengen, dann fallen geringere Lagerhaltungskosten an. Die optimale Bestellmenge wäre dann bei sonst gleich bleibenden Bedingungen höher. Andere Voraussetzungen liegen auch bei einem Bestell-Rhythmus-System vor.