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.

Ein guter Ort, um zu starten, um nicht verwenden, Wählen Sie
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

Schreibe einen Kommentar