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

Zeile löschen bei großen, dyn. Tabellen langsam!

Zeile löschen bei großen, dyn. Tabellen langsam!
24.01.2014 14:11:01
Steve
Hallo zusammen,
meine u.g. Routine übernimmt von einem Eingabefeld die Zahl (Long) und löscht sämtliche Zeilen (einer dynamischen Tabelle), die in der 7. Spalte (G) den eingegebenen Wert hat.
Klappt soweit wunderbar. Jedoch dauert die Abfrage bei großen Tabellen. Hat jemand einen Verbesserungsvorschlag?
Option Explicit
Public Sub sel_PMT()
Dim sel_PMT As Variant
Dim i As Long
Dim last_row As Long
Do
sel_PMT = Application.InputBox(prompt:="Please enter PMT:", Title:="Enter PMT", Default:=1,   _
_
Type:=1)
If VarType(sel_PMT) = vbBoolean Then Exit Do
If sel_PMT = 1 And sel_PMT  6 Then
'Dim myRange As Range
Sheets("twDataSheet").Activate
Application.ScreenUpdating = False
last_row = getlastrow("twDataSheet", 7, 3) '7 = Column number; 4 = Start row
For i = last_row To 3 Step -1 '4 = Startreihe
If Cells(i, 7)  sel_PMT Then Rows(i).Delete '7 = Column number;
Next i
Application.ScreenUpdating = True
Sheets("Settings").Activate
MsgBox "All Reports have now been filtered for PMT " & sel_PMT, vbOKOnly, "Information"
Exit Do
End If
MsgBox "ERROR! Only numbers between 1 to 7 (without 6)!", 16, "Warning!"
Loop
End Sub
Public Function getlastrow(sh As String, col As Long, startrow As Long) As Long
Dim i As Long
For i = startrow To 150000
If Sheets(sh).Cells(i, col) = "" And Sheets(sh).Cells(i + 1, col) = "" Then '
getlastrow = i
Exit Function
End If
Next i
End Function

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeile löschen bei großen, dyn. Tabellen langsam!
24.01.2014 14:37:23
EtoPHG
Hallo Steve,
3 Anmerkungen:
1. Deine Funktion die letzte Zeile so festzulegen, dass von oben nach unten nach 2 leeren, aufeinanderfolgenden Zellen in einer Spalte gesucht wird, scheint mir sehr fragwürdig. Hast du dafür eine Begründung? 'Normalerweise' stellt man mit dem Befehl:
getLastRow = Sheets(sh).Cells(Sheets(sh).Rows.Count, col).End(xlup).Row
die letzte belegte Zellenzeile fest. Dies sucht von unten nach oben und ist sehr schnell.
2. Zelle einzeln durchsuchen nach einem bestimmten Wert, braucht seine Zeit. Schneller sind die Ansätze: a) Die Zellen in ein Array einzulesen und diesen zu durchsuchen oder b) einen Filter auf die Zellen zu legen, der alle zu löschenden anzeigt und diese dann in einem Rutsch zu löschen. Dies kannst du mit dem Makrorekorder aufzeichnen und anschliessend den Code generalisieren.
3. Vor dem Löschen das Screenupdating/Automatische Berechnen u.a. ausschalten und anschliessend wieder einschalten. Suche im Forum nach getMoreSpeed
Gruess Hansueli
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige