4.7k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo Leute,

habe das Problem bei Office-Lösung.de gepostet, aber noch keine Antwort erhalten.

Haben in der Fachoberschule eine Aufgabe zu Excel oder VBA bekommen, und ich bin da noch nicht soooo fit drin. Wenn mir einer helfen könnte, Ansätze wären auch großartig...das wäre supi!!!!

Aufgabe:

Konditorei "Meier-Schulze" hat 7 gleiche Öfen. An einem Tag (betrachtete Periode) werden 10 Artikel gebacken (10 Verschiedene Kuchen). Die Backzeiten für die Artikel sind:

Artikel 1: 40 min.
Artikel 2: 40 min.
Artikel 3: 40 min.
Artikel 4: 50 min.
Artikel 5: 50 min.
Artikel 6: 60 min.
Artikel 7: 60 min.
Artikel 8: 60 min.
Artikel 9: 100 min.
Artikel 10: 100 min.

Die Öfen sollen möglichst gleichmäßig und "automatisch" mit den Artikeln belegt werden (Die 7 Öfen in einem Diagramm und die Zeiten als Balken darstellen)! Maximale Kapazitätsauslastung ist erwünscht.

Habe es mit Excel versucht...komme auf keinen grünen Zweig...in VBA sind meine Fähigkeiten nicht ausreichend...muss da eventuell eine Schleife rein???

Danke im Voraus!!!!!

21 Antworten

0 Punkte
Beantwortet von
Hi Little T,

den Code kann ich jetzt sehen...nur (ja, blöde Frage im Anmarsch :-) ) ...schaffe es nicht den so umzubasteln dass die gewünschte Darstellung "automatisch" von statten geht....
0 Punkte
Beantwortet von
Hallo Julie1985

blöde Fragen gibt es nicht.
Ich versteh jetzt aber gerade nicht was du genau machen willst. Wenn du den Code hast dann passt es doch. Wenn er verändert werden soll dann hast du beim Aufzeichnen des Makros schon eine falsche Sortierreihenfolge angegeben.

Gruß
LittleT
0 Punkte
Beantwortet von
Hi Little T,

bekomme die Formatierung :

Spalte 1 Spalte 2 Spalte 3
Ofen1 100
Ofen2 100
Ofen3 60 u.s.w
Ofen4 60 15
Ofen5 50 20
Ofen6 50 40
Ofen7 40 40


nicht hin... :-( ...habe bestimmt irgendwo einen Denkfehler...
0 Punkte
Beantwortet von
Hi,
deine Lösung sollte vorrangig mathematischer Natur sein, da die Längste Backzeit 100Min beträgt kann also alles getrost auf 100 Minuten ausgelegt werden. Die Paarungen sollte also
100
100
50 + 50
40 + 60
40 + 60
40 + 60
lauten. So sind zwar nur 6 Öfen ausgelastet aber es ist alles nach 100 Minuten gebacken. Dass ich die 40 Minutenteile nach vorne gelegt habe unterliegt rein pragmatischen Gründen, so sind die ersten Teile schon nach 40 Minuten fertig.
Wie das in VBA aussehen sollte kann ich dir nicht sagen (k.A. davon), aber prinzipiell müsste es so aussehen dass dass die 7 längsten Zeiten am Anfang stehen, danach werden die nächsten Zeiten absteigend derart zusortiert dass die Differenz zur längsten Backzeit minimal ist. Würde das Programm nun die Öfen nacheinander "auffüllen" wäre das Ergebnis sicher identisch mit dem obigen Vorschlag (also den 7. Ofen auslassen).

Gruß Gonozal
0 Punkte
Beantwortet von
Hi Gogozal,

das klingt auch einleutend...nur das in VBA umzusetzen ist für mich schwierig...sehr gut finde ich auch:
In Prinzip könntest du dir eine Funktion schreiben welche dir jetzt nach jedem mal addieren im Array das Array umsortiert. Dann hättest du immer den niedrigsten Wert im Array und zu dem Wert die nächste Stelle addiert. Das wäre denke ich das Optimum.
von Little T.....

Beides gute Ansätze...Danke!
0 Punkte
Beantwortet von
@ Little T,

letzte Frage....


Sollten es mehr Werte in Spalte B werden (Beispiel noch 3x 20 Minuten) So würden die letzten 20 Minuten auf den ofen mit bereits 100 Minuten gebucht, obwohl noch ein ofen mit 80 Minuten frei wäre.

Ergebnis wäre dann folgendes:
Ofen1= 100
Ofen2 =120
Ofen3= 80
Ofen4= 80
Ofen5=100
Ofen6=90
Ofen7=90


Wie erweitere ich den Code um x weitere Artikel anstatt für 3 weitere Artikel a 20 min.für die 7 Öfen?
0 Punkte
Beantwortet von
Hallo,

du müsstest die zweite for Schleife umprogrammieren und zu einer while schleife machen


For k = anzahl_ofen - 1 To 0 Step -1
wert = Worksheets("Tabelle1").Cells(ersteStelle, 2).Value
ofen(k) = ofen(k) + wert
ersteStelle = ersteStelle + 1
Next k


das heißt solange ersteStelle nicht leer ist solange kannst du zu dem array addieren. Allerdings musst du für das Array die Funktion schreiben welches dir das Array richtig sortiert.

Hierfür würde ich dir den einfachsten Algorithmus vorschlagen. Such mal nach Bubble Sort. Da gibts in fast jeder Sprache einen Beispielcode.

Gruß
LittleT
0 Punkte
Beantwortet von
Hi Litte T,

habe mir deinen Code genau angeguckt und hab's anders (den Code etwas variiert) gelöst: Vielen Lieben Dank nochmal für deine Hilfe!!!!

For j = 0 To anzahl_ofen - 1
wert = Worksheets("Tabelle2").Cells(ersteStelle, 2).Value
ofen(j) = wert
ersteStelle = ersteStelle + 1
Next j

For k = anzahl_ofen - 1 To 0 Step -1
wert = Worksheets("Tabelle2").Cells(ersteStelle, 2).Value
ofen(k) = ofen(k) + wert
ersteStelle = ersteStelle + 1
Next k

For l = 0 To anzahl_ofen - 1
wert = Worksheets("Tabelle2").Cells(ersteStelle, 2).Value
ofen(l) = wert + ofen(l)
ersteStelle = ersteStelle + 1
Next l

For m = anzahl_ofen - 1 To 0 Step -1
wert = Worksheets("Tabelle2").Cells(ersteStelle, 2).Value
ofen(m) = ofen(m) + wert
ersteStelle = ersteStelle + 1
Next m

For n = 0 To anzahl_ofen - 1
wert = Worksheets("Tabelle2").Cells(ersteStelle, 2).Value
ofen(n) = wert + ofen(n)
ersteStelle = ersteStelle + 1
Next n

For p = anzahl_ofen - 1 To 0 Step -1
wert = Worksheets("Tabelle2").Cells(ersteStelle, 2).Value
ofen(p) = ofen(p) + wert
ersteStelle = ersteStelle + 1
Next p

For i = 1 To 16
Worksheets("Tabelle2").Cells(i, 4) = ofen(i - 1)
Next i



End Sub

Private Sub CommandButton2_Click()
Unload Me

End Sub
0 Punkte
Beantwortet von
Hallo,

weiß gerade nicht wie ich schauen soll...
:-)
:-(

Code kopieren ist doch keine Lösung, vor allem nicht wenn es immer der gleiche ist.

Ich habs jetzt mal schnell programmiert. Den BubbleSort hab ich über google gefunden:
http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Bubblesort
">
http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Bubblesort

war der erste Eintrag :-)

Damit hat sich der Quelltext nicht wirklich groß verändert.

Private Sub CommandButton1_Click()

'coded von LittleT

'Hauptsache das ganze ist mal sortiert
Columns("A:B").Select
Selection.Sort Key1:=Range("B1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

'Anzahl der Öfen: 7
anzahl_ofen = 7
'Das Array ist 1 weniger weil wir hier schon bei 0 beginnen
Dim ofen(6) As Variant

ersteStelle = 1

'die erste schleife passt immer (gefüllt mit 7 Werten)
For j = 0 To anzahl_ofen - 1
wert = Worksheets("Tabelle1").Cells(ersteStelle, 2).Value
ofen(j) = wert
ersteStelle = ersteStelle + 1
Next j


'hier überprüfen wir ob wir noch einen neuen Artikel zum backen haben
Do While Worksheets("Tabelle1").Cells(ersteStelle, 2).Value <> ""
'Aufruf der funktion die uns unser Array sortiert
BubbleSort ofen, True
wert = Worksheets("Tabelle1").Cells(ersteStelle, 2).Value
'nachdem nun unser Array sortiert ist wissen wir dass bei ofen an
'der Stelle 0 immer unser kleinster Wert ist
ofen(0) = ofen(0) + wert
ersteStelle = ersteStelle + 1
Loop

'ausgabe
For I = 1 To 7
Worksheets("Tabelle1").Cells(I, 4) = ofen(I - 1)
Next I


End Sub


'funktion über google gefunden (erster Treffer)
Public Function BubbleSort(vArray As Variant, _
Optional Ascending As Boolean = True)
'
' Ascending = True: aufsteigend sortieren
'
If Not IsArray(vArray) Then Exit Function
Dim Mark As Long, I As Long, EndIdx As Long, StartIdx As Long
Dim Temp As Variant

EndIdx = UBound(vArray)
StartIdx = LBound(vArray)
Do While EndIdx > StartIdx
Mark = StartIdx
For I = StartIdx To EndIdx - 1
If vArray(I) > vArray(I + 1) Eqv Ascending Then
Temp = vArray(I)
vArray(I) = vArray(I + 1)
vArray(I + 1) = Temp
Mark = I
End If
Next I
EndIdx = Mark
Loop
End Function





Viel Spass damit.

Gruß
LittleT

PS
Das war jetzt mehr als ein Tipp bzw. Denkanstoss wie zu anfangs von dir geschrieben.
0 Punkte
Beantwortet von
Hallo,

:-O
änder doch bitte noch bei der Ausgabe

'ausgabe
For I = 1 To 7
Worksheets("Tabelle1").Cells(I, 4) = ofen(I - 1)
Next I

die for schleife

'ausgabe
For I = 1 To anzahl_ofen
Worksheets("Tabelle1").Cells(I, 4) = ofen(I - 1)
Next I


hab ich ganz vergessen.

Gruß
LittleT
...