Effizienteste Weg, um Zeile löschen mit VBA
Ich habe momentan ein makro, das ich verwenden, um einen Datensatz zu löschen, wenn die ID nicht existiert in einer Liste von ID ' s die ich erstellt aus einem XML-Dokument. Es funktioniert wie ich es mir vorstelle, aber ich habe über 1000 Spalten in der Tabelle (eine für jeden Tag des Jahres bis Ende 2015), so dass es dauert eine Ewigkeit, bis die Zeile löschen, und es kann nur 1 oder 2 bevor es heißt "Excel lief der Ressourcen und zu stoppen war". Unten ist der code, den ich verwende für das makro, gibt es eine andere Möglichkeit, kann ich dies tun, so dass Excel nicht läuft, der Ressourcen?
Sub deleteTasks()
Application.ScreenUpdating = False
Dim search As String
Dim sheet As Worksheet
Dim cell As Range, col As Range
Set sheet = Worksheets("misc")
Set col = sheet.Columns(4)
ActiveWorkbook.Sheets("Schedule").Activate
ActiveSheet.Range("A4").Select
ActiveSheet.Unprotect
ActiveSheet.Range("A:C").EntireColumn.Hidden = False
Do While ActiveCell.Value <> ""
search = ActiveCell.Value
Set cell = col.Find(What:=search, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If cell Is Nothing Then 'If the taskID is not in the XML list
Debug.Print "Deleted Task: " & ActiveCell.Value
Selection.EntireRow.Delete
End If
ActiveCell.Offset(1, 0).Select 'Select next task ID
Loop
ActiveSheet.Range("A:B").EntireColumn.Hidden = True
ActiveSheet.Protect
End Sub
Nach dem Versuch viele verschiedene Optionen, einschließlich all den Antworten, die unten aufgeführt. Ich habe Begriffen, dass was auch immer die Methode ist, löschen Sie eine Zeile mit ~1100 Spalten wird eine Weile dauern, auf meine durchschnittlichen laptop (2.20 Ghz, 4 GB RAM). Da die Mehrzahl der Zeilen leer sind, die ich gefunden habe alternative Methode, die viel schneller ist. Ich deaktivieren Sie einfach die Zellen, die Daten enthalten (A:S) und dann die Größe der Tabelle ändern, entfernen Sie die Zeile, wo ich nur die Daten gelöscht. Dieses Ergebnis ist genau das gleiche wie entireColumn.Delete
. Unten ist der code den ich jetzt verwende
'New method - takes about 10 seconds on my laptop
Set ws = Worksheets("Schedule")
Set table = ws.ListObjects(1)
Set r = ws.Range("A280:S280")
r.Clear
table.Resize Range("A3:VZ279")
Über alles was mit EntireColumn.Delete
oder einfach nur manuell wählen Sie die Zeile und löschen dauert es etwa 20-30 Sekunden auf meinem laptop. Natürlich ist diese Methode nur funktioniert, wenn die Daten in einer Tabelle.
Dann nicht die Schleife über einen Bereich, kopieren Sie es in ein variant-array und Schleife. Und bauen Sie eine Sammlung von Zeilen zu löschen, dann löschen Sie in einem Rutsch außerhalb der Schleife
Danke für die Tipps, ich werde Sie auszuprobieren und zu sehen, wie es klappt
schätzen das feedback, kann Die Methode löschen Sie alle Spalten, nicht nur eine, ich füllte in 1 Spalte für Testzwecke. Die gesamte Zeile mit allen Spalten, die gelöscht wird. Das benchmarking ist zur objektiven Messung von Effizienz gegen jede andere Methode. Haben ein look @ meinen Kommentar in der Antwort unten. So effizient löschen einer einzelnen Zeile, verwenden Sie einfach
ActiveSheet.Range(DelStr).Delete
wo DelStr = "15:15"
wenn Sie möchten, löschen Sie die Zeile 15 mit allen enthaltenen Spalten, usw.InformationsquelleAutor Harry12345 | 2014-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort:
Etwas wie
Die lange Antwort:
Wichtig: Wenn Sie ~ 30 /35 Zeilen zu löschen, wird der folgende code funktioniert sehr effizient. Darüber hinaus wäre es werfen einen Fehler. Für code zu handhaben beliebige Anzahl von Zeilen effizient sehen die sehr lange Antwort unten.
Wenn Sie eine Funktion, die können Sie die Liste der Zeilen, die Sie löschen möchten, versuchen Sie den folgenden code ein. Dies ist, was ich verwenden, um sehr effizient zu löschen mehrere Zeilen mit minimalem overhead. (das Beispiel geht davon aus, dass Sie erreicht haben die Zeilen, die Sie löschen müssen, um durch einige Programm, hier habe ich manuell füttern):
Die (sehr lange) effiziente Lösung für eine beliebige Anzahl von Zeilen und die benchmark-Ergebnisse:
Hier sind die benchmark Ergebnisse, die durch die Zeilen löschen (Zeit in Sekunden vs. keine. der Zeilen).
Den Zeilen auf einem sauberen Blatt und enthalten eine flüchtige Formel in der Spalte D von D1:D100000
d.h. für 100.000 Zeilen, Sie haben eine Formel
=SIN(RAND())
Der code ist nicht lang und nicht allzu hübsch, aber es spaltet die
DelStr
in 250 Zeichen, Zeichenketten und bildet eine Reihe mit diesen. Dann wird der neueDeleteRng
Bereich gelöscht wird, in einem einzigen Arbeitsgang.Zeit löschen kann, hängt von den Inhalten der Zellen. Die Tests/benchmarking, in Kongruenz mit ein bisschen intuition schlägt vor, die folgenden Ergebnisse.
#Ref
- Verweis-Fehler.Code:
Code zum generieren der Formeln in ein leeres Blatt ist
Und den code zur Generierung der benchmark-Ergebnisse oben ist
Hinweis: Vielen Dank brettdj für den Hinweis auf den Fehler wird ausgelöst, wenn die Länge der
DelStr
mehr als 255 Zeichen. Es scheint ein bekannt problem und wie ich schmerzlich herausgefunden, dass es noch existiert für Excel 2013.DelStr
, die meiner Prüfung beträgt 255 Zeichen, oderDelRows(1 to 46)
Sehr guter Punkt, sollte ich getestet haben mit mehr Saiten vor der Buchung. Mein schlechtes. Ich habe aktualisiert, der code zum einbinden beliebiger string-Längen und Anzahl der gelöschten Zeilen. Ich habe auch ein benchmark-test und benchmark-Ergebnisse, um herauszufinden, die Zeit, die für andere nicht. der Zeilen. Hochladen Sie bald. Tks für den Hinweis. Es zu schätzen wissen. Für einen moment betrachtet, das löschen meiner Antwort dann der neue scheint führen Sie eher effizient als gut. Haben Sie einen Blick!
Keine probs - wird entfernen Sie die downvote deinen post editieren 🙂
Ich glaube das hast du falsch verstanden, die problem. Ich war auf der Suche löschen 1 Zeile mit 1000 Spalten, 1000 Zeilen einer einzelnen Spalte, die Ihre Antwort nicht sehr gut tun.
Kein problem, der Grund, warum ich viele Zeilen gelöscht ist, in gewisser Weise, Maß Effizienz. Also dieses Objektiv im Vergleich zu einer anderen Methode. Wie wir sehen, ist diese Methode skaliert Linear, und daher zu löschen eine Zeile, es werde 0.0093 Sekunden auf einem einigermaßen schnellen Rechner (meine Angaben sind 2,8 GHz, 4-core laptop mit 16 GB). Sie können einfach die "kurze Antwort" - Methode, wenn es für Sie funktioniert. Alle die besten!!! Auch, @Harry12345, diese Methode löscht ALLE SPALTEN, nicht nur eine.
InformationsquelleAutor hnk
Dieser code verwendet AutoFilter und ist wesentlich schneller als die Schleife durch die Zeilen.
Ich benutze es täglich, und es sollte ziemlich einfach herauszufinden.
Nur weitergeben, was Sie suchen und die Spalte in der gesucht wird.
Sie könnte auch ein hard-code die Spalte, wenn Sie wollen.
Find
zu suchen, jede Suche Saiten.Diese routine ermittelt alle Instanzen von vSearch in einer Spalte. Keine Notwendigkeit zu gehen durch jede Zelle in der Spalte zu finden, in jeder Instanz.
Es ist nur ein Beispiel dafür, wie mit AutoFilter, die ich gefunden habe, ist viel schneller routine als mit einem bei einem Spaziergang eine Reihe von Zellen. Jedem das seine eigenen.
Auto filter ist eine gute Herangehensweise. Ich war darauf hin die OP hat mehrere Werte, die Verwendung für die Zeile löschen, so dass Ihre routine mehrfach aufgerufen werden. Dieser Teil ist der aktuelle Engpass in der OPs-code.
InformationsquelleAutor BeachBum68
In diesem Fall eine einfache funktionierende Formel kann verwendet werden, um zu sehen, ob jeder der Werte, die in Ihrem Bereich geprüft werden (Spalte A der Zeitplan) gibt es in Spalte F der misc
In
B4
es würde=MATCH(A4,misc!D:D,0)
Dies kann verwendet werden, manuell oder mit code für ein effizientes löschen Sie die Formel, indem design gibt einen Fehler zurück, wenn keine übereinstimmung vorhanden ist, das können wir effizient löschen mit
VBA
mit entweder:AutoFilter
SpecialCells
(design Stück*)In xl2007 beachten Sie, dass es ein limit von 8192 diskrete Bereiche, die ausgewählt werden können mit
SpecialCells
code
InformationsquelleAutor brettdj
Hinweis: ich habe nicht genug "Ruf", um meine Kommentare so posten, als Antwort. Kredit hnk für die wunderbare Antwort (Lange Antwort). Ich habe ein edit als Vorschlag:
Einmal Sie teilen die lange Schnur und der Letzte block ist mehr als das set-Zeichen, dann ist es mit "!" am Ende, das wirft Fehler bei range-Methode. Neben der IF-Anweisung und die MITTE ist sicherzustellen, dass es keine solchen Charakter.
Umgehen, verwenden Sie:
Dank,
Bakul
InformationsquelleAutor Bakul Krishana