Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1164to1168
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

Code sehr langsam, warum?

Code sehr langsam, warum?
Dietmar
Hallo zusammen,
ich habe einen Code für die Ein- oder Ausblendung von Zeilen zusammengestellt, der auch funktioniert, aber ungewöhnlich langsam ist. Ziel ist die spezifische Darstellung von Zeilen, die eine ganz bestimmte Art von Artikeln aufführen. Damit man zielgerichtet das sieht, was man sehen will, habe ich diese Comboboxauswahl geschaffen
Folgende Schritte habe ich vorgenommen:
- zuerst werden alle Zeilen zwischen 4 und 397 eingebendet
- anschließend erfolgt eine Prüfung, welcher Wert in Zeile 559 Spalte 191 steht. Diese Prüfung hat etwas mit einer Berechtigung zu tun, die ich darüber steuere (es gibt die Berechtigungen 1, 2 und 3). Der Wert ist ein Bezug aus einem anderen Tabellenblatt
- je nach Auswahl der Combobox werden dann die Einträge in Spalte 3 überprüft. Dort stehen Angaben, die Produktarten aus Spalte A bezeichnen
Ohne, dass ich den Code im einzelnen erläutere: Erkennt jemand einen groben Schnitzer?
Vielen Dank vorab!
Dietmar aus Aachen
Private Sub Combobox2_Change()
Application.ScreenUpdating = False
Rows("4:397").EntireRow.Hidden = False
Select Case Combobox2.Value
Dim i As Integer
Case "Normales_Treffen"
For i = 4 To 397
If Cells(i, 3).Value  "normal" And Cells(i, 3).Value  "PV" And Cells(i, 3).Value  "Brosch" _
Then
Rows(i).Hidden = True
End If
Next i
'Application.ScreenUpdating = True
'Range("A1").Select
'Exit Sub
Case "AtWork_Treffen"
For i = 4 To 397
If Cells(559, 191).Value  3 Then
Rows("4:397").EntireRow.Hidden = True
MsgBox "Die Ansicht von AtWork-Treffen ist nicht freigegeben. Sie benötigen dazu die  _
Premium-Version von MLC2010"
Exit Sub
Else
If Cells(i, 3).Value  "AtWork" And Cells(i, 3).Value  "PV" And Cells(i, 3).Value  " _
Brosch" Then
Rows(i).Hidden = True
End If
End If
Next i
Case "O2O_Treffen"
For i = 4 To 397
If Cells(559, 191).Value  3 Then
Rows("4:397").EntireRow.Hidden = True
MsgBox "Die Ansicht von O2O-Einzelbetreuungen ist nicht freigegeben. Sie benötigen dazu die  _
Premium-Version von MLC2010."
Exit Sub
Else
If Cells(i, 3).Value  "O2O" And Cells(i, 3).Value  "PV" And Cells(i, 3).Value  " _
Brosch" Then
Rows(i).Hidden = True
End If
End If
Next i
Case "unbelegt"
For i = 4 To 397
If Cells(i, 3).Value  "unbelegt" And Cells(i, 3).Value  "PV" And Cells(i, 3).Value  " _
Brosch" Then
Rows(i).Hidden = True
End If
Next i
Case "Produkte"
For i = 4 To 397
If Cells(i, 3).Value  "PV" Then
Rows(i).Hidden = True
End If
Next i
Case "Broschüren"
For i = 4 To 397
If Cells(i, 3).Value  "Brosch" Then
Rows(i).Hidden = True
End If
Next i
Case "Produkte_Broschüren"
For i = 4 To 397
If Cells(i, 3).Value  "PV" And Cells(i, 3).Value  "Brosch" Then
Rows(i).Hidden = True
End If
Next i
Case "Alle Daten incl. Leerzeilen"
For i = 4 To 397
If Cells(559, 191).Value  3 Then
Rows("4:397").EntireRow.Hidden = True
MsgBox "Die Ansicht von Aller Zeilen ist nicht freigegeben. Sie benötigen dazu die Premium- _
Version von MLC2010"
Exit Sub
Else
If Cells(i, 3).Value  "" And Cells(i, 3).Value = "" Then
Rows(i).Hidden = True
End If
End If
Next i
End Select
Application.ScreenUpdating = True
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Code sehr langsam, warum?
08.07.2010 08:34:24
Fettertiger
Hallo Dietmar,
probier doch mal am Anfang des Macros mit
Application.Calculation =xlCalculationManual
die Berechnungen auszuschalten. Nach dem End Select kannst Du die Berechnung wieder mit
Application.Calculation = xlCalculationAutomatic
wieder einschalten.
Gruss Fettertiger
Wow
08.07.2010 09:09:31
Dietmar
Hallo Fettertiger,
DANKE! das wirkt ja Wunder, das werde ich mir mal merken, denn man könnte es ja bei umfangreichen Prozeduren grundsätzlich bedrücksichtigen.
Habe Deinen Rat mit dem Code von Erich kombiniert. Läuft jetzt bestens!
Viele Grüße
Dietmar
Code so schneller?
08.07.2010 08:42:58
Erich
Hi Dietmar,
der Code ist so langsam, weil du evtl. bei jeder der knapp 400 Zeilen Excel einzeln anweist, sie auszublenden.
Schneller ist es, zunächst den Bereich "einzusammeln", der ausgeblendet werden soll,
und Excel das dann in einem Rutsch tun zu lassen.
Probier mal (ungestestet):

Private Sub Combobox2_Change()
Dim i As Integer
Dim strW As String, strCB As String, rngHide As Range
strCB = ComboBox2.Value
For i = 4 To 397
strW = Cells(i, 3).Value
Select Case strCB
Case "Normales_Treffen"
If strW  "normal" And strW  "PV" And strW  "Brosch" Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "AtWork_Treffen"
If Cells(559, 191).Value  3 Then
Rows("4:397").EntireRow.Hidden = True
MsgBox "Die Ansicht von AtWork-Treffen ist nicht freigegeben." & _
" Sie benötigen dazu die Premium-Version von MLC2010"
Exit Sub
End If
If strW  "AtWork" And strW  "PV" And strW  "Brosch " Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "O2O_Treffen"
If Cells(559, 191).Value  3 Then
Rows("4:397").EntireRow.Hidden = True
MsgBox "Die Ansicht von O2O-Einzelbetreuungen ist nicht freigegeben." & _
" Sie benötigen dazu die Premium-Version von MLC2010."
Exit Sub
End If
If strW  "O2O" And strW  "PV" And strW  "Brosch " Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "unbelegt"
If strW  "unbelegt" And strW  "PV" And strW  "Brosch " Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "Produkte"
If strW  "PV" Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "Broschüren"
If strW  "Brosch" Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "Produkte_Broschüren"
If strW  "PV" And strW  "Brosch" Then
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
Case "Alle Daten incl. Leerzeilen"
If Cells(559, 191).Value  3 Then
Rows("4:397").EntireRow.Hidden = True
MsgBox "Die Ansicht von Aller Zeilen ist nicht freigegeben." & _
"Sie benötigen dazu die Premium-Version von MLC2010"
Exit Sub
End If
If strW  "" And strW = "" Then          ' WIE GEHT DAS DENN?
If rngHide Is Nothing Then
Set rngHide = Cells(i, 1)
Else
Set rngHide = Union(rngHide, Cells(i, 1))
End If
End If
End Select
Next i
Application.ScreenUpdating = False
Rows("4:397").Hidden = False
If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True
Application.ScreenUpdating = False
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Danke!
08.07.2010 09:14:59
Dietmar
Hallo Erich,
grundsätzlich gefällt mir Dein Code viel besser und so habe ich die Prozedur damit mal laufen lassen; funktionierte auch gut und schneller - aber auch nicht so wirklich schneller.
Habe dann den Rat von Fettertiger noch eingebaut und die automatische Berechnung am Anfang des Codes ausgeschaltet. Das hat dann wirklich zu einer tollen Beschleunigung geführt.
Dort wo du geschreiben hast WIE GEHT DAS DENN: ja da wollte ich einfach nur alle Zeilen einblenden, wo was steht und wo nichts steht. Aber du hast wohl recht, da brauchte ich doch einfach nur hidden false machen; ich weiß nicht mehr, was mich da geritten hat; funzt aber.
Herzlichen Dank nochmals!
Viele Grüße
Dietmar
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige