Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
844to848
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
844to848
844to848
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Makro zu langsam

Makro zu langsam
19.02.2007 19:07:00
Floh
Hallo!
Mein Makro (siehe unten) funktioniert einwandfrei, doch durch den relativ großen Bereich der geprüft wird, dauert die Ausführung bis zu 4 Minuten....kann man da was machen um das Makro zu beschleunigen?!?
Zum hintergrund:
Im Bereich B1:L316 sollen alle leere Zeilen (also mit Inhalt "") ausgeblendet werden.....Zeilen die schon ausgeblendet sind, aber befüllt sind, sollen wieder eingeblendet werden. Wie gesagt es funktioniert bisher einwandfrei, nur in der ausführung extrem "lahm"!
Vielen Dank im Voraus!

Sub LeerzeilenAusblenden()
Dim ze_zähler As Integer
Dim sp_zähler As Integer
Dim ZeileBehalten As Boolean
Dim zeilenende As Integer
Dim a As Range
Application.ScreenUpdating = False
Set a = ThisWorkbook.Worksheets("Tabelle1").Range("B1:L316")
For ze_zähler = a.Rows.Count To 1 Step -1
ZeileBehalten = False
For sp_zähler = 1 To a.Columns.Count
If a.Cells(ze_zähler, sp_zähler) <> "" Then ZeileBehalten = True: a.Rows(ze_zähler).Hidden = False: Exit For
Next sp_zähler
If Not ZeileBehalten Then a.Rows(ze_zähler).Hidden = True
Next ze_zähler
Application.ScreenUpdating = True
End 

Sub

		

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro zu langsam
19.02.2007 19:19:06
P@ulchen
Hallo Floh,
das muß einen anderen Grund haben, Dein Makro benötigt bei mir weniger als 1 Sekunde...
Gruß aus Leipzig
P@ulchen
www.excel-werkstatt.de

AW: Makro zu langsam
19.02.2007 19:29:00
Floh
Tja, wenn ichs über ein leeres Tabellenblatt laufen lasse, ist es in der Tat sehr schnell. In der Tabelle in der es angewendet werden soll dauerts allerdings...leider habe ich dieses Dokument aber nicht selbst erstellt...hat jemand einen Tip/HInweis für mich, woram das liegen könnte/was ich abprüfen soll?!?
Anzeige
AW: Makro zu langsam
19.02.2007 19:34:00
Stefan
Hallo Floh,
versuchs mal mit dem ausschalten der Kalkulation
application.calculation=xlmanual (oder so ähnlich)
danach wieder einschalten
application.calculation=xlautomatic (oder so ähnlich).
Gruß
Stefan.
AW: Makro zu langsam
19.02.2007 19:37:00
Axel
versuchs doch mal mit "manueller kalkulation" whearend des macros:

Sub LeerzeilenAusblenden()
Dim ze_zähler As Integer
Dim sp_zähler As Integer
Dim ZeileBehalten As Boolean
Dim zeilenende As Integer
Dim a As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set a = ThisWorkbook.Worksheets("Tabelle1").Range("B1:L316")
For ze_zähler = a.Rows.Count To 1 Step -1
ZeileBehalten = False
For sp_zähler = 1 To a.Columns.Count
If a.Cells(ze_zähler, sp_zähler) <> "" Then ZeileBehalten = True: a.Rows(ze_zähler).Hidden = False: Exit For
Next sp_zähler
If Not ZeileBehalten Then a.Rows(ze_zähler).Hidden = True
Next ze_zähler
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Gruss axel
Anzeige
AW: Makro zu langsam
19.02.2007 19:44:12
Erich
Hallo Floh,

noch ein Vorschlag:
Option Explicit
Sub LeerzeilenAusblenden()
Dim lngZe As Long, intSp As Integer, intSpZ As Integer
Dim myCalc As XlCalculation
myCalc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
With ThisWorkbook.Worksheets("Tabelle1").Range("B1:L316")
For lngZe = .Rows.Count To 1 Step -1
intSpZ = .Rows(lngZe).Columns.Count
For intSp = 1 To intSpZ
If .Cells(lngZe, intSp) <> "" Then Exit For
Next intSp
If intSp > intSpZ Then Rows(lngZe).Hidden = True
Next lngZe
End With
Application.Calculation = myCalc
Application.ScreenUpdating = True
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Makro zu langsam
19.02.2007 23:01:00
Daniel
Hallo
probier mal das hier.
Daduch, das die innere Schleife durch die CountIF-Funktion ersetzt wird, sollte es um einiges schneller sein. Außerdem wird die IF-Abfrage durch eine logische Operation ersetzt.
Funktioniert allerding nur, wenn mindestens eine Zelle in der Spalte L oder rechts davon einen Wert enthält.

Sub LeerzeilenAusblenden()
Dim lngZe As Long
Dim myCalc As XlCalculation
Dim lngSP As Long
Dim Zelle As Range
myCalc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
lngSP = Worksheets("Tabelle1").Range("B1:L316").Columns.Count
For Each Zelle In Worksheets("Tabelle1").Range("B1:L316").Columns(1).Cells
Zelle.EntireRow.Hidden = (WorksheetFunction.CountIf(Zelle.Resize(1, lngSP), "") = lngSP)
Next
Application.Calculation = myCalc
Application.ScreenUpdating = True
End Sub

Gruß, Daniel
Anzeige
AW: Makro zu langsam
20.02.2007 09:20:27
Rudi
Hallo,
kurz und bündig:

Sub tt()
With Range("B1:L316")
.Rows.Hidden = False
.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End With
End Sub

Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe
AW: Makro zu langsam
20.02.2007 09:59:00
Erich
Hi Rudi,
das ist sicher die schnellste Variante, aber: Bist du sicher, dass du da nicht zuviel ausblendest?
(Zeilen, in denen mindestens 1 Zelle nicht leer ist, sollten sichtbar bleiben...)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Makro zu langsam
20.02.2007 10:33:24
Rudi
Hallo,
da hast du Recht.

Sub tt()
Dim r As Range
Application.ScreenUpdating = False
With Range("B1:L316")
For Each r In .Rows
r.Hidden = WorksheetFunction.CountA(r) = 0
Next r
End With
End Sub

Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe
Anzeige
AW: Makro zu langsam
21.02.2007 21:52:31
Daniel
Hallo
da muß ich Erich zustimmen, mit diser Methode wird zuviel ausgeblendet.
aber andersrum sollte es gehen:

Sub tt()
With Range("B1:L316")
.Rows.Hidden = True
On Error Resume Next
.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = False
.SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = False
On Error GoTo 0
End With
End Sub

Dann müssten alle Zeilen eingeblendet sein, in denen mindestens eine Zelle gefüllt ist.
Allerdings funktioniert das Makro nur für Zellen, die wirklich leer sind, also auch keine Formel beinhalten.
Wenn es allerdings so ist, daß alle Zellen Formeln haben, die ggf. einen Leerstring ("") als Ergebnis haben und dann ausgeblendet werden sollen, funktioniert es so natürlich nicht.
Dann muß man das Makro noch einwenig erweiteren:

Sub tt2()
Dim arr
Dim rng As Range
Set rng = Range("B1:L316")
arr = rng.FormulaLocal
With rng
.Formula = .Value
.Rows.Hidden = True
On Error Resume Next
.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = False
.SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = False
On Error GoTo 0
.Value = arr
End With
End Sub

Gruß, Daniel
PS. Floh, wäre schön, wenn du dich mal kurz meldest
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige