Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1320to1324
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

VBA-Berechnung DLZ für alle Ebenen der Stückliste

VBA-Berechnung DLZ für alle Ebenen der Stückliste
18.07.2013 16:02:34
Mastw92
Guten Tag,
im Rahmen einer Projektarbeit benötige ich die Durchlaufzeiten für alle Ebenen der Stückliste.
Ebene 0 besteht aus den Fertigprodukten, Ebene 1 aus den Einzelteile, Ebene 2 sind wiederum Teile für Ebene 1 usw.
Die DLZ, die angegeben ist, gibt nur die Durchlaufzeit auf dieser Ebene an.
Um richtig disponieren zu können benötige ich aber die kumulierten Werte auf jeder Ebene, die in Zelle AA dargestellt werden soll.
Die tieferen Ebenen bezieht sich immer auf die nächst höhere Ebene.
Die Tabelle ist nach Artikel sortiert, dabei steht die Ebene 0 immer oben.
Bei der Kumulierung wird immer die höchste DLZ der nächst tieferen Ebene als Grundlage benötigt.
Ein Bsp soll wie folgt aussehen:
D___________J___________ L____________Z____________________AA
Parentnr.__Componentnr.__BoM-Level____DLZ der Ebene________DLZ kum.
12345______12345_________0____________5____________________21
12345______12345-1_______1____________6____________________16
12345______12345-1-1_____2____________10___________________10
12345______123456-2______1____________2____________________2
12345______123456-3______1____________4____________________4
23456______23456_________0____________4____________________35
23456______23456-1_______1____________7____________________31
23456______23456-1-1_____2____________9____________________24
23456______23456-1-1-1___3____________10___________________15
23456______23456-1-1-1-1_ 4____________5____________________5
23456______23456-2_______1____________4____________________13
23456______23456-2-1_____2____________9____________________9
23456______23456-3_______1____________2____________________2
23456______23456-4_______1____________3____________________9
23456______23456-4-1_____2____________1____________________6
23456______23456-4-1-1___3____________5____________________5
23456______23456-5_______1____________7____________________7
Man muss also von unten nach oben rechnen.
Kenn mich mit VBA nicht gut aus, benötige also dringend Hilfe.
Das hier ist nur ein Beispiel, der Aufbau des Original ist aber gleich, nur mit 190000 Zeilen.
Anbei noch die Muster-Datei
Ich hoffe, dass man mir helfen kann
Gruß
Max
https://www.herber.de/bbs/user/86447.xls

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Berechnung DLZ für alle Ebenen der Stückliste
19.07.2013 15:54:10
fcs
Hallo Max,
hier 2 Makros.
Das 1. kumuliert so wie von dir gewünscht.
Das 2. kumuliert so, das für eine Ebene die DLZ der Ebene und die jeweils zugehörigen Unterebenen summiert werden. Für Ebenen 0 werden so alle Zeilen bis zur nächsten Ebene 0 zusammengezählt.
Ich meine, dass die 2. Variante die korrekten Werte liefert. Musst du halt noch einmal prüfen.
Ich hab das Makro mit ca. 10000 Zeilen getestet. Da ist die Laufzeit im Sekundenbereich, keine Ahnung wie schnell es bei 190000 Zeilen ist.
Gruß
Franz
Sub DLZ_kumuliert__1A()
Dim wks As Worksheet
Dim lngZeile As Long, lngZeile_L As Long
Dim lngSpaBOM As Long, lngSpaDLZ As Long, lngSpaKum As Long
Dim varBOM As Variant, dblKum As Double
Dim arrBom, arrDLZ, arrKumuliert
Set wks = ActiveSheet
With wks
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
lngSpaBOM = .Range("L1").Column
lngSpaDLZ = .Range("Z1").Column
lngSpaKum = .Range("AA1").Column
lngZeile_L = .Cells(.Rows.Count, lngSpaBOM).End(xlUp).Row
If lngZeile_L = varBOM Then
For intI = varBOM To UBound(arrKum)
arrKum(intI) = 0
Next
End If
For intI = LBound(arrKum) To varBOMneu
arrKum(intI) = arrKum(intI) + arrDLZ(lngZeile, 1)
Next
arrKumuliert(lngZeile, 1) = arrKum(varBOMneu)
varBOM = varBOMneu
Next lngZeile
.Range(.Cells(1, lngSpaKum), .Cells(lngZeile_L, lngSpaKum)) = arrKumuliert
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End With
MsgBox "Fertig"
Erase arrBom, arrDLZ, arrKumuliert
End Sub

Anzeige
AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
19.07.2013 18:26:46
Mastw92
Hallo Franz,
erst mal ein riesen Dankeschön für deine Mühen!
Das erste Makro passt perfekt :) Dafür sind meine VBA-Kenntnisse doch zu begrenzt.
Es dauert bei mir ca. 45 min
Das zweite Makro ist zwar auch toll, aber die Unterebenen können parallel gefertigt werden, so dass eine Aufsummierung nicht notwendig ist.
Der kritische Weg langt aus.
Nochmal großen Respekt!
Gruß Max

AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
19.07.2013 20:56:13
fcs
Hallo Max,
die Laufzeit von 45 Minuten bei ca. 190000 Zeilen wundert mich jetzt schon.
Ich hab es jetzt mal in deiner Beispieldatei mit entsprechend vielen kopierten Zeilen auf meinem mäßig schnellen Notebook (Windows Vista, Office 2010) getestet.
Laufzeit: weniger als 5 Sekunden.
Warum es bei dir so lange dauert: ?
Sind in deiner Datei noch viele Formeln, die ggf. neu berechnet werden ?
Dann sollte das Makro am Ende den Berechnungsmodus nicht auf automatisch setzen, sondern auf manuel stehen lassen. Die Neuberechnung sollte dann mit Taste F9 oder über das Menü manuell gestartet werden.
    With Application
.ScreenUpdating = True
'      .Calculation = xlCalculationAutomatic
End With
Gruß
Franz

Anzeige
AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
20.07.2013 14:12:15
Mastw92
Hallo Franz,
ja es gibt noch die Spalte DLZ die mit einer Sverweis-Formel verknüpft ist.
Durch das Weglassen des automatischen Berechnens klappts bei mir jetzt trotz anderer Formeln in ca. einer Sekunde. :)
Klasse Sache.
Danke nochmal.
Gruß Max

AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
21.07.2013 15:11:00
Mastw92
Hallo,
ich hab doch ein Problem gefunden: und zwar gibt er mir auf Level 0 nur den kumulierten Wert der Level 0-DLZ und der Ebene 1, die direkt drunter steht aus. Dies ist aber nicht richtig.
Die kum. Level 0-DLZ soll den maximalen kum. DLZ- Wert aller 1er-Ebenen im Artikel plus die eigene DLZ zum Berechnen nutzen!
Dies kann auch bei anderen Ebenen vorkommen, falls eine Ebene mehrere Unterebenen besitzt!
Das Bsp. soll zeigen wies aussehen soll:
https://www.herber.de/bbs/user/86490.xlsm
Gruß Max

Anzeige
AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
22.07.2013 00:27:30
fcs
Hallo Max,
hier das Makro angepasst, so dass der Maxwert der jeweils niedrigeren Ebene bei der Berechnung berücksichtigt wird.
Gruß
Franz
Sub DLZ_kumuliert__1Aneu()
'Berechnen der max. kumulierten DLZ für BOM-Level-Ebenen der Bauteile
Dim wks As Worksheet
Dim lngZeile As Long, lngZeile_L As Long
Dim lngSpaBOM As Long, lngSpaDLZ As Long, lngSpaKum As Long
Dim varBOM As Variant, varBOMNeu As Variant, dblKum As Double
Dim arrBom, arrDLZ, arrKumuliert
Dim arrKumMax() As Double, intI As Integer
Set wks = ActiveSheet
With wks
'Makro-Bremsen lösen
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
lngSpaBOM = .Range("L1").Column 'Spalte mit BOM-Level-Werten
lngSpaDLZ = .Range("Z1").Column 'Spalte mit Durchlaufzeiten
lngSpaKum = .Range("AA1").Column  'Ergebnisspalte
lngZeile_L = .Cells(.Rows.Count, lngSpaBOM).End(xlUp).Row 'letzte Datenzeile
If lngZeile_L  0
arrKumMax(varBOMNeu) = Application.WorksheetFunction.Max(arrKumMax(varBOMNeu), dblKum)
End If
'Ergebnis in Ergebnis-Array schreiben
arrKumuliert(lngZeile, 1) = dblKum
varBOM = varBOMNeu
Next lngZeile
'Ergebnisse in Tabelle schreiben
.Range(.Cells(1, lngSpaKum), .Cells(lngZeile_L, lngSpaKum)) = arrKumuliert
End With
With Application
.ScreenUpdating = True
End With
MsgBox "Fertig"
Erase arrBom, arrDLZ, arrKumuliert
End Sub

Anzeige
AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
22.07.2013 08:34:05
Mastw92
Hallo Franz,
für die Beispieldatei funktioniert es.
Für die Originaltabelle leider nicht.
Hier kommt Laufzeitfehler '13': Typen unvertäglich
für diesen Teil des Makros:
ReDim arrKumMax(Application.WorksheetFunction.Min(arrBom) _
To Application.WorksheetFunction.Max(arrBom))
Hängt dies mit der Größe der Tabelle zusammen?
Gruß Max

AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
22.07.2013 10:57:13
fcs
Hallo Max,
mit einer der beiden folgenden Ersatzlösungen für die Problemzeile sollte es funktionieren.
Gruß
Franz
    ReDim arrKumMax(0 To 4) 'wenn 4 immer die niedrigste Ebene ist
'    oder
With .Range(.Cells(1, lngSpaBOM), .Cells(lngZeile_L, lngSpaBOM))
ReDim arrKumMax(Application.WorksheetFunction.Min(.Cells) _
To Application.WorksheetFunction.Max(.Cells))
End With

Anzeige
AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
22.07.2013 11:03:08
Mastw92
Hallo Franz,
es klappt! :)
Danke
Gruß
Max

AW: VBA-Berechnung DLZ für alle Ebenen der Stückli
22.07.2013 10:59:35
Mastw92
Hallo,
ich hab mal probiert:
das Makro funktioniert noch bei bis zu 65536 Zeilen (max. Zeilenzahl von Excel 2003), darüber hinaus kommt die beschriebene Fehlermeldung.
Ich benutze aber Office 2010, so dass diese Begrenzung eigtl. kein Problem sein sollte.
Könne gewisse Datentypen in dem Makro keine größere Range bedienen?
Btw: wenn ich filter und dann das Makro laufen lass, erhält man keine Ergebnisse.
Erst das Makro laufen lassen und dann filtern, dann klappts. :)
Gruß Max

157 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige