5.4k Aufrufe
Gefragt in Tabellenkalkulation von
Ich habe folgendes Problem:
Excel 2007

Ich kriege täglich bestimmte Werte, z.B.:

1387
1297
1366
1357
1578
usw.

das sind Gewichte die Gewichte von Säcken in kg


Jetzt kriege ich einen Auftrag von z.b. 23500 kg.

Jetzt wollte ich eine Formel oder Makro, was mir aus den vielen Werte (können durchaus schon 60 - 70 Gewichte sein) jene raussucht, bis das bestimmte Gewicht erreicht ist (z. B. 23500 kg; muss aber nicht exakt sein nur möglichst nah dran)

Der reihenfolge nach aufaddieren funktioniert zwar, doch komme ich wenn ich die Gewichte einzelnd raussuche meißt noch näher an das Vorgegebene Gewicht ran. Und das soll excel für mich machen. Ich habe keine Lust einzelnd mit dem Taschenrechner zusammenzupuzzeln.

Und diese Gewichte die dann addiert worden sind müssen auch irgendwie markiert sein.
Ich hoffe ihr versteht was ich meine....
Gibt es da irgendeine Lösung?

Vielen Dank im Voraus.

9 Antworten

0 Punkte
Beantwortet von
Hallo thommy-s,

hinter Deiner Frage verbirgt sich ein (mathematisches) Optimierungsproblem, das sich - weder mit Bleistift, Papier und gesundem Menschenverstand noch mit der Rechenhilfe names Excel - so leicht lösen lässt, wie es vielleicht auf den ersten Blick scheint.

Mit Deinen konkreten Beispielzahlen ergibt sich bei einem Durchschnittsgewicht von rund 1400 kg, dass ca. 17 Säcke benötigt werden und aus den vorhandenen 60 bis 70 Säcken optimal ausgesucht werden müssten.

Mathematisch ist das eine Kombination ohne Zurücklegen. Bei n vorhandenen Säcken und k auszuwählenden gibt es "n über k" verschiedene Auswahlmöglichkeiten. ("n über k" = n! / [k! * (n - k)!]) Mit n = 65 und k = 17 ist das schon eine sehr, sehr große Zahl, aber damit ist es ja nicht getan, denn man muss ja nicht unbedingt genau 17 Säcke auswählen. Mit ein, zwei, drei Säcken mehr oder weniger - je nach Gewicht - kriegt man vielleicht ein noch besseres Ergebnis.

Also müsstest Du oder Deine Rechenhilfe, wenn Du wirklich die optimale Lösung suchst, für k = 14, 15, 16, ..., 20 alle möglichen Kombinationen bilden, was nicht ganz leicht werden dürfte.

Mit anderen Worten: So geht es wahrscheinlich nicht.

Leider kann man daraus nicht ableiten, wie es denn nun geht, aber ich denke man wird eine Menge Optimierung aus dem Lösungsansatz herausnehmen müssen und stattdessen mehr "Menschenverstand", etwas Heuristig, etwas zulässige Abweichung hinzufügen und in Kauf nehmen müssen, dass man mit vertretbarem Aufwand keine "optimale Lösung" im Sinne der Mathematik bekommt, sondern (hoffentlich) eine Lösung, mit der man praktisch leben kann.

MfG Charlotte
0 Punkte
Beantwortet von
Hallo,

noch 'n kleines Beispiel zu Kombinationen ohne Zurücklegen mit n = 49 und k = 6: "49 über 6" = 49! / [6! * 43!] = 13.983.816

Wenn aus 49 Objekten 6 ohne Zurücklegen und ohne Beachtung der Reihenfolge ausgewählt werden sollen, wie dies zum Beispiel bei der Ziehung der Lottozahlen der Fall ist, so gibt es 13.983.816 mögliche Auswahlen.

Und nur eine davon ist der Sechser (= die optimale Lösung).

MfG Charlotte
0 Punkte
Beantwortet von
hab ich mir schon gedacht, dass das nicht so einfach ist. War auch nur eine Idee das maschinell machen zu lassen. Schade....
0 Punkte
Beantwortet von
Hallo thommy-s,

ich habe mal versucht, einen intuitiven Lösungsansatz zu entwickeln und mit Formeln zu realisieren. Eigentlich wird nur versucht, eine möglichst gute erste Auswahl zu treffen, um möglichst dicht an die geforderte Menge heran zu kommen. Anschließend könnte man sich aus einer Tabelle evtl. einzelne Säcke heraussuchen, die man tauscht, um das Ergebnis weiter zu verbessern.

Mit VBA ginge an dieser Stelle die Rechnerei "erst richtig los", aber vorher wollte ich mal fragen, was Du von dem Ansatz hältst und ob Dich der Versuch noch interessiert.

Die Formeln, Formatierungen usw. sind vorerst auf maximal 100 vorhandene Säcke, davon maximal 40 für eine Ladung auszuwählende Säcke ausgelegt. Tabelle2 dient zum Erstellen von Testdaten - bitte sinnvoll verwenden. Weitere Erläuterungen auf Wunsch.

www.file-upload.net/download-2033974/Ladung_S-cke.xls.html

MfG Charlotte
0 Punkte
Beantwortet von
Hallo allerseits,

da sind leider noch ein paar kleine Fehler drin, um die kümmere ich mich dann morgen früh.

Bis dann !
MfG Charlotte
0 Punkte
Beantwortet von
Hallo allerseits,

hier ist erstmal die korrigierte Datei:
www.file-upload.net/download-2035687/Ladung_Saecke.xls.html

Außer dass zwei Formeln nicht ganz bis nach unten gezogen waren, habe ich noch einen ernsthaften Fehler festgestellt:

Mein Excel2003 zeichnet den Sortierbefehl so auf:

Selection.Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal


Excel2000 kennt aber scheinbar den letzten Parameter DataOption1:=xlSortNormal nicht und steigt dann auch prompt mit Fehlermeldung "1004 ..." aus.
Ohne diesen Parameter funktioniert's in beiden Versionen, wobei ich z. Zt. keinen Zugriff auf Excel2000 habe und dazu nichts weiter beitragen kann, außer die Erklärung der VBA-Hilfe von Excel2003:

DataOption1: Optionaler XlSortDataOption-Wert. Gibt an, wie der Text in Schlüssel 1 sortiert werden soll. Kann nicht zum Sortieren von PivotTable-Berichten verwendet werden.
XlSortDataOption kann eine der folgenden XlSortDataOption-Konstanten sein:
xlSortTextAsNumbers. Text für die Sortierung als numerische Daten behandeln.
xlSortNormal Standard. Sortiert numerische Daten und Textdaten getrennt.

MfG Charlotte
0 Punkte
Beantwortet von
Da bin ich wieder,

erstmal danke für die Mühe. Ich werde es mir mal anschauen und dann ein Statemant abgeben. Trotzdem vielen Dank für die Hilfe.
0 Punkte
Beantwortet von
Hallo nochmal.

Das sieht doch schon super aus. Danke dir.

Falls es für die Berechnung von Bedeutung ist.... Aus Erfahrung werden das nicht mehr als 20 Säcke.

Als zweiten Punkt habe ich festgestellt das nur in der Liste zusammenhängende Werte genommen werden. Soll heißen, wenn ich eine andere Reihenfolge eingebe, kriege ich einen anderes Ergebnis.

Als dritten Punkt habe ich, wenn es weniger als das gegebene Gewicht ist , ist es nicht so schlimm, es darf aber keine Gewichtsüberschreitung von mehr als 100 kg geben, da ja noch Tara hinzukommt und der LKW im Endeffekt eine Maximalladung hat.

Gruß Thommy-s
0 Punkte
Beantwortet von
Hallo Thommy-s,

es passt bei mir jetzt /heute abend gerade nicht, ich melde mich morgen früh wieder. Fragen, Probleme, Anmerkungen kannst Du bis dahin schon mal aufschreiben ...

Noch kurz zum "zweiten Punkt": Mein Ansatz beruht darauf, dass die vorhandenen Säcke in aufsteigender Reihenfolge sortiert im Bereich B11:B110 (= maximal 100 Säcke) bereitgestellt werden - diese Bereitstellung wird auch von den Testdaten in Tabelle2 gewährleistet - und dann werden in der ausgeblendeten Spalte C die gleitenden Teilsummen aus jeweils k Säcken berechnet.

Das k ergibt sich gerundet aus der Sollmenge der Ladung und dem Durchschnittsgewicht aller Säcke (und kann natürlich bei jeder Bestellung anders sein). Aber alle gleitenden Teilsummen in C haben natürlich auch aufsteigende Werte. Aus diesen wird dann derjenige ausgesucht, der dem Soll am nächsten kommt und die Säcke, die für diese Teilsumme nötig sind, werden ausgewählt und (blau) makiert. Damit liegt man dann, nachmeinem bisherigen Ansatz, mehr oder weniger drüber oder drunter - was natürlich von den zufälligen Gegebenheiten (Gewicht der Säcke, Bestellmenge) abhängt.

(Hier kann man ansetzen, dass zukünftig das bestmögliche "kleiner-gleich", aber niemals ein "größer als" ausgewählt wird.)

Der nächste Schritt ergibt sich dann aus der Tabelle, die - in Abhängigkeit "von den zufälligen Gegebenheiten" und von der Wahl der Tolereanz eine oder mehrere optimale oder günstige Tauschmöglichkeiten anbieten. Und zwar nach der Methode: wenn noch Gewicht fehlt, einen leichteren Sack aus der Ladung rausnehmen und einen etwas schwereren Sack hineinnehmen und dadurch näher an das Soll (oder ein klein wenig darüber hinaus?) kommen. Wenn schon zuviel Gewicht vorhanden, dann nach demselben Prinzizp, nur umgekehrt.

So, na dann noch einen schönen Abend
und bis morgen!
Charlotte
...