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

Mehrere Zeilen in Datentabelle löschen

Mehrere Zeilen in Datentabelle löschen
14.09.2020 16:16:31
Philipp
Hallo,
ich habe die Datentabellen bzw. "intelligenten Tabellen" (wie ist der richtige Ausdruck?) in Verbindung mit VBA Programmierung lieben gelernt, weil der Zellbezug nicht mehr so relevant ist und User auch mal eine Spalte hinzufügen können, ohne dass der Code gleich crasht.
Nun habe ich eine sehr lange Datentabelle und möchte bestimmte Zeilen daraus löschen. Zum Beispiel: Lösche alle Zeilen, auf die zutrifft: Spalte "Source" ist ungleich "Planned on assumptions"
Diese Seite (https://www.thespreadsheetguru.com/blog/2014/6/20/the-vba-guide-to-listobject-excel-tables) ist mir bekannt, hilft mir aber nur bedingt weiter. Denn wenn ich die Tabelle Zeile für Zeile durchlaufe und einzeln lösche, dauert es ewig. Schöner wäre, ich könnte zunächst alle Zeilen der DataBodyRange initialisieren und dann in einem Schritt löschen. Im Grunde ist mein Ziel dieses SQL-Statement:
DELETE FROM tbl_DB
WHERE Source='Planned on assumptions';
Ich habe aktuell ein Makro geschrieben, das immerhin zusammenhängende Bereiche erkennt und dann auf diese Weise viele Zeilen auf einmal löscht:
tbl_DB.DataBodyRange.Rows(iFirstRowDelete & ":" & iLastRowDelete).Delete
Aber wenn der User die Tabelle wild sortiert, bleibt von den zusammenhängenden Bereichen nicht mehr viel übrig und man ist performanceseitig schnell wieder an der Stelle, wo jede Zeile einzeln gelöscht wird.
Wahrscheinlich stehe ich nur auf dem Schlauch und kenne nicht den Syntax, um einen Bereich innerhalb des Databodys mit VBA anzusprechen. Ganze Zeilen im Excelblatt zu löschen kommt leider nicht infrage. Dann hätte ich den Zellbezug zum Excelblatt ja wieder, den ich gerade vermeiden will.
Danke im Voraus. Ich bin sicher, ihr könnt mir helfen!
VG Philipp

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Es heißt "die Syntax" ...
14.09.2020 16:45:45
lupo1
... und mit xl365 hast Du SORTIEREN() und FILTERN(). Damit erzeugst Du erst die Zieltabelle und kopierst die dann als GANZE SPALTEN (!) - mit VBA - über die Quelle.
Das ist um Größenordnungen schneller, als andere Lösungen.
AW: Es heißt "die Syntax" ...
14.09.2020 17:10:50
Philipp
Hallo lupo1,
mit den zwei Funktionen hatte ich mich kürzlich auch auseinander gesetzt. Aber ich fürchte, das hilft mir in diesem Fall nicht. Denn ich kann ja nicht einfach über die bestehenden Daten drüber kopieren, sondern muss zunächst alles Veraltete heraus löschen und hänge dann die aktualisierten Daten unten dran.
So sieht bspw. die Datentabelle aus:
Zeile 1: Planned on assumptions
Zeile 2: Planned on assumptions
Zeile 3: Planned on manual input
Zeile 4: Planned on assumption
usw.
Zeilen 1,2 und 4 müssen gelöscht werden. Zeile 3 soll bleiben. Mit "Drüberkopieren" müsste ich mindestens den Umweg über eine Sortierung gehen. Das wäre eine Alternative, aber irgendwie ist das auch drum herum geschummelt.
Den Schreibprozess mache ich im VBA-Code bereits ähnlich wie deine Idee mit der FILTER-Funktion. Ich schreibe in VBA alles in ein Array und füge das zum Schluss in die letzte Zeile der Datentabelle. Somit habe ich nur einen einzigen Schreibvorgang im Excelsheet, was wahnsinnig schnell ist. Das muss ich nicht über die FILTER-Funktion optimieren. Nur der Bereinigungsvorgang ist sehr langsam.
Hast du für die Bereinigung noch eine andere Idee?
PS: "Die Syntax" klingt in der Tat besser ;-). Danke!
Anzeige
Meine Lösung hat alles genannt (dass man ...
14.09.2020 17:16:06
lupo1
... natürlich nur die Werte über die Ausgangsdaten kopiert, ist klar), und somit kann ich dem nichts hinzufügen.
Andere genannte Lösungen sind auch möglich:
PeterK macht das, wofür ich 2 Orte nehme, an einem Ort direkt.
Daniel verwendet "Dupl.entf.", wirksam über eine Hilfsspalte.
AW: Mehrere Zeilen in Datentabelle löschen
14.09.2020 16:55:43
peterk
Hallo
Probier mal (Name des ListObjects anpassen, Spaltennummer anpassen, Sicherungskopie nicht vergessen):

ActiveSheet.ListObjects("Tabelle1").Range.AutoFilter Field:=4, Criteria1:= _
"Planned on assumptions", Operator:=xlAnd
ActiveSheet.ListObjects("Tabelle1").DataBodyRange.EntireRow.Delete
ActiveSheet.ListObjects("Tabelle1").Range.AutoFilter Field:=4

Anzeige
AW: Mehrere Zeilen in Datentabelle löschen
16.09.2020 09:36:27
Philipp
Hallo Peter,
ich habe deinen Code und viele Varianten davon ausprobiert, komme aber immer zum gleichen Ergebnis: Wenn innerhalb einer Datentabelle mehrere nicht zusammenhänge Zeilen selektiert sind, versucht Excel stets die ganze Blattzeile zu löschen. Das ist also anwendbar, wenn auf dem Sheet nur diese eine Tabelle ist. Da ich die Datei aber an Andere übergebe (die oft nicht wissen, was sie tun), würde das früher oder später zu Problemen führen.
Trotzdem Danke! Deine Idee brachte mir die Erkenntnis, mit der ich letztlich zur Lösung kam: Über "Sortieren" schaffe ich einen zusammenhängenden Bereich, der dann in einem Schritt gelöscht werden kann. Sie hierzu weiter unten meinen letzten Beitrag.
Anzeige
AW: Mehrere Zeilen in Datentabelle löschen
16.09.2020 10:17:36
Philipp
Kurzer Nachtrag:
Dass Excel die ganze Blattzeile löschen will, liegt wohl doch nicht an der "zerstreuten" Range, sondern daran, dass die Tabelle gefiltert ist.
AW: Mehrere Zeilen in Datentabelle löschen
14.09.2020 16:58:13
Daniel
HI
schnelles löschen von Zeilen geht in Excel am besten mit der Funktion DATEN - DATENTTOOLS - DUPLIKATE ENTFERNEN.
hierzu kennzeichnet man in einer zusätzlichen Hilfsspalte alle Zeilen, die gelöscht werden sollen mit einem einheitlichen Wert (z.B. "x") und die die stehen bleiben müssen, mit einem individuellen Wert, z.B. der Zeilennummer (z.B. durch einfügen einer entsprechenden Formel)
dann wendet man das Duplikate - Entfernen auf die Tabelle mit der Hilfsspalte als Kriterium.
weil beim Duplikate-Entfernen ja immer die erste so gekennzeichnete Zeile stehen bleibt, kennzeichnet man auch die Überschriftenzeile (die ja nicht gelöscht werden soll und damit diese erste Zeile sein kann) mit dem Löschkennzeichen und gibt an "keine Überschrift".
das kann man von Hand machen, aber auch als VBA-Makro lässt sich dieses Vorgehen sehr gut darstellen.
und ja, Intelligente Tabellen werden in der Größe angepasst, wenn Zeilen mit Duplikate-Löschen entfernt werden.
Gruß Daniel
Anzeige
AW: Mehrere Zeilen in Datentabelle löschen
16.09.2020 09:39:13
Philipp
Hallo Daniel,
das ist wirklich verdammt schnell! Diesen "Trick" kannte ich noch gar nicht. Dennoch versuche ich Hilfsspalten zu vermeiden, wo es geht. In einem Jahr weiß ich nicht mehr, was ich mir dabei gedacht habe und dann muss ich mich erst wieder rein finden, um zu verstehen, was passiert. Deshalb bin ich einen anderen Weg gegangen, siehe unten meinen letzten Beitrag.
AW: Mehrere Zeilen in Datentabelle löschen
16.09.2020 09:45:48
Philipp
Hallo zusammen,
vielen Dank für eure Hilfe und eure Lösungsansätze. Ich möchte euch kurz Feedback geben, damit der Nächste, der auf diesen Thread stößt, auch eine Lösung findet:
Da in meiner Datentabelle in Spalte "Source" nur zwei Ausprägungen vorkommen können, stelle ich über "Sortieren" einen zusammenhängenden Bereich her. Dann ermittle ich die erste Zeile, in welcher der zu löschende String vorkommt und lösche alle Zeilen bis zur Letzten:
'Sort by source
tbl_DB.Sort.SortFields.Clear
tbl_DB.Sort.SortFields.Add2 _
Key:=tbl_DB.ListColumns("Source").Range, _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortTextAsNumbers
tbl_DB.Sort.Apply
'Initialise first row including "Planned on assumptions"
vFirstRowDelete = Application.Match("Planned on assumptions", tbl_DB.ListColumns("Source"). _
DataBodyRange, 0)
'Delete range until end
If Not IsError(vFirstRowDelete) Then
tbl_DB.DataBodyRange.Rows(vFirstRowDelete & ":" & tbl_DB.ListRows.Count).Delete
End If
Hinweis: vFirstRowDelete ist als Variant dimensioniert, da bei Integer ein Typenfehler entstehen würde, wenn der String nicht gefunden wird. Ich lasse also bewusst zu, dass die Variable einen Fehler enthalten kann (der aber nicht den Code stoppt) und fange ihn mit dem IF ab. Das erspart mir eine (aus meiner Sicht) unübersichtliche "On Error"-Sektion.
Anzeige

126 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige