Anzeige
Archiv - Navigation
1012to1016
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

Problem mit Select SpecialCells

Problem mit Select SpecialCells
04.10.2008 04:50:33
Esmo
Moin!
Habe ein Makro, was bei Auswahl von Zellen in einer Spalte die Zeilen löschen soll, die leer sind. Läßt sich eigentlich einfach so gestalten:

Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete


Bisher hat das auch gut funktioniert. Nun habe ich aber eine Datei mit 65400 Zeilen, bei denen der Befehl nicht mehr funktioniert. Er beläßt die Auswahl einfach, wie sie ist und löscht damit dann alle Zeilen.
Nach einigem Ausprobieren scheinen 16385 Zeilen die Grenze zu sein, bei mehr funktioniert das nicht mehr.
Hat jemand von Euch damit Erfahrungen?
Danke
Ralph

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 12:40:14
Daniel
Hi
deswegen empfehle ich, die Daten vor dem Löschen so zu sortieren, daß die zu löschenden Zellen einen zusammenhängenden Block bilden.
Da es dann nur 1 Zellbereich ist, der selektiert wird, spielt die Anzahl der zu löschenden Zellen keine Rolle mehr.
also in deinem Fall:

with Selection
.entirerow.sort Key1:=.cells(1,1), order1:=xlascending, header:=xlno
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
end with


sollte mit jeder beliebigen Zeilenanzahl funktionieren.
Gruß, Daniel

Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 13:14:00
Tino
Hallo,
warum muss sortiert werden?
Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Löscht bei mir alle Zeilen in denen nichts drin steht,
aber nur so weit wie die verwendeten Zellen gehen.
Warum auch weiter gehen, die nicht benutzten sind doch ohnehin schon leer.
Wenn ich in Zeile 65536 etwas reinschreibe und wieder lösche, wird auch bis Zeile 65536 gelöscht.
Bei sehr vielen Zeilen, sollte allerdings die Bildschirmaktualisierung abgestellt werden.
Application.ScreenUpdating = False
Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Application.ScreenUpdating = True

Aber vielleicht steh ich auch auf dem berühmten Schlauch.
Gruß Tino
Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 13:40:39
Daniel
Hi
das Problem bei SpecialCells ist nicht die absolute Anzahl von Zellen, sondern die anzahl der Zellbereiche.
ein Zellbereich ist immer ein zusammenhängender Zellblock.
mal als beispiel:
in den Zellen A1:A4 sind jeweils 2 Zellen beschrieben und 2 Zellen leer, die leeren sollen gelöscht werden.
bei folgender Verteilung sind es 2 Zellbereiche (mit jeweils 1 Zelle)

1  x
2
3  x
4   


bei dieser Verteilung hingegen ist des nur 1 Zellbereich (mit 2 Zellen), der gelöscht werden muss


1  x
2  x
3
4   


entscheidend ist für Excel immer die Anzahl der Zellbereiche, nicht deren Grösse.
wenn, wie in deinem Beispiel, die Zellen nach folgendem Schema gefüllt sind (erste und letzte gefüllt, dazwischen leer):


1      x
2
3
65534
65535 x   


dann ist es auch nur 1 Zellbereich der Gelöscht werden muss (halt eben mit 65533 Zellen, aber das ist Exel egal) und für Excel überhaupt kein Problem
sieht die Füllung dagegen so aus (immer abwechselnd gefüllt/leer, das wäre jetzt das Worst-Case-Szenario):


1      x
2
3     x
4
65533 x
65534
65535 x   


dann sind es 32768 Zellbereiche, die gelöscht werden müssten.
damit ist Excel überfordert, da das Limit bei 8192 Zellbereichen liegt.
hinzu kommt, daß mit der Anzahl der Zellbereiche auch die Verarbeitungsgeschwindigkeit sinkt.
um in dem o.g. Worst-Case-Szenario die Zellen zu löschen, benötigt die Variante mit Sortieren 0,2 Sekunden, die Variante ohne Sortieren (aufgabe wird in 4 Blöcke geteilt, um das Limit nicht zu überschreiten) c.a. 200 Sekunden, ist also um den Faktor 1000 ! langsamer.
ich denke, jetzt sollte klar sein, warum ich empfehle zu sortieren.
klar, bei anderen Datenmengen oder Verteilungen reduzieren sich die Vorteile, aber wer mit Grossen Datenmengen agiert, sollte sich darüber bewusst sein, daß Sortieren eine der schnellsten Funktionen in Excel ist und sich damit viele Aufgaben vereinfachen und beschleunigen lassen (z.B. das finden von Duplikaten)
Gruß, Daniel

Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 14:08:02
Tino
Hallo,
hasst recht, habe zuvor nicht so viele Zellbereiche gehabt.
Danke
Gruß Tino
AW: Problem mit Select SpecialCells
04.10.2008 22:09:44
Esmo
Moin,
leider ist die Lösung mit dem Sortieren keine Alternative. Ich stelle dieses Makro diversen Kollegen in der Firma zu Verfügung. Von daher kann ich nicht davon ausgehen, daß eine Sortierung gewünscht ist.
Habe es jetzt so gemacht (nur den relevanten Auszug des Makros), mit i und leerzell als long

Application.ScreenUpdating = False  'speed-up 1. by turning this off
Application.Calculation = xlCalculationManual  '2. no calculation while we delete
i = Selection.Rows.Count
For i = i To 1 Step -8000
leerzell = -1
On Error Resume Next  'in case there are no blanks
leerzell = Range(Cells(Selection.Cells(1).Row - 1 + Application.WorksheetFunction.Max(1, i - _
7999), Selection.Column), _
Cells(Selection.Cells(1).Row - 1 + Application.WorksheetFunction.Max(i, 1), _
Selection.Column)).SpecialCells(xlCellTypeBlanks).Cells.Count
Debug.Print leerzell & " empty cells in selection"
' only if we have empty cells - in VBA we do not get a runtime error which we
' get in the immediate window or manually, so I use the unchanged -1 value of leerzell
' as indicator that there are no empty cells
If leerzell  -1 Then
Range(Cells(Selection.Cells(1).Row - 1 + Application.WorksheetFunction.Max(1, i - 7999),  _
Selection.Column), _
Cells(Selection.Cells(1).Row - 1 + Application.WorksheetFunction.Max(i, 1),  _
Selection.Column)). _
SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End If
Next i
On Error GoTo 0  ' we have to turn on error handling again
'was just
' Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
' but changed because of reason mentioned in Microsoft Knowledge Base
' http://support.microsoft.com/?kbid=832293
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True


wobei ich noch am Überlegen bin, ob das mit dem leerzell ein Geschwindigkeitsgewinn ist oder nicht. Es ist übrigens ein Excel-Limit mit den 8192 Bereichen, aber das Problem ist, daß VBA keine Fehlermeldung macht.
Gruß
Ralph

Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 23:03:16
Daniel
Hi
bei diesen Datenmengen sollten die Dateien so aufgebaut sein, daß man die Original-Reihenfolge wieder aus den Daten herstellen kann.
Falls dem nicht so ist, kannst ja in eine Hilfsspalte die Original-Zeilen-Nr hinterlegen, dann kannst du die Tabelle jederzeit in die Original-Reihenfolge zurücksortiern.
der Code dazu könnte so aussehen:

With ActiveSheet.Usedrange
with .columns(.columns.count).offset(0,1)
.Formula = "=Row()"
.Formula = .Value
end with
end with


und am ende dann wieder Aufräumen mit:


with Activesheet.Usedrange
with .Columns(.columns.count)
.entirerow.sort Key1:=.cells(1,1), order1:=xlascending, header:=xlno
.entirecolumn.delete
end with
end with


Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 23:20:00
Esmo
Moin!
gute Idee, aber leider ist - wie gesagt, um das Makro allgemein zu halten - das nicht drin - mitunter wollen die Benutzer nur über einem bestimmten Bereich der Tabelle gehen und da was rauslöschen.
Damit muß ich halt den langsamen Weg gehen.
Ansonsten müsste ich - falls ich davon ausgehe, daß es sich immer um eine Spalte einer Tabelle handelt, Selection.CurrentRegion statt ActiveSheet.UsedRange verwenden.
Gruß
R
AW: Problem mit Select SpecialCells
04.10.2008 23:31:00
Daniel
Hi
jomei, ich kenne Daten halt nicht.
das allgemein-funktionierende Makros immer etwas aufwendiger sind als speziell angepasste, liegt eigentlich auch in der Natur der Sache.
Trotzdem freut sich jeder Anwender, wenn die Makros in Rekordzeit durchlaufen und er nicht immer warten muss.
Da ich meistens mein eigener Kunde bin, weiß ich, wovon ich rede.
(mein Chef kenn idR aber nur die Durchlaufzeit der Vorgängerversion ;-))
Gruß, Slowboarder
Anzeige
AW: Problem mit Select SpecialCells
04.10.2008 23:59:00
Esmo
Moin!
Klar bin ich auch für Geschwindigkeit, aber der Benutzer muß sich halt in diesem Fall entscheiden - entweder er bekommt das allgemeine, etwas langsamere Makro, oder er bekommt das schnelle mit ein paar Bedingungen (wie z. B. eine ganze Tabelle nehmen).
Gruß
Ralpkh
AW: Problem mit Select SpecialCells
04.10.2008 08:58:39
Tino
Hallo,
habe dies mal durchgetestet.
anstatt
Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
habe ich
Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Select
verwendet.
Dieser Code verwendet nur Zellen bis zur letzten Benutzten Zelle.
Das heißt, hat in Zeile 65536 noch nie etwas drin gestanden, wird diese auch nicht mit ausgewählt.
Schreibst Du zum Bsp. In Zelle A65536 etwas rein und löscht dies anschließend wieder, wird bis einschließlich Zeile 65536 ausgewählt.
Gruß Tino
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige