Makro beschleunigen
18.02.2019 15:44:32
Dennis
im Rahmen meiner Masterarbeit muss ich mehrere Auswertungen durchführen. In Zusammenarbeit mit meinem Studienkollgen habe ich dafür ein Programm geschrieben, jedoch erlaubt die Dauer des Makros keine Auswertung durchzuführen. Ich habe eine Datenliste von 200.000 Zeilen die durchlaufen werden müssen. Selbst wenn ich die Datenmenge um den Faktor 20 kürze, brauchen die beiden Makros insgesamt 25 Minuten.Vorab, ich bin ein VBA Neuling.
Meine Rohdaten umfassen 11 Spalten. Wichtig für die beiden Makros sind jedoch nur 3 Spalten. Spalte 4 enthält Maschinennummern, Spalte 5 entählt das Datum der Kundenmeldung und Spalte 6 das Datum des Einsatz.
Über eine Eingabemaske wird ein Zeitraum eingegeben (Auswertungszeitraum), welcher in den meisten Fällen immer einen Monat beträgt. . Weiterhin wird in der Eingabemaske die Dauer der Rückwärtsbetrachtung (180d in den meisten Fällen) und die Dauer der Vorwärtsbetrachtung (180d) eingegeben.
Makro 1 filtert die Basisdaten und schreibt alle Daten, die sich im Auswertungszeitraum befinden in ein neues Blatt "Betrachtungszeitraum_klein" Im zweiten Schritt werden alle Daten die sich im Zeitraum Auswertungszeitraum Anfang -Rückwertsdauer und Auswertungszeitraum Ende + Vorwärtsdauer befinden in ein neues Blatt "Betrachtungszeitraum_all" geschrieben.
Dafür folgendes Makro. Das braucht bei einer Basisdatenmenge von 15000 Zeilen schon 10 Minuten und eigentlich soll eine Menge von 200.000 Zeilen durchlaufen werden.
Sub Filter_Data()
Dim Counter1 As Long
Dim Counter2 As Long
Dim row As Long
Dim lastrow_basis As Long
Counter1 = 2
Counter2 = 2
With Worksheets("Basisdaten")
lastrow_basis = .Cells(Rows.Count, "A").End(xlUp).row
For row = 2 To lastrow_basis
If .Cells(row, 6).Value >= Anfang And .Cells(row, 6).Value = Anfang - Rueckwaertsdauer And .Cells(row, 6).Value
Das zweite Makro ist ein bisschen komplexer. Kurze Defintion: MFE= Mehrfacheinsatz(Dem Einsatz im Auswertungszeitraum sind Einsätze im Zeitraum Einsatzdatum bis Einsatzdaum-Rückwärtsdauer)vorausgegangen. Erfolg = kein weiterer Einsatz an der gleichen Maschine innerhalb Zeitraum(Einsatzdatum bis Einsatzdatum+Vorwärtsdauer.
Für jeden Einsatz im Auswertungszeitraum soll geprüft werden, ob dieser Erolgreich war und wie viele Einsätze diesem Vorausgegangen sind. MFE0 = kein Einsatz vorausgegangen, MFE1 = ein einsatz vorausgegangen...
Folgendes Makro dafür. Dieses braucht bei einer Datenmenge von 15000 Zeilen 15 Minuten...
Sub Calculate1()
Dim row1 As Long
Dim row2 As Long
Dim lastrow_klein As Long
Dim lastrow_all As Long
Dim MFE As Integer
Dim Erfolg_Einsatz As Integer
lastrow_klein = Sheets("Betrachtungszeitraum_klein").Cells(Rows.Count, "A").End(xlUp).row
lastrow_all = Sheets("Betrachtungszeitraum_all").Cells(Rows.Count, "A").End(xlUp).row
MFE = 0
For row1 = 2 To lastrow_klein
For row2 = 2 To lastrow_all
If Sheets("Betrachtungszeitraum_klein").Cells(row1, 4).Value = _
_
Sheets("Betrachtungszeitraum_all").Cells(row2, 4).Value And _
Sheets("Betrachtungszeitraum_klein").Cells(row1, 6).Value > Sheets(" _
Betrachtungszeitraum_all").Cells(row2, 6).Value And _
Sheets("Betrachtungszeitraum_klein").Cells(row1, 6).Value - Rueckwaertsdauer Sheets(" _
_
Betrachtungszeitraum_all").Cells(row2, 6).Value Then
Erfolg_Einsatz = Erfolg_Einsatz + 1
End If
Next row2
Sheets("Betrachtungszeitraum_klein").Cells(row1, 12).Value = MFE
Sheets("Betrachtungszeitraum_klein").Cells(row1, 13).Value = Erfolg_Einsatz
MFE = 0
Erfolg_Einsatz = 0
Next row1
End Sub
Ich hoffe ihr könnt mir weiterhelfen. Bin wie gesagt ein Neuling..