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

richtig löschen

richtig löschen
02.11.2016 20:13:39
Fred
ich habe mich seit gestern an meinem Import von über 40.000 DS festgebissen :-(
Lösche ich die Daten im Blatt "Basis" mit dem code:

Worksheets("Basis").Range("A3:A50000").EntireRow.Deletezeilen

und importiere danach meine DS, dauert der Vorgang fast 60 Sek.
andersrum: wenn ich die selbe Datenmenge in ein neues Tabellenblatt importiere (gleiche Überschriftenformatierung, gleiche Formeln in Zeile 2) dann geht das in ca. 9 Sekunden.
meine Frage:
wie bringe ich in Tabelle "Basis", ab der 3. Zeile, diese Tabelle wieder "jungfräulich" :-)
Gruß
Fred

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: richtig löschen
02.11.2016 20:32:24
KlausF
Hallo Fred,
es muss heißen:
Worksheets("Basis").Range("A3:A50000").EntireRow.Delete
ohne "zeilen" am Ende
Gruß
Klaus
AW: richtig löschen
02.11.2016 20:40:51
Fred
Ja Klaus,
war nur ein Konzentrationsfehler meinerseits,- bin "durch meine anhaltende Problematik" etwas aus dem Tüddel.
Aber wieso hopsen meine Daten in eine neue Tabelle recht zügig und in eine "gebrauchte" wie behindert?
Gruß
Fred
AW: richtig löschen
02.11.2016 22:07:56
Gerd
Hallo Fred,
wie geht dein Import?
Ggf. mit welchem Code?
Ansonsten bleibt mir nur der Hinweis auf die allgemeinen Spaßbremsen -
Stichwort: "Get_More_Speed".
Gruß Gerd
AW: richtig löschen
02.11.2016 22:19:36
Fred
Moin Gert,
könntest du mir das mit "Get_More_Speed" nochmal erklären,- wie ich es einbaue.
Mein Code zum Import:

Sub DatenImport()
Application.Calculation = xlCalculationManual 'schaltet autom. Neuberechnung ab
Application.ScreenUpdating = False 'deaktiviert Bildschirmaktualisierung
Application.DisplayStatusBar = False 'kein Update der Statusleiste
Application.EnableEvents = False 'ignoriert Ereignisse während der Ausführung
ActiveSheet.DisplayPageBreaks = False 'verbirgt Seitenumbrüche
Worksheets("Basis").Range("A3:J50000").EntireRow.Delete
Worksheets("Basis").Range("A2:J2").Clear
Dim wksZ As Worksheet, wksQ As Worksheet, wkbQ As Workbook, wksQArray, WB As Long
Const strWkbQName As String = "Saison11_12,Saison12_13,Saison13_14,Saison14_15,Saison15_16, _
Saison16_17"
Const strWkbQ As String = "5Jahre.xls,4Jahre.xls,3Jahre.xls,2Jahre.xls,1Jahre.xls,Aktuell.xls" _
Application.ScreenUpdating = False
Set wksZ = ThisWorkbook.Sheets("Basis")
On Error Resume Next
For WB = LBound(Split(strWkbQ, ",")) To UBound(Split(strWkbQ, ","))
On Error Resume Next
Set wkbQ = Workbooks(Split(strWkbQ, ",")(WB))
If wkbQ Is Nothing Then
Set wkbQ = Workbooks.Open(ThisWorkbook.Path & "\00_Daten\" & Split(strWkbQ, ",")(WB))
End If
For Each wksQ In wkbQ.Worksheets
wksQArray = wksQ.Cells(1, 1).CurrentRegion.Offset(1).Resize(, 9).Value
wksZ.Cells(wksZ.Rows.Count, 1).End(xlUp).Offset(1).Resize(UBound(wksQArray, 1), UBound( _
wksQArray, 2)) = wksQArray
wksZ.Cells(wksZ.Rows.Count, "J").End(xlUp).Offset(1).Resize(UBound(wksQArray, 1) - 1) =  _
Split(strWkbQName, ",")(WB)
Next
wkbQ.Close False 'QuellWB ohne zu speichern schließen
Set wkbQ = Nothing
Next WB
Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
End Sub
Gruß
Fred
Anzeige
AW: richtig löschen
02.11.2016 22:51:46
Gerd
Hallo Fred!
Auf die Schnelle von Ludmilla aus deinem anderen Thread rübergeholt.
Sub getMoreSpeed(Optional ByVal Modus As Boolean = True)
'   Schaltet Kalkulationsmodus, Bildschirmaktualisierung und Event-Handling aus/ein
Dim intCalculation As Integer
Dim bRan  As Boolean
If Modus And Not bRan Then intCalculation = Application.Calculation
With Application
.ScreenUpdating = Not Modus
.EnableEvents = Not Modus
.DisplayAlerts = Not Modus
.Calculation = IIf(Modus, xlCalculationManual, intCalculation)
.Cursor = IIf(Modus, xlWait, xlDefault)
End With
bRan = Modus
End Sub
Sub DatenImport()
Dim wksZ As Worksheet, wksQ As Worksheet, wkbQ As Workbook, wksQArray, WB As Long
Const strWkbQName As String = "Saison11_12,Saison12_13,Saison13_14,Saison14_15,Saison15_16,  _
Saison16_17 """
Const strWkbQ As String = "5Jahre.xls,4Jahre.xls,3Jahre.xls,2Jahre.xls,1Jahre.xls,Aktuell.xls" _
_
Call getMoreSpeed(True)
Worksheets("Basis").Range("A3:J50000").EntireRow.Delete
Worksheets("Basis").Range("A2:J2").Clear
Set wksZ = ThisWorkbook.Sheets("Basis")
For WB = LBound(Split(strWkbQ, ",")) To UBound(Split(strWkbQ, ","))
On Error Resume Next
Set wkbQ = Workbooks(Split(strWkbQ, ",")(WB))
On Error Goto 0
If wkbQ Is Nothing Then
Set wkbQ = Workbooks.Open(ThisWorkbook.Path & "\00_Daten\" & Split(strWkbQ, ",")(WB))
End If
For Each wksQ In wkbQ.Worksheets
wksQArray = wksQ.Cells(1, 1).CurrentRegion.Offset(1).Resize(, 9).Value
wksZ.Cells(wksZ.Rows.Count, 1).End(xlUp).Offset(1).Resize(UBound(wksQArray, 1), UBound( _
wksQArray, 2)) = wksQArray
wksZ.Cells(wksZ.Rows.Count, "J").End(xlUp).Offset(1).Resize(UBound(wksQArray, 1) - 1) = _
Split(strWkbQName, ",")(WB)
Next
wkbQ.Close False 'QuellWB ohne zu speichern schließen
Set wkbQ = Nothing
Next WB
Call getMoreSpeed(False)
End Sub
Gruß Gerd
Anzeige
AW: richtig löschen
02.11.2016 23:08:30
Piet
Hallo Fred,
Hallo Gerd,
die Funktion mit Get_More_Speed ist im Thread von Fred: "Excel hängt sich auf von Fred Neumann" von Ludmila sehr gut erklaert worden. Ich nehme an Fred hat es nicht verstanden? In seinem Code sind aber alle Komponenten bereits drin die als Zeitbremse bekannt sind. Das zweimal ausführen macht bestimmt keinen Sinn.
Zum Verstaendnis für Fred: Ludmila hat alle Komponenten die du im Code schon integriert hast als eigens Unterprogramm geschrieben, bei dem die Variable "True" oder "False" zum Ein- ausschalten übergeben werden muss. Ludmila schrieb dazu wörtlich: - Vor Deinem Code eingeben getmorespeed True -- s.Ludmilas AW vom 01.11.2016 21:11:01
Auf deutsch so besser verstaendich nach Sub: Call getmorespeed True und vor End Sub Call getmorespeed False
Du hast diese Komponenten aber bereits alle direkt in deinen Code integriert. Das zweimal machen bringt nichts.
Wenn es Unterschiede beim Kopieren gibt wird es noch einen bisher unbekannten Fehler geben. Bloss welcher ?
Die bereits als Get_More_Speed belkannten Komponenten können es m.E. nicht sein. Aber woran liegt es dann?
Hat da noch jemand eine wirklich brilliante Idee?
mfg Piet
Anzeige
AW: richtig löschen
02.11.2016 23:18:32
Piet
Nachtrag,
mir kommt da noch eine ganz blööde Idee. Könnte die Zeitdifferenz im Löschvorgang liegen?
Dann waere als Alternative zu überlegen mit Worksheet.Add ein neues Blatt einzufügen, nur die
Überschriftzeile zu kopieren, und das alte Blatt einfach zu löschen. Wie denkt ihr darüber ?
mfg Piet
AW: richtig löschen
02.11.2016 23:35:16
Daniel
Hi
könnte was bringen, probiers doch einfach aus.
Dann hast du auf jeden Fall ein leeres Blatt ohne Altlasten
Wahrscheinlich reicht es aber auch, wenn du im alten Blatt mit Cells.Clear alles löschst und dann die Überschriften nochmal einfügst.
zum Überschrifteneinfügen reicht auch eine Codezeile:
Range("A1:I1").Value = Array("Überschrift1", "Überschrift2"; ... ;"Überschrift3")
kleiner Tip noch zum kopieren von grösseren Datenmengen:
Quellbereich.Copy
Zielbereich.PasteSpecial xlpastevalues
ist etwas schneller und verarbeitet auch größere Datenmengen als
arr = Quellbereich.Value
Zielbereich.Value = arr
außerdem reicht es aus, als Zielbereich die linke obere Zelle anzugeben, während beim Weg über das Array der Zielbereich auf die passende Größe gebracht werden muss.
Das verkürzt zumindest den Code.
Gruß Daniel
Anzeige
AW: richtig löschen
03.11.2016 00:02:15
Fred
Daniel,
das mit dem ändern (Quellbereich.Copy .. Zielbereich.PasteSpecial xlpastevalues) bekomme ich nicht hin.
.. .Resize(, 9).Value / Value mit Copy austauschen?
AW: richtig löschen
03.11.2016 01:09:21
Daniel
Ok, dann für dich zum Abschreiben:
wksQArray = wksQ.Cells(1, 1).CurrentRegion.Offset(1).Resize(, 9).Value
wksZ.Cells(wksZ.Rows.Count, 1).End(xlUp).Offset(1).Resize(UBound(wksQArray, 1), UBound( _
wksQArray, 2)) = wksQArray

geht besser so:
wksQ.Cells(1, 1).CurrentRegion.Offset(1).Resize(, 9).Copy
wksZ.Cells(wksZ.Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial xlpastevalues
gruß Daniel
Anzeige
AW: richtig löschen
03.11.2016 15:20:39
KlausF
Hallo Fred,
vielleicht hat Excel Probleme, sich den neuen Zustand als Zwischenstand zu "merken".
Ich würde mal als Test die Datei nach dem Löschvorgang speichern und erst dann Importieren.
Könnte sein, dass das dann genauso schnell geht.
Gruß
Klaus

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige