Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1528to1532
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Produktionsplanung_Rüstmatrix 2

Produktionsplanung_Rüstmatrix 2
07.12.2016 11:58:19
Major
Hallo zusammen,
sorry das Thema hatte ich schon einmal, war aber dann verhindert und nun greife ich es nochmal auf. Anbei die Datei von Michael.
https://www.herber.de/bbs/user/109903.xlsm
Das was ich beschrieben habe, hat Michael optimal umgesetzt. Vielen Dank dafür.
Jedoch hatte ich ein paar wenige dinge nicht bedacht. Nämlich Faktoren, die auch ein Makro nicht mehr wissen kann.
Hat man die Berechnung der Umrüstung aktiviert und schaut sich das Ergebnis unter Tabelle 3 an, so fällt einem auf, dass es hier Minusbeträge gibt. Also natürlich total praxisfern. Von der Berechnung her aber korrekt.
Es gibt 1-2 Fälle bei denen das Makro einfach nicht wissen kann, was rüste ich zuerst um, was danach. Das ganze muss flexibler sein und ohne gewisse manuelle Eingriffe des Planers wird es nicht funktioneren.
Habt ihr eine Idee wie man so benutzerfreundlich wie möglich noch einbauen könnte bei welcher Produtkion eine Umrüstung berücksichtigt werden soll und wo nicht?
Danke schon mal!
Gruss Major

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Produktionsplanung_Rüstmatrix 2
07.12.2016 13:21:45
Michael
Hi Major,
ich habe hier mal alle Daten für eine MsgBox zusammengesucht:
For s = 3 To UBound(aq, 2)
For z = 3 To UBound(aq)
If aq(z, s)  "" Then
If z = l Then
az(z - 2, s - 2) = aq(z, s)
Else
w = r(z - 1, l) * r(z - 1, 2) ' jetz z-1, weil r nur 1 Überschriftenzeile hat
' hier evtl. InputBox für händische Wertänderung
MsgBox "Produktionswert              " & aq(z, s) & vbLf & _
"Rüstzeit " & r(l - 1, 1) & "  " & r(z - 1, 1) & " = " & r(z - 1, l) & _
" * " & r(z - 1, 2) & " = " & w & vbLf & "Rest (Differenz) " & aq(z, s) - w
' und Einfügen des ggf. händisch geänderten Wertes nachfolgend mit If..Then...
az(z - 2, s - 2) = aq(z, s) - w  ' oder halt = WertInputBox
l = z
End If
End If
Next
Next

Hier kannst Du evtl. eine Inputbox einbauen, bei der der Anwender einen Wert ändern kann.
Die grundsätzliche Logik erschließt sich mir aber nicht: wenn das Makro im Prinzip richtig rechnet,dann wären eigentlich nur die Zeiten in der Rüstmatrix "praxisnäher" zu gestalten. Abgesehen davon fehlt mir gedanklich eine "Verschiebung" der wegen Umrüstung eben nicht ausgeführten Zahlen: wo und wie werden die erfaßt?
Schöne Grüße,
Michael
Anzeige
AW: Produktionsplanung_Rüstmatrix 2
07.12.2016 16:49:23
Major
Hi Michael,
du hast recht. Die Rüstmatrix würde wohl weniger Schwierigkeiten machen, wenn die Reihenhfolge der Artikel pro Tag schon in der Matrix definiert wäre. Die Zahlen für die Matrix werden aber per Formel (sucht nacht Artikel und Tag per Index und Vergleich)aus einem grösseren Tabellenblatt gezogen. Dort direkt die Reihenfolge festzulegen ist nicht möglich wegen den Faktoren Übersichtlichkeit und Benutzerfreundlichkeit, die mir am Wichtigsten sind.
Die wegen Umrüstung nicht aufgeführten Zahlen werden nirgendwo mehr erfasst.
Ich glaube hier muss ich aussteigen, ich habe keinen Schimmer wie ich die Msgbox mit Fragen und Antworten erstelle.
Danke trotzdem, Gruss Major
Anzeige
AW: Produktionsplanung_Rüstmatrix 2
07.12.2016 18:43:16
Michael
Hi,
mit einer weiteren Variablen und Inputbox:
Sub ruestzeit()
Const ArtiQuell = "A4", ArtiZiel = "A4", Ruest = "B4", az_Ziel = "C6"
'hier jeweils die linke, obere Ecke der Bereiche mit Daten
Const shQuell = "Tabelle1", shRuest = "Tabelle2", shZiel = "Tabelle3"
' hier die Namen der Blätter ändern, falls sie umbenannt werden...
Dim aq, az, r
Dim s&, z&, w#, l&
Dim letzter As Range
Dim IBerg$   ' InputBoxErgebnis as string
' statt l = 3
On Error Resume Next
Set letzter = Application.InputBox("Was wurde zuletzt hergestellt?", "Artikel anklicken", Type:= _
8)
On Error GoTo 0
If letzter Is Nothing Then Exit Sub ' falls abgebrochen wurde
If letzter.Count > 1 Then MsgBox ("Bitte nur 1 Zelle wählen"): Exit Sub
' letzter hat jetzt den Datentyp "range"
' wir benötigen die Nr. der Zeile innerhalb des Arrays r, das unten eingelesen wird.
' das ist, weil die Rüstmatrix nur noch eine Zeile Überschrift enthält, eines weniger
' als im Produktionsplan alt
' Der Produktionsplan alt beginnt wie oben definiert bei ArtiQuell = "A4"
l = letzter.Row - Range(ArtiQuell).Row + 1
MsgBox l ' die kannste dann wieder löschen
Sheets(shZiel).Cells.Clear ' alles löschen, falls mehr Zeilen vorhanden als beim
'neuen Kopieren
Sheets(shQuell).Range(ArtiQuell).CurrentRegion.Copy Sheets(shZiel).Range(ArtiZiel)
' dabei wird das NEU in Produktionsplan überschrieben; wenn Du willst, kannst Du
' das wieder einfügen:
Sheets(shZiel).Range(ArtiZiel).Value = "Produktionsplan NEU"
aq = Sheets(shQuell).Range(ArtiQuell).CurrentRegion
r = Sheets(shRuest).Range(Ruest).CurrentRegion
' Plausibilitätstest Anfang ****
MsgBox "Das ist der gewählte Artikel: " & r(l - 1, 1) ' ist ok, kannst auch löschen
Sheets(shZiel).Range("C2").Value = "Vorhergehende Produktion: " & r(l - 1, 1)
'aber es ist doch ganz nützlich, wenn das in der Tabelle3 steht
'Man könnte diese Ausgabe noch abhängig machen vom Werte in ArtiZiel = "A4"
If UBound(aq)  UBound(r) + 1 Then MsgBox "Zeilen passen nicht": Exit Sub
' in Deiner ersten Datei hatte die Rüstmatrix ZWEI Zeilen Überschriften,
' in der neuen nur noch eine - macht nichts, aber deshalb das +1
If UBound(aq)  UBound(r, 2) Then MsgBox "Zeilen  Überschrift RM": Exit Sub
' jetzt werden die Artikel (A, B...) im Pp Alt mit den Überschriften der Rüstmatrix
' verglichen
For z = 3 To UBound(aq)
If aq(z, 1)  r(z - 1, 1) Or aq(z, 1)  r(1, z) Then MsgBox "paßt nicht": Exit Sub
' hier erfolgen beide Prüfungen nach Übereinstimmung in einem Rutsch mit "Or"
Next
' Plausibilitätstest Ende ****
ReDim az(1 To UBound(aq) - 2, 1 To UBound(aq, 2) - 2)
For s = 3 To UBound(aq, 2)
For z = 3 To UBound(aq)
If aq(z, s)  "" Then
If z = l Then
az(z - 2, s - 2) = aq(z, s)
Else
w = r(z - 1, l) * r(z - 1, 2) ' jetz z-1, weil r nur 1 Überschriftenzeile hat
IBerg = InputBox("Produktionswert              " & aq(z, s) & vbLf & _
"Rüstzeit " & r(l - 1, 1) & "  " & r(z - 1, 1) & " = " & r(z - 1, l) & " *  _
" _
& r(z - 1, 2) & " = " & w & vbLf & "Rest (Differenz) = " & aq(z, s) - w, _
Default:=CStr(aq(z, s) - w))
If IBerg = "" Then az(z - 2, s - 2) = aq(z, s) - w Else az(z - 2, s - 2) = Val(IBerg) _
l = z
End If
End If
Next
Next
Sheets(shZiel).Range(az_Ziel).Resize(UBound(az), UBound(az, 2)) = az
End Sub

Man könnte das noch mit einem If garnieren, so daß die Input-Box nur dann erscheint, wenn ein Wert kleiner 0 (oder irgendwas) erscheint.
Schöne Grüße,
Michael
P.S.: Der sinnvollere Weg wäre wahrscheinlich, die "große" Tabelle statt mit Formeln mit einem vernünftigen VBA-Skript auszuwerten. Aber das artet in einen Programmierauftrag aus...
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige