Computerhilfen.de
Design und Entwicklung => Programmieren Forum & Hilfe => Thema gestartet von: ThS am 14.11.03, 16:52:15
-
Hallo,
ich habe folgendes Problem:
Ich habe eine grosse Tabelle, die ich abhängig vom Inhalt der Zellen in Spalte Z in mehrere kleinere teilen und jeweils unter separaten Namen abspeichern muss.
Dazu habe ich ein VBA Modul geschieben, dass zunächst die Ursprungstabelle mehrfach kopiert und
unter neuen Namen speichert. Jede der so erzeugten Tabellen wird anschliessend geladen und abhängig vom Inhalt in Spalte Z werden alle überflüssigen Zeilen gelöscht.
Das ganze funkioniert auch, dauert aber extrem lange. Bis etwa Zeile 80 geht es schnell, dann
wird es immer langsamer und ab etwa Zeile 160-180 hat man den Eindruck, der PC hängt. Das
Programm kommt aber ordnungsgemäss zum Ende.
Wer hat eine Idee, was dieses Verhalten verursacht, bzw wie man das ganz beschleuningen kann.
Aktualisierung der Bildschirmanzeige und Autom.Kalkulieren habe ich bereits ausgeschlatet!
-
Poste doch mal den Code..
Gruß
-
Public Sub CopySheets()
NewLine = Chr(13)
Tabs = Chr(9)
Application.ScreenUpdating = False
ChDir (InpPath)
With Application
.Calculation = xlManual
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False
For ix1 = 1 To ixFoundDEFile
Application.StatusBar = "Create monthly Upd.File" & DEFile(ix1)
UpdFile = Left(CreateFile(1), Len(CreateFile(1)) - 4) & "_" & DEFile(ix1) & ".xls"
Workbooks.Open Filename:=CreateFile(1)
ActiveWorkbook.SaveAs Filename:=InpPath & "\" & UpdFile, _
FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
CreateFile(1 + ix1) = UpdFile
ActiveWindow.Close
Next ix1
For ix1 = 1 To ixFoundDEFile
OutStatusBar = "Update File: " & CreateFile(1 + ix1)
Application.StatusBar = OutStatusBar
ixRow = 3
Workbooks.Open Filename:=CreateFile(1 + ix1)
ActiveWorkbook.Worksheets("DE").Activate
For ix2 = 3 To RowMaxDE
If ActiveSheet.Cells(ixRow, DEColAdmin).Value <> DEFile(ix1) Then
ActiveSheet.Rows(ixRow).Delete
Else
ixRow = ixRow + 1
End If
Application.StatusBar = OutStatusBar & " - Line " & ix2
Next ix2
ActiveSheet.Range("A1").Select
ActiveWorkbook.Save
ActiveWindow.Close
' SavedFile(ix1) = "- " & UpdFile & Tabs2 & DEFileText(ix1 - 1) & NewLine
SavedFile(30 + ix1) = "- " & CreateFile(30 + ix1)
Next ix1
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False
End Sub
-
Warum wirfst die ungültigen aus der Ursprungstabelle(oder einer Kopie) nicht direkt raus und speicherst nacher die einzelnen Teile is doch viel weniger Aufwand und sicher auch schneller.
Gruß
-
weil ich wie gesagt mehrere verschiedene Teile erzeugen muss, will sagen TeilA enthält zB Zeilen 5-20, Teil B Zeilen 1-4 und 21-33 usw.
Das erzeugen der verschiedenen Dateien geht wirlklich schnell, das Laden und Speichern ebenfalls. Das Löschen der Zeilen in ein und derseleben Tabelle ist das Probelem
-
Jo soweit verstanden..aber dann wärs doch einfacher du machst es von oben nach unten fertig in einem Zug.
Du hast ja Kriterien nachdem du die Abschnitte in neue Tabellen aufteilst.
Und du hast auch kriterien nachdem du nacher aus den Teiltabellen die Zeilen löschst oder?
Und was am längsten dauert is das Löschen der ungültigen Zeilen.
Also liegts doch nahe das einfach zu umgehen..
Warum prüfst du nicht jede Zeile auf Abschnitts Kriterium und gleich auf gültige Zeile.
Wenn gültige Zeile schreibst sie in die jeweilige neue Teiltabelle nächste Tabelle anlegen für nächsten Teilabschnitt, wieder zeilen prüfen und nur die schreiben die gültig sind.. usw
Dadurch entfällt das kopieren und öffnen der Tabellen und auch das rauslöschen aus denselben, also du schreibst praktisch sofort das ergebnis in die jeweilige Tabelle für den jeweiligen Abschnitt.
Gruß
-
Danke, ok das ist eine Überlegung wert. Ich prüfe das mal :)