Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1936to1940
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

Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen

Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:14:16
Ali
In der Matrix werden Spalten wie folgt aufgelistet:
A Warenempfänger
Spalte B Material
Spalte C die Hierarchie
Spalte D der Kundenname
Spalte E der Ort
Spalte F die Losgröße
Spalte G Priorisierung
die restlichen Spalten zeigen die Tage und die nivellierte Ablieferung pro Tag anhand einer Absatzplanung.
Da eine tägliche Ablieferung nicht Realisierbar ist, möchte ich, dass der Makro die täglichen Bedarfe in Losgrößen für eine "Versandplanung" zusammenfasst und einen Plan der Versandmengen an den jeweiligen Tagen erstellt. Sollten Priorisierungen vorhanden sein, werden diese entsprechend auch berücksichtigt. Das Layout sollte gleichbleiben.
Tagesmaximal 2.000 Stk.





Sub KonsolidiereUndPlaneProduktion()
Dim ws As Worksheet, wsNeu As Worksheet
Dim letzteZeile As Long, letzteSpalte As Long
Dim i As Long, j As Long
Dim täglicherBedarf As Double, gesamtBedarf As Double
Dim Losgröße As Double, tage As Long
Dim MaxTagesmenge As Double
Dim Prio As Boolean
Dim neueZeile As Long
Dim versandPlan As Collection
Dim arrData As Variant, arrHeader As Variant, arrOutput As Variant

Set ws = ThisWorkbook.Sheets("Tabelle1")
MaxTagesmenge = 2200

On Error Resume Next
Set wsNeu = ThisWorkbook.Sheets("Neue Matrix")
On Error GoTo 0
If wsNeu Is Nothing Then
Set wsNeu = ThisWorkbook.Sheets.Add(After:=ws)
wsNeu.Name = "Neue Matrix"
End If

Application.ScreenUpdating = False

letzteZeile = ws.Cells(Rows.Count, 1).End(xlUp).Row
letzteSpalte = ws.Cells(1, Columns.Count).End(xlToLeft).Column
arrData = ws.Range(ws.Cells(1, 1), ws.Cells(letzteZeile, letzteSpalte)).Value

arrHeader = ws.Range(ws.Cells(1, 1), ws.Cells(1, letzteSpalte)).Value

Set versandPlan = New Collection

For i = 2 To letzteZeile
täglicherBedarf = 0
For j = 8 To letzteSpalte
täglicherBedarf = täglicherBedarf + arrData(i, j)
Next j

Prio = arrData(i, 7)

If Not Prio Then
Losgröße = Application.WorksheetFunction.Min(MaxTagesmenge, täglicherBedarf)
tage = WorksheetFunction.Ceiling(täglicherBedarf / Losgröße, 1)
End If

For j = 8 To letzteSpalte
If arrData(i, j) > 0 Then
Dim MengenText As String
If Prio Then
MengenText = Application.WorksheetFunction.Min(arrData(i, j), MaxTagesmenge) & "/" & 1
Else
MengenText = Application.WorksheetFunction.Min(arrData(i, j), Losgröße) & "/" & tage
End If
versandPlan.Add Array(i, j, MengenText)
arrData(i, j) = arrData(i, j) - Val(Split(MengenText, "/")(0))
End If
Next j
Next i

ReDim arrOutput(1 To letzteZeile, 1 To letzteSpalte)

For i = 1 To 7
For j = 1 To letzteSpalte
arrOutput(i, j) = arrData(i, j)
Next j
Next i

For i = 8 To letzteZeile
For j = 1 To letzteSpalte
arrOutput(i, j) = arrData(i, j)
Next j
Next i

For i = 1 To versandPlan.Count
Dim rowIndex As Long
rowIndex = versandPlan(i)(0)
arrOutput(rowIndex, versandPlan(i)(1)) = versandPlan(i)(2)
Next i

wsNeu.Range("A1").Resize(UBound(arrOutput, 1), UBound(arrOutput, 2)).Value = arrOutput

Application.ScreenUpdating = True

MsgBox "Versandplan erfolgreich erstellt!", vbInformation
End Sub

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:23:46
onur
Und was ist jetzt die Frage?
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:31:08
Ali
Es funktioniert nicht :D

Ich wollte die Datei hochladen, aber habe es nicht hinbekommen.

Die Matrix wird 1:1 abgebildet.

Hier Copy-Paste der Tabelle:

WE Material Hierarchie Name 1 Ort Auftrag Losgröße Prio 01.08.23 02.08.23 03.08.23 04.08.23 07.08.23 08.08.23 09.08.23 10.08.23 11.08.23 14.08.23 16.08.23 17.08.23 18.08.23 21.08.23 22.08.23 23.08.23 24.08.23 25.08.23 28.08.23 29.08.23 30.08.23 31.08.23
1 A 1123 Name1 Ort1 Auftrag1 222 6 6 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
2 B 1124 Name2 Ort2 Auftrag2 0 6 6 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228
3 C 1125 Name3 Ort3 Auftrag3 222 42 24 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
4 D 1126 Name4 Ort4 Auftrag4 222 48 24 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
5 E 1127 Name5 Ort5 Auftrag5 222 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
6 F 1128 Name6 Ort6 Auftrag6 174 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 G 1129 Name7 Ort7 Auftrag7 210 30 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
8 H 1130 Name8 Ort8 Auftrag8 210 0 0 0 0 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54 54
9 I 1131 Name9 Ort9 Auftrag9 210 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
10 J 1132 Name10 Ort10 Auftrag10 210 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336 336
11 K 1133 Name11 Ort11 Auftrag11 168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 18 18 18 18 18 18
12 L 1134 Name12 Ort12 Auftrag12 168 156 44 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
13 M 1135 Name13 Ort13 Auftrag13 168 48 12 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
14 N 1136 Name14 Ort14 Auftrag14 168 0 0 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
15 O 1137 Name15 Ort15 Auftrag15 168 0 0 0 0 0 0 0 0 0 0 0 0 0 48 48 48 48 48 48 48 48 48
16 p 1138 Name16 Ort16 Auftrag16 168 1 18 12 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228
17 q 1139 Name17 Ort17 Auftrag17 168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 228 228 228 228
18 r 1140 Name18 Ort18 Auftrag18 168 144 90 144 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228
19 s 1141 Name19 Ort19 Auftrag19 168 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 228 228 228 228
20 t 1142 Name20 Ort20 Auftrag20 168 16 8 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
21 v 1143 Name21 Ort21 Auftrag21 174 78 42 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
22 w 1144 Name22 Ort22 Auftrag22 144 132 48 48 168 48 48 168 48 168 48 48 48 48 48 48 48 48 48 48 48 48 48
23 u 1145 Name23 Ort23 Auftrag23 144 2 228 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
24 1146 Name24 Ort24 Auftrag24 144 0 0 0 0 0 0 0 0 0 0 0 0 0 48 48 48 48 48 48
Anzeige
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:36:39
onur
Sollen wir jetzt deine Datei nachbauen, um dir helfen zu dürfen ?
"Ich wollte die Datei hochladen, aber habe es nicht hinbekommen. " - Warum nicht? Was genau ist passiert?
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:44:43
Ali
Ich kann die Excel Datei nicht auswählen. Wenn ich wüsste, woran es liegt, dann hätte ich es bereits hochgeladen.
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:46:05
onur
Was GENAU (Schritt für Schritt) hast du denn gemacht ?
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 20:55:58
Ali
Digga, kannst du auch normal schreiben?
Wenn du genervt bist oder keine Lust hast - dann lass es.
Amk, da wendet man sich mal an ein Forum, dann bekommt man nur unterschwellige Kommentare.

Die Datei kann ich nicht auswählen, es ist ausgegraut.

Habe Kommentare hinzugefügt, reicht das oder was meinst du mit "GENAU"

Sub KonsolidiereUndPlaneProduktion()
Dim ws As Worksheet, wsNeu As Worksheet
Dim letzteZeile As Long, letzteSpalte As Long
Dim i As Long, j As Long
Dim täglicherBedarf As Double, gesamtBedarf As Double
Dim Losgröße As Double, tage As Long
Dim MaxTagesmenge As Double
Dim Prio As Boolean
Dim neueZeile As Long
Dim versandPlan As Collection
Dim arrData As Variant, arrHeader As Variant, arrOutput As Variant

' Tabelle1 als Quelle
Set ws = ThisWorkbook.Sheets("Tabelle1")

' Setze die maximale Tagesmenge
MaxTagesmenge = 2200

' Erstelle ein neues Arbeitsblatt für die neue Matrix
On Error Resume Next
Set wsNeu = ThisWorkbook.Sheets("Neue Matrix")
On Error GoTo 0
If wsNeu Is Nothing Then
Set wsNeu = ThisWorkbook.Sheets.Add(After:=ws)
wsNeu.Name = "Neue Matrix"
End If

Application.ScreenUpdating = False

' Kopiere die Daten aus dem Original-Arbeitsblatt in ein Array für den Layout
letzteZeile = ws.Cells(Rows.Count, 1).End(xlUp).Row
letzteSpalte = ws.Cells(1, Columns.Count).End(xlToLeft).Column
arrData = ws.Range(ws.Cells(1, 1), ws.Cells(letzteZeile, letzteSpalte)).Value

' Erstelle ein Array für die Kopfzeile
arrHeader = ws.Range(ws.Cells(1, 1), ws.Cells(1, letzteSpalte)).Value

' Initialisiere die Versandplan-Sammlung
Set versandPlan = New Collection

' Schleife durch die Zeilen
For i = 2 To letzteZeile
' Hole den täglichen Bedarf aus den Zellen (Spalte H bis letzteSpalte)
täglicherBedarf = 0
For j = 8 To letzteSpalte
täglicherBedarf = täglicherBedarf + arrData(i, j)
Next j

' Hole den Prio-Wert aus Spalte G
Prio = arrData(i, 7)

' Wenn der Artikel keine Prio hat - > osgröße und die Anzahl der Tage
If Not Prio Then
Losgröße = Application.WorksheetFunction.Min(MaxTagesmenge, täglicherBedarf)
tage = WorksheetFunction.Ceiling(täglicherBedarf / Losgröße, 1)
End If

' Füge die Losgröße in Tagen
For j = 8 To letzteSpalte
If arrData(i, j) > 0 Then
Dim MengenText As String
If Prio Then
MengenText = Application.WorksheetFunction.Min(arrData(i, j), MaxTagesmenge) & "/" & 1
Else
MengenText = Application.WorksheetFunction.Min(arrData(i, j), Losgröße) & "/" & tage
End If
versandPlan.Add Array(i, j, MengenText)
arrData(i, j) = arrData(i, j) - Val(Split(MengenText, "/")(0))
End If
Next j
Next i

' Erstelle ein Array für die Ausgabe (einschließlich Kopfzeile)
ReDim arrOutput(1 To letzteZeile, 1 To letzteSpalte)

' ersten Spalten
For i = 1 To 7
For j = 1 To letzteSpalte
arrOutput(i, j) = arrData(i, j)
Next j
Next i

' Bedarfe
For i = 8 To letzteZeile
For j = 1 To letzteSpalte
arrOutput(i, j) = arrData(i, j)
Next j
Next i

' Versandplan in Bedarfe
For i = 1 To versandPlan.Count
Dim rowIndex As Long
rowIndex = versandPlan(i)(0)
arrOutput(rowIndex, versandPlan(i)(1)) = versandPlan(i)(2)
Next i

' neue AB
wsNeu.Range("A1").Resize(UBound(arrOutput, 1), UBound(arrOutput, 2)).Value = arrOutput

Application.ScreenUpdating = True

MsgBox "Versandplan erfolgreich erstellt!", vbInformation
End Sub

Anzeige
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:06:00
onur
Was hast DU denn für ein Problem, "Digga" ???
Ich hab dich gebeten, mir zu erläutern, was genau du gemacht hast, um die Datei hochzuladen, weil alle anderen seltsamerweise KEINE Probleme damit haben.
Deswegen wollte ich wissen, wo evtl der Fehler ist, "Digga" !
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:15:11
Ali
HABE ES DOCH BEREITS BESCHRIEBEN!
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:28:25
onur
Du hast nicht beschrieben, was genau du gemacht hast, nur "Ich kann die Excel Datei nicht auswählen." und "Die Datei kann ich nicht auswählen, es ist ausgegraut. " DAS war nicht meine Frage.
Wenn du auf "Zum File-Upload" klickst, geht ein Fenster auf, wo du auf "Durchsuchen" klicken und dann eine Datei aussuchen musst.
Userbild

Wie du siehst, kann man sogar Bilder hochladen.
Anzeige
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:41:17
Ali
Also ich kann nichts auswählen/ uploaden.

Ich habe es mit verschiedenen Daten und auch verschiedenen Speicherplätzen versucht.
Weder xls, xlsx, jpg,.. kann nicht auswählen. Ich weiß nicht weshalb, habe mich auch heute erst registriert.
Das Auswahlfenster öffnet sich, jedoch kann ich nichts auswählen.

Sonst hätte ich es direkt hochgeladen.
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:45:03
onur
Hasdt du einen Apple? Habe gehört, damit könne es Probleme geben.
Hier ist die Datei
24.07.2023 22:14:37
onur
https://www.herber.de/bbs/user/162023.xlsm
AW: Hier ist die Datei
25.07.2023 09:26:28
Ali
Konnte sich jemand den Makro anschauen?
Bei mir werden die täglichen Bedarfe übernommen aber es werden keine zusammengefasst.
Anzeige
Lösungsansatz
25.07.2023 20:01:16
Ali
Hallo alle,

ich habe soglangsam einen Lösungsansatz.
Weil ich die Datei nicht hochladen kann (Macbook) - hier der DropboxLink:https://www.dropbox.com/scl/fi/cljndyu5v5akomk7hfac8/77263883.xlsm?rlkey=rpplvfja7cx18bd7nk82qa7o8&dl=0

Wenn man das Marko abspielt funktioniert es halbwegs für die Zeile 6 und 11. Es wird zwar nur abgerundet, aber immerhin.
Die Zellen sollten aufgerundet werden und vom ins. Ausbringungsmenge von Material X subtrahiert werden.
zb. Wenn 5,5,5,5,5 (Woche) geplant ist und Losgröße 25 ist, dann sollte das Makro 25 am ersten Tag planen und die restlichen Mengen nicht mehr betrachten.
Overall darf pro Tag nicht mehr wie 2.000 geplant werden.

Hier mein Code:


Sub KonsolidiereUndPlaneProduktion()
Dim ws As Worksheet, wsNeu As Worksheet
Dim letzteZeile As Long, letzteSpalte As Long
Dim i As Long, j As Long
Dim täglicherBedarf As Double, gesamtBedarf As Double
Dim Losgröße As Double, tage As Long
Dim MaxTagesmenge As Double
Dim Prio As Boolean
Dim neueZeile As Long
Dim versandPlan As Collection
Dim arrData As Variant, arrHeader As Variant, arrOutput As Variant

' Einstellung der Arbeitsblätter und Maximalmenge pro Tag
Set ws = ThisWorkbook.Sheets("Tabelle1")
MaxTagesmenge = 2000

' Prüfen, ob es bereits ein Arbeitsblatt "Neue Matrix" gibt, andernfalls erstellen
On Error Resume Next
Set wsNeu = ThisWorkbook.Sheets("Neue Matrix")
On Error GoTo 0
If wsNeu Is Nothing Then
Set wsNeu = ThisWorkbook.Sheets.Add(After:=ws)
wsNeu.Name = "Neue Matrix"
End If

Application.ScreenUpdating = False

' Ermitteln der letzten Zeile und Spalte des Ausgangsblatts
letzteZeile = ws.Cells(Rows.Count, 1).End(xlUp).Row
letzteSpalte = ws.Cells(1, Columns.Count).End(xlToLeft).Column

' Daten des Ausgangsblatts in ein Array einlesen
arrData = ws.Range(ws.Cells(1, 1), ws.Cells(letzteZeile, letzteSpalte)).Value

' Header des Ausgangsblatts in ein Array einlesen
arrHeader = ws.Range(ws.Cells(1, 1), ws.Cells(1, letzteSpalte)).Value

' Neue Collection für den Versandplan erstellen
Set versandPlan = New Collection

' Schleife über die Zeilen des Ausgangsblatts
For i = 2 To letzteZeile
täglicherBedarf = 0
' Schleife über die Tage (Spalten) des Ausgangsblatts, beginnend ab Spalte I
For j = 9 To letzteSpalte
täglicherBedarf = täglicherBedarf + arrData(i, j)
Next j

' Priorität und Losgröße auslesen
Prio = arrData(i, 8)
Losgröße = arrData(i, 7)

' Wenn keine Priorität vorhanden ist, den täglichen Bedarf in Losgrößen aufteilen
If Not Prio Then
If täglicherBedarf > 0 Then
' Anzahl der Tage berechnen, die benötigt werden, um den täglichen Bedarf zu decken
tage = WorksheetFunction.RoundUp(täglicherBedarf / Losgröße, 0)
' Wenn der tägliche Bedarf kleiner oder gleich der Maximalmenge pro Tag ist, nur einen Tag einplanen
If täglicherBedarf = MaxTagesmenge Then
tage = 1
Else
' Ansonsten einen Tag abziehen, da der letzte Tag eventuell weniger als die Losgröße liefern kann
If tage > 1 Then
tage = tage - 1
End If
End If
End If
End If

' Schleife über die Tage (Spalten) des Ausgangsblatts, beginnend ab Spalte I
For j = 9 To letzteSpalte
If arrData(i, j) > 0 Then
Dim MengenText As String
' Wenn Priorität vorhanden ist, Menge unverändert lassen, ansonsten in Losgrößen und Tagen aufteilen
If Prio Then
MengenText = Application.WorksheetFunction.Min(arrData(i, j), MaxTagesmenge) & "/" & 1
Else
MengenText = Application.WorksheetFunction.Min(arrData(i, j), Losgröße) & "/" & tage
End If
' Versandplan hinzufügen und die Menge entsprechend reduzieren
versandPlan.Add Array(i, j, MengenText)
arrData(i, j) = arrData(i, j) - Val(Split(MengenText, "/")(0))
End If
Next j
Next i

' Ausgabearray vorbereiten
ReDim arrOutput(1 To letzteZeile, 1 To letzteSpalte)

' Header in den Ausgabearray übertragen
For i = 1 To 7
For j = 1 To letzteSpalte
arrOutput(i, j) = arrData(i, j)
Next j
Next i

' Restliche Daten in den Ausgabearray übertragen
For i = 8 To letzteZeile
For j = 1 To letzteSpalte
arrOutput(i, j) = arrData(i, j)
Next j
Next i

' Versandplan in den Ausgabearray übertragen
For i = 1 To versandPlan.Count
Dim rowIndex As Long
rowIndex = versandPlan(i)(0)
arrOutput(rowIndex, versandPlan(i)(1)) = Split(versandPlan(i)(2), "/")(0)
Next i

' Ausgabearray in das neue Arbeitsblatt übertragen
wsNeu.Range("A1").Resize(UBound(arrOutput, 1), UBound(arrOutput, 2)).Value = arrOutput

Application.ScreenUpdating = True

MsgBox "Versandplan erfolgreich erstellt!", vbInformation
End Sub


Anzeige
AW: Hier ist die Datei
24.07.2023 22:21:08
Ali
Super, hat geklappt!
Ja, sind halt Mengen in den jeweiligen Tagen "nivelliert" - einfach heruntergerechnet.
Nun versuche ich anhand von Priorisierungen danach nach der Menge eine Reihenfolge mit einem Makro zu erzeugen.
Ich weiß nicht, ob es funktioniert und benötige es eig. auch nicht mehr.
Aber bin jetzt so lange dadran, dass ich es gerne hinbekommen wollen würde.
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:50:39
ALi
Ja, schreibe mit meine Mac.
Habe momentan keine alternative.
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 21:54:31
onur
Kennst du DROPBOX?
Einfach anmelden und du kannst dort Dateien hochladen und den Link zu der Datei hier posten.
AW: Matrix mit Daten un täglichen Mengen als neue Matrix mit Losgrößen
24.07.2023 22:04:12
Ali
Hoffe es funktioniert:

https://www.dropbox.com/scl/fi/k3plk7bpsf1q9lcvuobml/test.xlsm?rlkey=v7z7bpf2md2t6tu10p2p0bl7h&dl=0
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige