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

Code sehr langsam!

Code sehr langsam!
23.02.2008 12:31:00
Jan
Hallo VBAler,
guten morgen.
Habe eine Frage würdemich sehr über Hilfe freuen...
Habe einen VBA code der ziemlich lange läuft bis zu 35 Minuten.
Seht ihr an diesem Code mit eurem fachmänischen Auge eine möglichkeit das der code schneller läuft =?
Würde mich sehr freuen.
Der Code soll alle Zeilen ausblenden in denen #1 in Spalte 79 steht. Wenn allerdings ein #3 steht soll die Zeile eingeblendet werden.
Gruß Jan

Sub Makro7()
'Application.ScreenUpdating = False        ' Bildschirmflackern wird ausgeschaltet
Dim lZeile  As Long
Dim strActviveSheet As String
Rows("1:3000").Select
Range("B1").Activate
Selection.EntireRow.Hidden = False
strActivesheet = ThisWorkbook.ActiveSheet.Name
For lZeile = 7 To 3000
ThisWorkbook.Sheets(strActivesheet).Select
If Cells(lZeile, 79).Value = "#1" Then
Rows(lZeile).EntireRow.Hidden = True 'Ausblenden der Zeile
Else
If Cells(lZeile, 79).Value = "#3" Then
Cells(lZeile, 79).EntireRow.RowHeight = 16
End If
End If
ThisWorkbook.Sheets(strActivesheet).Select
Cells(1, 15).Value = lZeile
Next lZeile
ThisWorkbook.Sheets(strActivesheet).Select
Cells(1, 15).Value = ""
'Application.ScreenUpdating = True         ' Bildschirm wird aktualisiert
End Sub


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

Betreff
Datum
Anwender
Anzeige
AW: Code sehr langsam!
23.02.2008 12:48:00
Nepumuk
Hallo Jan,
so?
Sub Makro7()
    Dim lZeile As Long
    Application.ScreenUpdating = False
    Rows("1:3000").Hidden = False
    For lZeile = 7 To 3000
        If Cells(lZeile, 79).Value = "#1" Then
            Rows(lZeile).Hidden = True
        ElseIf Cells(lZeile, 79).Value = "#3" Then
            Rows(lZeile).RowHeight = 16
        End If
    Next lZeile
    Application.ScreenUpdating = True
End Sub

Gruß
Nepumuk

Anzeige
AW: Code sehr langsam!
23.02.2008 12:54:00
Hajo_Zi
Hallo Jan,

Option Explicit
Sub Makro7()
Application.ScreenUpdating = False        ' Bildschirmflackern wird ausgeschaltet
Dim lZeile  As Long
Dim strActviveSheet As String
Rows("1:3000").EntireRow.Hidden = False
For lZeile = 7 To 3000
If Cells(lZeile, 79).Value = "#1" Then
Rows(lZeile).EntireRow.Hidden = True 'Ausblenden der Zeile
ElseIf Cells(lZeile, 79).Value = "#3" Then
Cells(lZeile, 79).EntireRow.RowHeight = 16
End If
'        Cells(1, 15).Value = lZeile
Next lZeile
'   Cells(1, 15).Value = ""
Application.ScreenUpdating = True         ' Bildschirm wird aktualisiert
End Sub



Anzeige
AW: Code sehr langsam!
23.02.2008 13:34:45
Jan
Hallo Nepumuk, hallo Hajo,
ich habe den Code von Nepumuk ausprobiert. Nach 35 Minuten habe ich es abgebrochen. Er hat nur 700 Zeilen zu diesem Zeitpunkt abgearbeitet. Warum ist das so langsam? Die Datei ist ca. 12 MB groß. Bis ich ein paar Änderungen an der Datei vorgenommen habe lief das alte Makro auch schnell. Wodran kann das liegen? Man kann damit nicht arbeiten.
Hilfe, ;-).
Gruß, Jan

AW: Code sehr langsam!
23.02.2008 13:40:00
Nepumuk
Hallo Jan,
dann versuch es mal damit:
Sub Makro7()
    Dim lZeile As Long
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    Rows("1:3000").Hidden = False
    For lZeile = 7 To 3000
        If Cells(lZeile, 79).Value = "#1" Then
            Rows(lZeile).Hidden = True
        ElseIf Cells(lZeile, 79).Value = "#3" Then
            Rows(lZeile).RowHeight = 16
        End If
    Next lZeile
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

Gruß
Nepumuk

Anzeige
AW: Code sehr langsam!
23.02.2008 13:55:00
Gerd
Hallo Jan,
Die Datei ist ca. 12 MB groß. Bis ich ein paar Änderungen an der Datei vorgenommen habe lief das alte Makro auch schnell.
Der Code von Nepumuk hat in einer "neuen" Arbeitsmappe eine Laufzeit von ca.
einer Zehntel Sekunde.
Ich denke, Du musst die Ursache woanderst suchen.
Gruß Gerd

AW: Code sehr langsam!
23.02.2008 14:11:42
Jan
Ich bin der Meinung, dass die Datei keinen großen Einfluss auf das Makro haben sollte. Es dreht sich ja nicht um Berechnungen, sondern nur um ein- bzw. ausblenden.
Was könnte ich denn jetzt noch tun?
Gruß, Ja

AW: Code sehr langsam!
23.02.2008 14:05:21
Erich
Hallo Jan,
obwohl auch ich vermute, dass die Ursache für die lange Laufzeit woanders liegt,
hier noch eine Alternative:

Sub Makro8()
Dim lZeile As Long, rngH As Range, rngV As Range
Rows("1:3000").Hidden = False
For lZeile = 7 To 3000
If Cells(lZeile, 79).Value = "#1" Then
If rngH Is Nothing Then
Set rngH = Rows(lZeile)
Else
Set rngH = Union(rngH, Rows(lZeile))
End If
ElseIf Cells(lZeile, 79).Value = "#3" Then
If rngV Is Nothing Then
Set rngV = Rows(lZeile)
Else
Set rngV = Union(rngV, Rows(lZeile))
End If
End If
Next lZeile
If Not rngH Is Nothing Then rngH.EntireRow.Hidden = True
If Not rngV Is Nothing Then rngV.RowHeight = 16
Set rngH = Nothing
Set rngV = Nothing
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code sehr langsam!
23.02.2008 14:14:00
Nepumuk
Hallo Erich,
hast du das mal in einer Tabelle getestet in der die Zellen in CA abwechselnt mit #1 und #3 gefüllt sind? Der Code benötigt fast 30 Sekunden. Das liegt daran, dass Union immer langsamer wird, je mehr Zellen schon drin sind. Wenn absehbar ist, dass die Anzahl der Zellen nicht sehr groß wird, ist das aber ganz ok.
Gruß
Nepumuk

AW: Code sehr langsam!
23.02.2008 14:39:00
Erich
Hi Max,
getestet hatte ich das nicht, wohl aber vermutet - die Dauer hängt sicher von den Häufigkeiten ab.
Geschrieben hatte ich das nur, weil ich es für möglich halte, dass das Ausblenden der "Union"
in Jans konkreter Umgebung (Ursache für lange Laufzeit woanders) schneller ist als in einer Schleife.
Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code sehr langsam!
23.02.2008 14:18:25
Jan
Hi Erich, ich weiß nicht genau was du getan hast, aber du bist für mich heute der Held!!!
Die Datei lief in ca. 2 Sekunden durch. Was ist hier passiert? Das kann doch alles nicht sein.
Idee, wodran das liegt? Warum läuft das so schnell und vorher nicht?
Vielen Dank auch an die anderen - Ihr seid Spitze.

AW: Code nicht mehr langsam
23.02.2008 17:28:49
Erich
Hi Jan,
danke für deine Rückmeldung!
Warum das jetzt bei dir schneller läuft - ich weiß es nicht! Es hängt von der Struktur deiner Daten ab.
(Siehe meine Antwort an Nepumuk.)
Der "Trick" ist, dass das Makro nicht jede Zeile einzeln ausblendet (oder die Höhe ändert),
sondern die Info, in welchen Zeilen etwas zu tun ist,
mittels "Union" in zwei Mehrfachbereichen rngH und rngV sammelt und dann
die Änderungen im Tabellenblatt "auf einen Rutsch" erledigen lässt.
Eventuell läuft die folgende Version noch etwas schneller.
Hier werden nicht die kompletten Zeilen in die Union gestopft,
sondern jeweils nur die Zelle in Spalte A.
Nachher werden eh die kompletten Zeilen geändert:

Sub Makro8_v2()
Dim lZeile As Long, rngH As Range, rngV As Range
Rows("1:3000").Hidden = False
For lZeile = 7 To 3000
If Cells(lZeile, 79).Value = "#1" Then
If rngH Is Nothing Then
Set rngH = Cells(lZeile, 1)
Else
Set rngH = Union(rngH, Cells(lZeile, 1))
End If
ElseIf Cells(lZeile, 79).Value = "#3" Then
If rngV Is Nothing Then
Set rngV = Cells(lZeile, 1)
Else
Set rngV = Union(rngV, Cells(lZeile, 1))
End If
End If
Next lZeile
If Not rngH Is Nothing Then rngH.EntireRow.Hidden = True
If Not rngV Is Nothing Then rngV.RowHeight = 16
Set rngH = Nothing
Set rngV = Nothing
End Sub

Grüße von Erich aus Kamp-Lintfort und: Schönes Wochenende!

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige