mikrocontroller.net

Forum: PC-Programmierung Arbeiten mit viel zu großen Exceldateien VBA Zeilen löschen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bärnd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

da hat mal wieder jemand Excel anstelle einer sauberen Datenbank 
zweckentfremdet. Aber leider muss ich jetzt hier das beste draus machen.

Ich habe hier ein Exceldokument mit ~30 Spalten und etwa 80000 Zeilen.
Ich muss bestimmte Zeilen mit einem bestimmten wert Löschen. Sortieren 
kann excel diese Datenmenge schon lange nicht mehr, also bleibt mir nur 
die Möglichkeit in VBA die Zeilen zu löschen.

Eine For-Schleife unr ein Delete-Befehl ist kein Problem, allerdings ist 
auch das "hochschieben" des Kompletten Datenblockes schon ein 
"ziemlicher" Aufwand. Also wenn ich z.B. zeile 3 Lösche, muss Excel ja 
die darunterliegenden 80000 Zeilen "hochschieben", damit keine Lücke 
entsteht.

Nun stellt sich die Frage, ob man das nicht "intelligenter" machen kann? 
Zwar gibt es einen Befehl, welcher Berechnungen unterbindet, diesen hab 
ich auch schon eingebaut, aber das ist noch nicht genau mein Problem.
> gibt es auch einen Befehl, welcher das "laden" der Arbeitsmappe unterbindet und 
erst zuletzt, wenn ich alle (etwa) 20000 Zeilen gelöscht hab. dann einmal Lädt?

Vielen Dank

Autor: never ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dreh den Spies doch um und exportiere die richtigen werte in eine neue 
Datei deines gewählten formates.

Autor: Eddy C. (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daten exportieren, z.B. CSV, reduzieren/löschen, importieren?

Autor: Keiner N. (nichtgast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

wenn ich mal nicht an etwas hänge, dann zeichne ich mit dem Makro 
Recorder auf, was ich machen will und schaue mir dann den erzeugten Code 
an.

Da kommt dann so was raus
  Rows("8:8").Select
  Selection.Delete Shift:=xlUp

Zeile 8 Markieren, löschen und den Rest nach oben schieben. Das lässt 
sich noch auf ein
   Rows("8:8").Delete Shift:=xlUp

eindampfen

Autor: Schwarzseher (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bärnd schrieb:
> Ich habe hier ein Exceldokument mit ~30 Spalten und etwa 80000 Zeilen.
> Ich muss bestimmte Zeilen mit einem bestimmten wert Löschen. Sortieren
> kann excel diese Datenmenge schon lange nicht mehr

Nimm mal einen Rechner mit mehr RAM und 64bit. Hab schon Tabellen mit 
800.000 Zeilen und >60 Spalten sortiert, gefiltert, Teilsummen gebildet 
und Pivot-Tabellen drübergelegt. Ohne lange Kaffepausen.

Autor: Bärnd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meine 2. Idee war es mehrere Selects zu machen und dann einfach mehrere 
Zeilen gleichzeitig zu löschen.
Funktioniert auch wunderbar in einer kleinen Tabelle... aber in der 
großen kann ich nicht mal 2 Zeilen gleichzeitig löschen :/

Autor: Bärnd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, die Antworten kamen aber schnell...
=> ich werde mich ranmachen

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm Pandas ;-)

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bärnd schrieb:
> Eine For-Schleife unr ein Delete-Befehl ist kein Problem, allerdings ist
> auch das "hochschieben" des Kompletten Datenblockes schon ein
> "ziemlicher" Aufwand. Also wenn ich z.B. zeile 3 Lösche, muss Excel ja
> die darunterliegenden 80000 Zeilen "hochschieben", damit keine Lücke
> entsteht.

Vor allem steigt der Aufwand quadratisch.

> Nun stellt sich die Frage, ob man das nicht "intelligenter" machen kann?

Klar.
Nur ein Mal von oben nach unten durch die Tabelle, ein Index zeigt auf 
die aktuell untersuchte Zeile, umkopiert zum nach oben schieben (ein 
zweiter Index nennt das Ziel, wird jeweils um die Länge des Blocks der 
zu erhaltenen Zeilen erhöht) wird nur jeweils der stehen gelassene 
Bereich von der letzten als löschbar bewerteten Zeile bis zur neuen als 
löschbar bewerteten (oder dem Ende der Tabelle). So wird jede erhaltene 
Zeile nur ein Mal umkopiert, der Aufwand bleibt linear.

Sonderbehandlung ist nötig zum löschen (ausblanken) der übrigen Zeilen 
zwischen der letzten an ihren Zielort hinkopierten und der alten 
Tabellenlänge, und bei den ersten erhaltenen Zeilen vor der ersten zu 
löschenden, die gar nicht umkopiert werden (der Block word am Ende durch 
die beiden Indexe matkiert)

Autor: Bärnd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thema erledigt...
Danke :)

Autor: Äxl (geloescht) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie und womit? Was hast Du letzen Endes gemacht?

Bärnd schrieb:
> Thema erledigt...
> Danke :)

Autor: Bärnd (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
@Äxl

Export in eine neue csv

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bärnd schrieb:

> da hat mal wieder jemand Excel anstelle einer sauberen Datenbank
> zweckentfremdet. Aber leider muss ich jetzt hier das beste draus machen.

Was hindert dich daran, den Excel-Kram in eine DB zu exportieren, dort 
nach Herzenlust zu bearbeiten und dann zu reimportieren? Dazu muss man 
nicht eine Zeile Code schreiben, sondern einfach nur SQL Server Express 
installieren (die Variante mit den Verwaltungstools) und dann das 
mächtigste eben jener Verwaltungstools benutzen. Damit kannst du fast 
den ganzen Kram in Klickibunti abhandeln...

> Sortieren
> kann excel diese Datenmenge schon lange nicht mehr

Neuzeitliches Excel 64Bit auf einem 64Bit-OS verwenden und schon geht 
das problemlos. Sogar noch viel mehr als diese lächerlichen 80000 
Zeilen. Unsere Kunden werten die Datenbestände unserer DBs allesamt mit 
Excel aus. Da kommt es, je nach Abfrageumfang, auch schonmal zu 
Ergebnismengen mit einigen Millionen Datensätzen. OK, die zu sortieren 
oder zu filtern macht mit Excel wegen der Wartezeiten dann nicht mehr 
wirklich Spaß, aber funktionieren tut das durchaus noch.

Autor: Egon N. (egon2321)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich persönlich würde ja einfach wie vorgeschlagen die Datei als CSV 
exportieren und die Daten dann in eine angemessene Datenbank wie 
PostgreSQL exportieren. Da kann man dann auch schön zwei Server für 
Backups koppeln...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.