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.