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

Optimierungsbedarf Makrocode wg. Laufzeitproblemen

Optimierungsbedarf Makrocode wg. Laufzeitproblemen
01.12.2017 12:00:48
Bernd
Servus zusammen,
ich brauche mal Hilfe von euch Profis um einen Makrocode zu optimieren.
Vor einiger Zeit habe ich mal einen Code zusammengebastelt, der mir eine Tabelle vom ersten bis zum letzten Eintrag durchgeht und Mitarbeiterspezifisch jeden Eintrag in eine eigene Excel-Datei kopiert, bzw. eine neue Datei anlegt.
Das funktionierte in der Vergangenheit schon, wenngleich mein Code gefühlte Ewigkeiten bei der Ausführung benötigt (immer wieder workbook.open und workbook.close). Bei maximal 20 Zeilen war es aber bisher zu verschmerzen.
Jetzt wollte ich mit diesem Makro das gleiche bei einer Quelldatei mit mehr als 1000 Einträgen machen aber
best case: es dauert gefühlte Stunden, oder
worst case: Excel schmiert wegen RAM-Problemen ab
Da gibt es sicher eine bessere Lösung...
Anbei mal eine Beispieldatei.
https://www.herber.de/bbs/user/118034.xlsm
Ich bedanke mich im Voraus für jede eure Ideen und Vorschläge.
Grüße, Bernd

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Optimierungsbedarf Makrocode wg. Laufzeitproblemen
01.12.2017 13:25:46
Tino
Hallo,
du schließt die Datei nicht.
Da du in die neuen sowieso nichts reinschreibst, kannst Du mal diesen Code testen!
kommt als Code in Modul1
Option Explicit 

Public Sub Aufteilung()
Dim rng As Range
Dim sPath$, sFullPath$
Dim oApp As Excel.Application, oWB As Workbook, NewWBPath$
Dim nCountNeu&, nCountVorhanden&
sPath = ThisWorkbook.Path
sPath = sPath & IIf(Right$(sPath, 1) <> "\", "\", "")
'Datenbereich ohne Zeile 1
With Tabelle3
Set rng = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
If rng.Rows(1).Row < 2 Then Exit Sub
End With
'In Ordner einloggen
ChDrive sPath
ChDir sPath

'Schleife über alle Zeilen im Bereich
For Each rng In rng.Rows
If rng.Cells(1, 4).Value <> "" Then 'nicht leer
sFullPath = sPath & rng.Cells(1, 4).Value & ".xlsx" 'Pfad + neu WB Name
If Dir(sFullPath, vbNormal) = "" Then 'Datei nicht vorhanden
If NewWBPath = "" Then 'erste Datei als Pfad?
If oWB Is Nothing Then 'neue Application erstellen
Set oApp = New Excel.Application
Set oWB = oApp.Workbooks.Add
End If
'speichern als xlsx
oWB.SaveAs Filename:=sFullPath, FileFormat:=51
NewWBPath = sFullPath 'Pfad speichern
'alles schließen
oWB.Close False
oApp.Quit
Set oWB = Nothing
Set oApp = Nothing
nCountNeu = nCountNeu + 1
Else
'nur kopieren
FileCopy NewWBPath, sFullPath
nCountNeu = nCountNeu + 1
End If
Else
nCountVorhanden = nCountVorhanden + 1
End If
End If
Next

On Error Resume Next
'Evlt. aufräumen
If Not oWB Is Nothing Then oWB.Close False: Set oWB = Nothing
If Not oApp Is Nothing Then oApp.Quit: Set oApp = Nothing
MsgBox "Es wurden " & nCountNeu & " Dateien neu erstellt" & vbCr & _
"Es waren " & nCountVorhanden & " Dateien bereits vorhanden!", vbInformation

End Sub
Gruß Tino
Anzeige
AW: Optimierungsbedarf Makrocode wg. Laufzeitproblemen
01.12.2017 13:50:41
Bernd
Servus Tino,
danke für deine Bemühungen. Ich schreibe aber die jeweiligen Einträge in die neuen Dateien.
Auszug aus meinem alten Codestück:

For i = 2 To intLZ_Q
strDatei = strPfad & wbQ.Sheets(1).Cells(i, 4) & ".xlsx"
If DateiExistiert(strDatei) Then
Set wbZ = Workbooks.Open(strDatei)
intLZ_Z = wbZ.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
        wbQ.Sheets(1).Rows(i).Copy Destination:=wbZ.Sheets(1).Cells(intLZ_Z, 1)
        wbZ.Close True
Else
Set wbZ = Workbooks.Add
        With wbZ.Sheets(1)
wbQ.Sheets(1).Rows(1).Copy Destination:=.Range("A1")
intLZ_Z = .Cells(Rows.Count, 1).End(xlUp).Row + 1
wbQ.Sheets(1).Rows(i).Copy Destination:=.Cells(intLZ_Z, 1)
End With
        wbZ.SaveAs Filename:=strDatei, FileFormat:=51
wbZ.Close False
End If
Next i
Wo müsste ich das in deinem Code einfügen?
Ich spekuliere mal, falls ich deinen Code richtig lese:

For Each rng In rng.Rows
If rng.Cells(1, 4).Value  "" Then 'nicht leer
sFullPath = sPath & rng.Cells(1, 4).Value & ".xlsx" 'Pfad + neu WB Name
If Dir(sFullPath, vbNormal) = "" Then 'Datei nicht vorhanden
If NewWBPath = "" Then 'erste Datei als Pfad?
If oWB Is Nothing Then 'neue Application erstellen
Set oApp = New Excel.Application
Set oWB = oApp.Workbooks.Add
End If
==> genau hier rein 
'speichern als xlsx
oWB.SaveAs Filename:=sFullPath, FileFormat:=51
NewWBPath = sFullPath 'Pfad speichern
'alles schließen
oWB.Close False
oApp.Quit
Set oWB = Nothing
Set oApp = Nothing
nCountNeu = nCountNeu + 1
==> Den Code in beiden nachfolgendem "Else" versteh ich nicht?!
Else
'nur kopieren
FileCopy NewWBPath, sFullPath
nCountNeu = nCountNeu + 1
End If
Else
nCountVorhanden = nCountVorhanden + 1
End If
End If
Next

Könntest du mich bitte noch aufklären?
Vielen Dank und Grüße, Bernd
Anzeige
war nicht ersichtlich geht mit meinem nicht ...
01.12.2017 14:31:22
Tino
Ich lasse die Frage offen für andere Helfer.
Gruß Tino
AW: Optimierungsbedarf Makrocode wg. Laufzeitproblemen
04.12.2017 08:58:12
Bernd
Hallo Excel-Freunde,
ich würde mich auch weiterhin über neue Ansätze freuen.
Danke und Grüße, Bernd
AW: Optimierungsbedarf Makrocode wg. Laufzeitproblemen
05.12.2017 18:23:21
Peter
Hallo Bernd,
ich gehe mal davon aus, dass die Abspeicherung in Dateien nach der Spalte "Meldung an ..." erfolgen soll. Bei einer so umfangreichen Quelldatei mit vielen Zeilen sollte man vielleicht zuvor nach MA1, MA2 usw. mit Hilfe des Spezialfilters separieren. Die gefilterten Daten könnten dann im Block in die separaten Dateien übertragen werden. Wenn allerdings die MA's in die Hunderte gehen, dann ist auch dies zu langsam.
Mit freundlichem Gruß
Peter Kloßek
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige