ich habe ein kleines Problem in VBA.
Ich überberprüfe ca. 5000 Zeilen ob in einer etwas drinsteht. Wenn nein soll
die Zeile ausgeblendet werden.
for z = 1 to 5000
a = Cells(z, 1)
If a = 0 Then
Rows(t).Hidden = True
End If
next z
Läuft auch wunderbar dauert nur elend lange.
Hätte einer von euch einer einen Optimierungsvorschlag?
Ganz lieben Dank.
Gruß
Marc
> Läuft auch wunderbar dauert nur elend lange.
Ich weiß ja nicht wo Du t initialisierst, bei mir gäbe das einen
Fehler. .-)
> Hätte einer von euch einer einen Optimierungsvorschlag?
Sub Test()
Application.ScreenUpdating = False
For z = 1 To 5000
If Cells(z, 1) = 0 Then Rows(z).Hidden = True
Next
Application.ScreenUpdating = True
End Sub
Noch schneller wird's wenn Du ggf. Bereiche gruppieren kannst und dann
mehrere Zeilen auf einmal ausblendest, ala Rows("23:450").Hidden =
True. Die Frage ist ob das überhaupt möglich wäre?.
Aber das kriegst Du bestimmt alleine hin, oder?
Andreas.
Vielleicht so ein bisschen schneller:
application.screenupdating=false
for z = 1 to 5000
if isempty(cells(z,1).value) then
rows(z).hidden=true
end if
next
application. screenupdating=true
(ungetestet)
Gruss Reimund
"Marc H." <mar...@nospam-bitte.de> schrieb im Newsbeitrag
news:e2ucTpGV...@TK2MSFTNGP06.phx.gbl...
Am Tue, 2 Dec 2008 03:12:55 -0800 (PST) schrieb Andreas Killer:
> Application.ScreenUpdating = False
> For z = 1 To 5000
> If Cells(z, 1) = 0 Then Rows(z).Hidden = True
> Next
> Application.ScreenUpdating = True
es geht auch ohne die If-Abfrage:
Application.ScreenUpdating = False
For i = 1 To 5000
Rows(i).Hidden = Cells(i, 1).Value = ""
Next
Application.ScreenUpdating = True
Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
"Marc H." <mar...@nospam-bitte.de> schrieb im Newsbeitrag
news:e2ucTpGV...@TK2MSFTNGP06.phx.gbl...
versuche es mal so
Range("A1:A40").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
ggf. noch den Fehler abfangen wenn keine leeren Zellen mehr da sind.
--
mfG
Wolfgang Habernoll
[ Win XP Home SP-2 , XL2002 ]
ich noch mal
> versuche es mal so
>
> Range("A1:A40").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
>
> ggf. noch den Fehler abfangen wenn keine leeren Zellen mehr da sind.
natürlich den Bereich anpassen
Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Öhm, Einspruch. :-))
Die Idee ist gut, aber er möchte gerne ausblenden, nicht löschen, was
dann zu
Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
würde, was aber nicht geht.
Wieso eigentlich nicht?
Andreas.
Andreas Killer schrieb am 02.12.2008
> Wolfgang Habernoll schrieb:
>
>> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
> Öhm, Einspruch. :-))
...stattgegeben... ;-)
> Die Idee ist gut, aber er möchte gerne ausblenden, nicht löschen, was
> dann zu
> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
> würde, was aber nicht geht.
Was geht denn nicht - wie hast Du getestet?
> Wieso eigentlich nicht?
SpecialCells kennt zwei Einschränkungen:
- Im Bereich müssen irgendwo Daten vorhanden sein, also nicht alles leer
- nicht mehr als 8125 unzusammenhängende Bereiche als Ergebnis resultieren
Dann aber klappt das damit hervorragend und sehr schnell.
Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-3]
Microsoft Excel - Die ExpertenTipps
Ist ja Wahnsinn. Danke erstmal an alle.
Ich habe die Lösung von Andreas umgesetzt. Ist rattenschnell.
Was ich noch nicht verstehe ist, dass ich das Phaenomen habe, dass es ab und
zu, wenn ich es mehrmals hintereinander verstecke und wieder sichbar mache,
das Hiden doch extrem lange brauch.
Aber sonst ist es unglaublich.
Danke noch mal.
Gruß
Marc
"Andreas Killer" <andreas...@gmx.net> schrieb im Newsbeitrag
news:49356704$1...@news.arcor-ip.de...
> Wolfgang Habernoll schrieb:
>
>> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
> Öhm, Einspruch. :-))
>
> Die Idee ist gut, aber er möchte gerne ausblenden, nicht löschen, was dann zu
ja, das hab ich nicht richtig gelesen :-(
> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
> würde, was aber nicht geht.
>
> Wieso eigentlich nicht?
aber das geht doch genau so wie du es umgesetzt hast. Allerdings muß mindest eine
Zelle Blank sein, sonst kommt der Laufzeitfehler 1004 keine Zelle gefunden.
>> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
>> würde, was aber nicht geht.
> aber das geht doch genau so wie du es umgesetzt hast. Allerdings muß mindest eine
> Zelle Blank sein, sonst kommt der Laufzeitfehler 1004 keine Zelle gefunden.
Aha, siehste da haben wir den Haken.
Ich hatte zwar von A1 bis A5 in jeder Zelle was drin und trotzdem kam
der Fehler!
SpecialCells macht sich den Bereich offenbar selbst und kuckt nicht bis
A5000 wie programmiert. SpecialSpecialCellsFeature. %-)
Wenn ich mal mit
Adresse = Cells.SpecialCells(xlCellTypeLastCell).Address
mir die Adresse hole, dann ist diese in meinem Test nämlich $A$5.
Ich hab's mit XL 2002 probiert, also haut mich nicht wenn's bei euch
geht. .-)
Andreas.
"Andreas Killer" <andreas...@gmx.net> schrieb im Newsbeitrag
news:4936bbef$1...@news.arcor-ip.de...
> Wolfgang Habernoll schrieb:
>
>>> Range("A1:A5000").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
>>> w�rde, was aber nicht geht.
>> aber das geht doch genau so wie du es umgesetzt hast. Allerdings mu� mindest eine
>> Zelle Blank sein, sonst kommt der Laufzeitfehler 1004 keine Zelle gefunden.
> Aha, siehste da haben wir den Haken.
>
> Ich hatte zwar von A1 bis A5 in jeder Zelle was drin und trotzdem kam der Fehler!
>
> SpecialCells macht sich den Bereich offenbar selbst und kuckt nicht bis A5000 wie
> programmiert. SpecialSpecialCellsFeature. %-)
>
> Wenn ich mal mit
> Adresse = Cells.SpecialCells(xlCellTypeLastCell).Address
> mir die Adresse hole, dann ist diese in meinem Test n�mlich $A$5.
>
> Ich hab's mit XL 2002 probiert, also haut mich nicht wenn's bei euch geht. .-)
nee, wir hauen nicht. In der Tat, SpecialCells nimmt nur den UsedRange auch wenn Range
gr��er definiert wird. Aber f�r deinen Fall k�nnte man ja ein wenig tricksen. ;-) ist
in jedem Fall noch schneller als Schleifen.
With Cells(5000, 1)
.Interior.ColorIndex = .Interior.ColorIndex
Range("A1:A" & .Row).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End With
mich w�rde ja noch interessieren welche "L�sung von Andreas umgesetzt. Ist
rattenschnell." der OP meint, deine Code oder die Korrektur von Delete.