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

Makro läuft zu lansam

Makro läuft zu lansam
13.08.2005 18:06:48
mike49
Hallo zusammen,
da ich ganz wenig Makrokenntnisse besitze, habe ich mir ein Löschen-Makro zusammengebastelt. Läuft aber sehr langsam.
Desweiteren hätte ich gerne noch was ergänzt:
Nach dem Löschen soll im Bereich G8:G38 die zeilenbezogene Formel geschrieben werden, also:
in G8 =WENN(F8>0;"0:00";"")
in G9 =WENN(F9>0;"0:00";"")
usw. bis
in G38 =WENN(F38>0;"0:00";"")
Das Makro:
Public Loeschen As Boolean
Sub Löschen()
Dim strAntwort As String
strAntwort = MsgBox("Achtung: Das gesamte Tabellenblatt wird zurückgesetzt!", _
vbExclamation + vbOKCancel, "Hinweis")
If strAntwort = vbCancel Then Exit Sub 'Bei "Abbrechen" abbrechen.
With Application
.ScreenUpdating = False 'Bildschirmaktualisierung abschalten.
.EnableEvents = False 'Ereignissprozeduren deaktivieren.
End With
With ActiveSheet
.Unprotect
Loeschen = True
Range("E8:G38").ClearContents
Loeschen = False
.Protect
End With
strAntwort = MsgBox("Die anderen Tabellenblätter ebenfalls zurücksetzen?", _
vbQuestion + vbYesNo + vbDefaultButton2, "Frage")
If strAntwort = vbYes Then
With Application
.ScreenUpdating = False 'Bildschirmaktualisierung abschalten.
.EnableEvents = False 'Ereignissprozeduren deaktivieren.
End With
If ANDERE_TABELLEN = True Then
MsgBox "Alle Monate auf Null gesetzt.", _
vbInformation, "Information"
End If
Range("E8").Select
With Application
.EnableEvents = True 'Ereignissprozeduren wieder aktivieren.
.ScreenUpdating = True 'Bildschirmaktualisierung wieder einschalten.
End With
End If
End Sub

Private Function ANDERE_TABELLEN() As Boolean
Dim sh As Object
For Each sh In ThisWorkbook.Sheets
If sh.Name <> ActiveSheet.Name _
And Len(sh.Name) = 3 Then
If TABELLE_AUF_NULL(sh.Name) = False Then
MsgBox "Fehler bei Tabelle: " & sh.Name, _
vbCritical, "Abbruch"
Exit Function
End If
End If
Next
ANDERE_TABELLEN = True 'Erfolg vermerken.
End Function


Private Function TABELLE_AUF_NULL(strTabelle As String) As Boolean
On Error GoTo Ende 'Fehlerbehandlung übernehmen.
With ThisWorkbook 'Alles auf diese Datei beziehen:
With Sheets(strTabelle) 'Alles auf dieses Tabellenblatt beziehen:
.Unprotect
Loeschen = True
Range("E8:G38").ClearContents
Loeschen = False
.Protect
End With
End With
TABELLE_AUF_NULL = True 'Erfolg vermerken.
Ende:
On Error GoTo 0 'Fehlerbehandlung zurückgeben.
End Function

Würde mich über eine Lösung freuen.
Gruß
mike49

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro läuft zu lansam
13.08.2005 18:37:18
Matthias
Hallo Mike,
zur "Langsamkeit":
setze mal an den Anfang der Prozedur
Application.Calculation = xlCalculationManual
und ans Ende
Application.Calculation = xlCalculationAutomatic
Gruß Matthias
AW: Makro läuft zu langsam
13.08.2005 18:54:48
mike49
Hallo Matthias,
danke für den Tipp. Bringt aber nichts. Irgendwie ist da im Makro der Wurm drin, denn in den anderen Tabellenblättern wird nicht gelöscht.
Gruß
mike49
AW: Makro läuft zu langsam
13.08.2005 21:48:49
Erich
Hallo Mike,
der Wurm ist der fehlende Punkt vor Range - dann hat das With keine Wirkung.
Zur Geschwindigkeit: Ich habe nichts gefunden, was stark verzögern würde. Ich habe ein paar Sachen rausgemommen, die mir überflüssig schienen, dafür die Formeln in Spalte G eingefügt. Probier doch mal aus, obs funzt, vielleicht sogar schneller?
Option Explicit
Sub Löschen()
Dim strAntwort As String
strAntwort = MsgBox("Achtung: Das gesamte Tabellenblatt wird zurückgesetzt!", _
vbExclamation + vbOKCancel, "Hinweis")
If strAntwort = vbCancel Then Exit Sub 'Bei "Abbrechen" abbrechen.
With Application
.ScreenUpdating = False 'Bildschirmaktualisierung abschalten.
.EnableEvents = False 'Ereignissprozeduren deaktivieren.
.Calculation = xlCalculationManual
End With
With ActiveSheet
.Unprotect
'alt .Range("E8:G38").ClearContents
.Range("E8:F38").ClearContents
.Range("G8:G38").FormulaLocal = "=WENN(F8>0;""0:00"";"""")"
.Protect
End With
strAntwort = MsgBox("Die anderen Tabellenblätter ebenfalls zurücksetzen?", _
vbQuestion + vbYesNo + vbDefaultButton2, "Frage")
If strAntwort = vbYes Then
If ANDERE_TABELLEN = True Then
MsgBox "Alle Monate auf Null gesetzt.", vbInformation, "Information"
End If
Range("E8").Select
End If
With Application
.ScreenUpdating = True 'Bildschirmaktualisierung abschalten.
.EnableEvents = True 'Ereignissprozeduren deaktivieren.
.Calculation = xlCalculationAutomatic
End With
End Sub
Private Function ANDERE_TABELLEN() As Boolean
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> ActiveSheet.Name And Len(sh.Name) = 3 Then
If TABELLE_AUF_NULL(sh.Name) = False Then
MsgBox "Fehler bei Tabelle: " & sh.Name, _
vbCritical, "Abbruch"
Exit Function
End If
End If
Next
ANDERE_TABELLEN = True 'Erfolg vermerken.
End Function
Private Function TABELLE_AUF_NULL(strTabelle As String) As Boolean
On Error GoTo Ende 'Fehlerbehandlung übernehmen.
With ThisWorkbook.Sheets(strTabelle) 'Alles auf dieses Tabellenblatt beziehen:
.Unprotect
' alt  .Range("E8:G38").ClearContents
.Range("E8:F38").ClearContents
.Range("G8:G38").FormulaLocal = "=WENN(F8>0;""0:00"";"""")"
.Protect
End With
TABELLE_AUF_NULL = True 'Erfolg vermerken.
Ende:
On Error GoTo 0 'Fehlerbehandlung zurückgeben.
End Function

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Makro läuft zu langsam
14.08.2005 09:30:48
mike49
Hallo Erich,
danke für deine Hilfe, aber irgendwas läufts nicht richtig. Es dauert immer noch lange, bis der Löschvorgang beendet ist. Die Hinweisfenster überlagern einander und der Löschvorgang im einzelnen Tabellenblatt startet auch ohne Bestätigung. Es
wird auch nicht in allen Tabellenblättern die Zelle E8 nach dem Löschen angesprungen.
Ich habe mir deshalb gedacht, die Tabelle upzuloaden.
https://www.herber.de/bbs/user/25620.xls
Überprüfe mal bitte das Makro, ob's bei dir auch Probleme macht.
Gruß
mike49

Anzeige
AW: Makro läuft zu langsam
14.08.2005 19:24:35
Erich
Hallo Mike,
in deiner Mappe habe ich noch ein wenig zu optimieren versucht. Wirklich schnell ist das Löschen aber nicht geworden. Das Ergebnis ist
https://www.herber.de/bbs/user/25625.xls
Die Hinweisfenster sollten sich jetzt nicht mehr überlagern, dafür wird zwischendurch die Bildschirmaktualisierung mal eingeschaltet.
Der Löschvorgang im einzelnen Tabellenblatt sollte nicht ohne Bestätigung starten.
Um in allen Tabellenblättern die Zelle E8 zu selektieren, muss jedes Blatt aktiviert werden. Beides zusammen (und auch den evtl. nötigen Bildlauf) macht Application.Goto. (Zuerst wird cells(1,1) angesprungen, damit jedenfalls die obere linke Ecke der Tabelle angezeigt wird.)
Das beim Aufruf aktive Blatt (aktBlatt) wird am Ende wieder aktiviert.
Ich habe die drei Ereignisprozeduren bei allen Monaten rausgenommen und stattdessen drei Ereignisprozeduren beim Workbook eingerichtet, die das gleiche tun:
- Workbook_SheetBeforeDoubleClick
- Workbook_SheetCalculate
- Workbook_SheetChange
Das ist kürzer und Änderungen müssen nur einmalig gemacht werden.
(Diese Prozeduren bekommen als Parameter auch den Blattnamen. Damit lässt sich steuern, bei welchen Blättern auf ein Ereignis wie zu reagieren ist. In deinem Fall soll nur bei Blättern reagiert werden, die einen 3-stelligen Namen haben.)
Wie gefällts dir?
Grüße von Erich aus Kamp-Lintfort
Anzeige
Deine Datei ist kaputt
14.08.2005 21:04:46
Reinhard
Hallo Mike & Erich,
dieser Code läuft in Sekunden in meiner Datei https://www.herber.de/bbs/user/25628.xls , bei "eurer" braucht er k.A. 5 Minuten, obwohl er noch den Fehler hat die Aufrufstabelle 2mlal zu löschen, aber kann man lassen so.

Option Explicit
Sub Löschen()
Dim strAntwort As String, n As Byte
Application.ScreenUpdating = False
Application.Calculation = xlManual
Application.EnableEvents = False 'Ereignissprozeduren deaktivieren.
strAntwort = MsgBox("Achtung: Das gesamte Tabellenblatt wird zurückgesetzt!", _
vbExclamation + vbOKCancel, "Hinweis")
If strAntwort = vbCancel Then Exit Sub 'Bei "Abbrechen" abbrechen.
Call Lösch(ActiveSheet.name)
strAntwort = MsgBox("Die anderen Tabellenblätter ebenfalls zurücksetzen?", _
vbQuestion + vbYesNo + vbDefaultButton2, "Frage")
If strAntwort = vbYes Then
For n = 1 To Worksheets.Count
If Worksheets(n).name <> "Zusammenstellung" Then Call Lösch(Worksheets(n).name)
Next n
MsgBox "Alle Monate auf Null gesetzt.", vbInformation, "Information"
End If
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True 'Ereignissprozeduren aktivieren.
Application.ScreenUpdating = True      'Bildschirmaktualisierung einschalten.
End Sub
Sub Lösch(name As String)
Dim n As Byte
With Worksheets(name)
.Unprotect
.Range("H8:H38").ClearContents
For n = 8 To 38
.Cells(n, 7).FormulaLocal = "=Wenn(F" & n & ">0;""0:00"";"""")"
Next n
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
End Sub

Gruß
Reinhard
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige