Discussion:
per VBA Zeilen ausblenden ist sehr langsam
(zu alt für eine Antwort)
Michael Kensy
2005-01-24 07:07:14 UTC
Permalink
Hola,

da sich die aktuelle ausgewaehlte 'Benutzerdefinierte Ansicht' nicht per
VBA-Code ermitteln laesst (oder sollte ich da etwas uebersehen haben ?),
versuche ich die entsprechende Ansicht (es werden ca. 30 Zeilen ein bzw.
ausgeblendet) einfach per VBA-Code zu realisieren. Die Ausfuehrung des Codes
ist allerdings fast so langsam, dass ich es auch haendisch machen koennte...

Hier meinCode:
Sub DetailAnzeige()
Dim strActiveCellAddress As String
On Error GoTo Out

'***Vorbereitung
strActiveCellAddress = ActiveCell.Address
Application.ScreenUpdating = False

'***Detailzeilen markieren
Range("5:5,7:7,...").Select
#hier habe ich die weiteren Zeilen aus Gruenden der Lesbarkeit geloescht

If Range("5:5").Height <> 0 Then
'***DetailZeilen ausblenden
Selection.EntireRow.Hidden = True
Else
'***DetailZeilen einblenden
Selection.EntireRow.Hidden = False
End If
Out:
'***Nachbereitung
Range(strActiveCellAddress).Activate
Application.ScreenUpdating = True
Exit Sub
End Sub


Hat jemand eine Idee, warum der EntireRow.Hidden-Befehl so unglaublich
lange (knapp eine Sekunde *pro Zeile*) braucht? Kann man das irgendwie
beschleunigen?
--
Gruss Michael
Melanie Breden
2005-01-24 07:36:01 UTC
Permalink
Hallo Michael,
Post by Michael Kensy
da sich die aktuelle ausgewaehlte 'Benutzerdefinierte Ansicht' nicht per
VBA-Code ermitteln laesst (oder sollte ich da etwas uebersehen haben ?),
versuche ich die entsprechende Ansicht (es werden ca. 30 Zeilen ein bzw.
ausgeblendet) einfach per VBA-Code zu realisieren. Die Ausfuehrung des Codes
ist allerdings fast so langsam, dass ich es auch haendisch machen koennte...
[snipp Code]
Post by Michael Kensy
Hat jemand eine Idee, warum der EntireRow.Hidden-Befehl so unglaublich
lange (knapp eine Sekunde *pro Zeile*) braucht? Kann man das irgendwie
beschleunigen?
das liegt an der Selektierung.

Wenn du bestimmte Spalten ein- bzw. ausblenden willst, fasse sie
in einem Range zusammen und kehre deren Hidden-Eigenschaft um:

With Range("E1,G1,I1,K1")
.EntireColumn.Hidden = Not .EntireColumn.Hidden
End With
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Melanie Breden
2005-01-24 07:39:59 UTC
Permalink
Hallo Michael,

Nachtrag:
das funktioniert natürlich auch mit Zeilen:

With Range("A5,A7,A9,A11")
.EntireRow.Hidden = Not .EntireRow.Hidden
End With
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Kensy
2005-01-24 09:19:59 UTC
Permalink
Hola Melanie,
Post by Melanie Breden
Post by Michael Kensy
Hat jemand eine Idee, warum der EntireRow.Hidden-Befehl so unglaublich
lange (knapp eine Sekunde *pro Zeile*) braucht? Kann man das irgendwie
beschleunigen?
das liegt an der Selektierung.
Du meinst an dem ".Select" ?
Post by Melanie Breden
Wenn du bestimmte Spalten ein- bzw. ausblenden willst, fasse sie
With Range("E1,G1,I1,K1")
.EntireColumn.Hidden = Not .EntireColumn.Hidden
End With
hmmm... also der Code:
With Range("A5,A7,A9,A11,A13,A15,A17...")
.EntireRow.Hidden = Not .EntireRow.Hidden
End With

ist nicht wirklich (sichtbar) schneller. Oder habe ich das falsch umgebaut?
--
Gruss Michael
Thomas Ramel
2005-01-24 09:30:18 UTC
Permalink
Grüezi Michael

Michael Kensy schrieb am 24.01.2005
Post by Michael Kensy
Post by Melanie Breden
Post by Michael Kensy
Hat jemand eine Idee, warum der EntireRow.Hidden-Befehl so unglaublich
lange (knapp eine Sekunde *pro Zeile*) braucht? Kann man das irgendwie
beschleunigen?
Wenn du bestimmte Spalten ein- bzw. ausblenden willst, fasse sie
With Range("E1,G1,I1,K1")
.EntireColumn.Hidden = Not .EntireColumn.Hidden
End With
With Range("A5,A7,A9,A11,A13,A15,A17...")
.EntireRow.Hidden = Not .EntireRow.Hidden
End With
ist nicht wirklich (sichtbar) schneller. Oder habe ich das falsch umgebaut?
Hast Du Formeln, die sich auf diese Zellen beziehen?
Dann werden diese bei jedemAusblenden neu berechent.
Auch wenn die Seitenumbrüche im Tabellenblatt angezeigt werden
(strichlierte Lnien), ist der Seitenaufbau relativ langsam.

Mit den folgenden Zeilen dürfte es etwas schneller gehen:

With Application
.Calculation = xlManual
.ScreenUpdating = False
.EnableEvents = False
End With

With Range("A5,A7,A9,A11,A13,A15,A17")
.EntireRow.Hidden = Not .EntireRow.Hidden
End With

With Application
.Calculation = xlAutomatic
.ScreenUpdating = True
.EnableEvents = True
End With



Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Michael Kensy
2005-01-24 10:42:22 UTC
Permalink
Hola Thomas,

merci vorweg, der Zusatz '.Calculation = xlManual' hat das ganze deutlich
beschleunigt (ca. 2 Sekunden fuer alle 30 Zeilen zusammen), damit muss
ich dann wohl leben. Allerdings ...
verstehen wuerde ich es auch noch gerne ;-)
Post by Thomas Ramel
Michael Kensy schrieb am 24.01.2005
Hast Du Formeln, die sich auf diese Zellen beziehen?
Dann werden diese bei jedemAusblenden neu berechent.
nein, die Zeilen sind zur Zeit noch leer. Allerdings sind in den
Blendzeilen immer zwei nebeneinander liegende Zellen mit einander
verbunden.
Post by Thomas Ramel
Auch wenn die Seitenumbrueche im Tabellenblatt angezeigt werden
(strichlierte Lnien), ist der Seitenaufbau relativ langsam.
Nein, es werden keine Seitenumbrueche angezeigt (vorsichtshalber habe ich
aber auch mal den Druckbereich aufgehoben).
Irgendwie begegne ich in XL.2k3 einem Phaenomen nach dem anderen
(siehe auch <***@40tude.net>) ...
--
Gruss Michael
Michael Kensy
2005-01-24 12:04:04 UTC
Permalink
ein Nachtrag sorry,
Post by Michael Kensy
merci vorweg, der Zusatz '.Calculation = xlManual' hat das ganze deutlich
beschleunigt (ca. 2 Sekunden fuer alle 30 Zeilen zusammen), damit muss
ich dann wohl leben. Allerdings ...
verstehen wuerde ich es auch noch gerne ;-)
Post by Thomas Ramel
Michael Kensy schrieb am 24.01.2005
Hast Du Formeln, die sich auf diese Zellen beziehen?
Dann werden diese bei jedemAusblenden neu berechent.
nein, die Zeilen sind zur Zeit noch leer. Allerdings sind in den
Blendzeilen immer zwei nebeneinander liegende Zellen mit einander
verbunden.
habe Deine Frage nicht aufmerksam genug gelesen ... aber nein, es gibt auch
keine Nachfolger.
Post by Michael Kensy
Post by Thomas Ramel
Auch wenn die Seitenumbrueche im Tabellenblatt angezeigt werden
(strichlierte Lnien), ist der Seitenaufbau relativ langsam.
Nein, es werden keine Seitenumbrueche angezeigt (vorsichtshalber habe ich
aber auch mal den Druckbereich aufgehoben).
Irgendwie begegne ich in XL.2k3 einem Phaenomen nach dem anderen
--
Gruss Michael
Thomas Ramel
2005-01-24 12:34:54 UTC
Permalink
Grüezi Michael

Michael Kensy schrieb am 24.01.2005
Post by Michael Kensy
merci vorweg, der Zusatz '.Calculation = xlManual' hat das ganze deutlich
beschleunigt (ca. 2 Sekunden fuer alle 30 Zeilen zusammen), damit muss
ich dann wohl leben. Allerdings ...
verstehen wuerde ich es auch noch gerne ;-)
Das ist rasch erklärt - das Aublenden von Zeilen löst eine Neuberechnung
des Tabellenblattes aus; Formeln die sich auf die Zellen beziehen werden
daher neu berechent, was je nach Umfang und Anzahl derselben eine gewisse
zeit in Anspruch nimmt.
Post by Michael Kensy
Post by Thomas Ramel
Hast Du Formeln, die sich auf diese Zellen beziehen?
Dann werden diese bei jedemAusblenden neu berechent.
nein, die Zeilen sind zur Zeit noch leer. Allerdings sind in den
Blendzeilen immer zwei nebeneinander liegende Zellen mit einander
verbunden.
Verbundene Zellen sin 'Bäh' ;-)
Sie führen meist zu mehr Problemen als die 'bessere' optikrechtfertigt.
Wähle daher besser im Zellenfomrat 'Über der Auswahl zentrieren'
Post by Michael Kensy
Irgendwie begegne ich in XL.2k3 einem Phaenomen nach dem anderen
"Wer suchet, der findet" ;-)


Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Michael Kensy
2005-01-24 13:20:35 UTC
Permalink
Post by Thomas Ramel
Michael Kensy schrieb am 24.01.2005
Post by Michael Kensy
merci vorweg, der Zusatz '.Calculation = xlManual' hat das ganze deutlich
beschleunigt (ca. 2 Sekunden fuer alle 30 Zeilen zusammen), damit muss
ich dann wohl leben. Allerdings ...
verstehen wuerde ich es auch noch gerne ;-)
Das ist rasch erklaert - das Aublenden von Zeilen loest eine Neuberechnung
des Tabellenblattes aus;
ok, das kann ich mir vorstellen,
Post by Thomas Ramel
Formeln die sich auf die Zellen beziehen werden daher neu berechent, was
das allerdings nicht, denn es gibt keine einzige Berechnung, die auf eine
einzige der Blendzeilen referenziert.
Post by Thomas Ramel
Post by Michael Kensy
Irgendwie begegne ich in XL.2k3 einem Phaenomen nach dem anderen
"Wer suchet, der findet" ;-)
;-)
--
Gruss Michael
Thomas Ramel
2005-01-24 13:51:56 UTC
Permalink
Grüezi Michael

Michael Kensy schrieb am 24.01.2005
Post by Michael Kensy
Post by Thomas Ramel
Michael Kensy schrieb am 24.01.2005
Post by Michael Kensy
merci vorweg, der Zusatz '.Calculation = xlManual' hat das ganze deutlich
beschleunigt (ca. 2 Sekunden fuer alle 30 Zeilen zusammen), damit muss
ich dann wohl leben. Allerdings ...
verstehen wuerde ich es auch noch gerne ;-)
Das ist rasch erklaert - das Aublenden von Zeilen loest eine Neuberechnung
des Tabellenblattes aus;
ok, das kann ich mir vorstellen,
Fein...
Post by Michael Kensy
Post by Thomas Ramel
Formeln die sich auf die Zellen beziehen werden daher neu berechent, was
das allerdings nicht, denn es gibt keine einzige Berechnung, die auf eine
einzige der Blendzeilen referenziert.
...ist hier aber dennoch so.
Ein-/Ausblenden und Filtern löst eine Neuberechnung aus, als 'Beleg' möge
die schnellere Geschwindigkeit bei ausgeschalteter automatischer Berechnung
dienen.

Über das 'Wieso, weshalb warum', werden allerdings nur die Entwickler
auskunft geben akönne.


Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Michael Kensy
2005-01-24 16:01:03 UTC
Permalink
Post by Thomas Ramel
...ist hier aber dennoch so.
gut dann also noch mal bedankt!
--
Gruss Michael
Melanie Breden
2005-01-24 09:34:46 UTC
Permalink
Hallo Michael,
Post by Michael Kensy
With Range("A5,A7,A9,A11,A13,A15,A17...")
.EntireRow.Hidden = Not .EntireRow.Hidden
End With
ist nicht wirklich (sichtbar) schneller. Oder habe ich das falsch umgebaut?
der Code ist ichtig, eigentlich sollte die Umschaltung ratzfatz gehen.

Läuft dieser Block alleine in deinem Makro, oder werden noch weitere Befehle ausgeführt?
Mit welcher Excel Version arbeitest du?

Bei mir unter XL2003 läuft es so schnell, dass man nicht mal *schnipp* machen kann ;-)
Wie lange läuft er denn bei dir?
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Loading...