Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

App.ScreenUpdating = False funktioniert nicht

Forumthread: App.ScreenUpdating = False funktioniert nicht

App.ScreenUpdating = False funktioniert nicht
13.04.2013 13:20:08
Albert
Liebe VBA Experten,
ich habe für folgende Probleme keine Lösung gefunden:
1) Application.ScreenUpdating = False funktioniert zwar bei einzelnen Makros nicht jedoch bei "Worksheet_selectionChange(ByVal Target As Range)". Mit jedem Zellwechsel ist ein deutliches Blinken bemerkbar. Im Hintergrund läuft auch ein sehr umfangreiches
"Worksheet_Change" Makro.
Ausschnitte aus diesen beiden Makros:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A, B, C, D, E, F, G, h, i, J, K, l, m, N, o, P, Q, R, S, T As Long
On Error GoTo C:
Application.ScreenUpdating = False
Select Case Target.Column
Case 2: Target.Offset(0, 1).Select
Case 3: Target.Offset(0, 1).Select
Case 4:
If Range("o3") = 2 Then
i = 0
J = 3
Else
i = 0
J = 2
End If
Target.Offset(i, J).Select
Case 5: Target.Offset(0, 1).Select
Case 6:
End Sub

Private Sub Worksheet_selectionChange(ByVal Target As Range)
Application.EnableEvents = True
Application.ScreenUpdating = False
End Sub
2) Je nach Dateizustand (unter bestimmten Voraussetzungen werden beim Schließen einzelne Tabellen ausgeblendet) sollen Teilbereiche in der
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub

übersprungen werden. ZB die Anweisung "Tabelle1.Visible = xlSheetVeryHidden" soll nicht ausgeführt werden, da die Tabelle in der vorher laufenden Anwendung bereits gelöscht wurde. Der Versuch mit einer If-Abfrage die Anweisung abzufangen funktioniert hier nicht.
Hat jemand von Euch eine Idee, wie ich diese Probleme lösen könnte? Für Rückmeldungen bedanke ich mich im Vorhinein
Albert

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: App.ScreenUpdating = False funktioniert nicht
13.04.2013 13:27:27
Tino
Hallo,
verzichte auf die Select Anweisungen, man kommt fast immer ohne aus.
Leiter kenne ich Dein Projekt nicht um da besser helfen zu können!
Zur Info
In Deiner Deklarierung ist nur die Variable T als Long deklariert der Rest ist Variant.
Gruß Tino

AW: App.ScreenUpdating = False funktioniert nicht
13.04.2013 13:49:27
Albert
Hallo Tino,
danke für die rasche Antwort. Um die Benutzerfreundlichkeit zu erhöhen, soll der Cursor nach Eingabe in eine bestimmte Zelle springen. Es sind jedoch mehr als 10 Zellen als neue Adresse möglich und die Anzahl der Bedingungen für die neue Zelladresse liegt bei weitem über 20, ich weiß keine andere Möglichkeit wie ich die Zellansteuerung bewerkstelligen soll.
Danke auch für Deklarationstip
LG Albert

Anzeige
AW: App.ScreenUpdating = False funktioniert nicht
13.04.2013 15:32:56
fcs
Hallo Albert,
Problem 1 - Scrennupdating
Es gibt ein paar Anweisungen in Excel, deren Bildschirmaktualisierung/Flackern per Screenupdating=False nicht vollständig unterdrückt werden kann.
Außerdem muss du natürlich im Programmcode darauf achten, dass nach dem Deaktivieren der Bildschirmaktualiserung diese nicht unerwünschter Weise wieder aktiviert wird, wenn das Makro in ein anderes Makro verzweigt. Das kann zum Beispiel bei dir der Fall sein, wenn das Makro "Worksheet_Change" eine Zelle selektiert. Dann wird "Worksheet_SelectionChange", ggf. mit Bildschirmaktualisierung Aus und Ein ausgeführt, bevor "Worksheet_Change" beendet wird.
Das kann man ggf. unterdrücken, indem "Application.EnableEvents" zu beginn der "WorkSheet_Change" -Prozdur auf False und am Ende auf True gesetzt wird, oder indem man die Bildschirmaktualisierung in der "Worksheet_SelectionChange"-Prozedur mit einer Variablen steuert, die in der "WorkSheet_Change" gesetzt wird. Welche Variante du benötigst hängt davon ab, ob die ""WorkSheet_SelectionChange" ausgeführt werden soll, wenn das Makro "WorkSheet_Change" eine der Zielzellen selektiert.
Hier Beispielhaft die Steuerung Via Variable.
Private bolNoScreenUp As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A, B, C, D, E, F, G, h, i, J, K, l, m, N, o, P, Q, R, S, T As Long
On Error GoTo C:
Application.ScreenUpdating = False
bolNoScreenUp = True
Select Case Target.Column
Case 2: Target.Offset(0, 1).Select
Case 3: Target.Offset(0, 1).Select
Case 4:
If Range("o3") = 2 Then
i = 0
J = 3
Else
i = 0
J = 2
End If
Target.Offset(i, J).Select
Case 5: Target.Offset(0, 1).Select
Case 6:
End Select
C:
Application.ScreenUpdating = False
bolNoScreenUp = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'    Exit Sub
Application.EnableEvents = False  '? True setzen nicht unbedingt sinnvoll am Beginn eines  _
Ereignismakros
If bolNoScreenUp = False Then Application.ScreenUpdating = False
'Test
For i = 1 To 100
ActiveCell.Offset(1, 0).Select
Next
ActiveCell.Offset(-100, 0).Select
If bolNoScreenUp = False Then Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Problem 2 - gelöschte Objekte überspringen
Das kann man nur über angepasste Fehlerbehandlung lösen. Da du hier direkt mit den Objektnamen arbeitest darfst du
Die Anweisung "Option Explicit" am Beginn des Moduls "DieseArbeitsmappe" nicht verwenden, da sonst direkt ein Variablenfehler angezeigt wird.
Nachfolgend ein Beispiel für die Fehlerbehandlung. Den Wert von Fehler muss du dann ggf. entsprechend setzen und in den Case-Anweisungen ergänzen, um den Ablauf im Makro zu steuern.
'Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Fehler As Integer, bolSaved As Boolean
On Error GoTo Fehler
bolSaved = Me.Saved
Fehler = 1
Tabelle1.Visible = xlSheetVeryHidden
Fehler = 2
If bolSaved = True Then Me.Save
Fehler:
With Err
Select Case .Number
Case 0 'alles ist ok
Case 424 'Objekt fehlt
Select Case Fehler
Case 1
Resume Next
Case 2
End Select
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub

Gruß
Franz

Anzeige
Vielen Dank Franz!!!
13.04.2013 20:04:47
Albert
Hallo Franz,
vielen herzlichen Dank für die ausführliche Antwort. Ich werde heute wahrscheinlich nicht mehr die Zeit finden, Deine Anweisungen umzusetzen. Wahrscheinlich erst nächste Woche, ich werde jedenfalls über das Ergebnis berichten.
Nochmals vielen Dank und schönen Abend
Albert

Anzeige
AW: Es funktioniert, vielen, vielen Dank Franz!!!
13.04.2013 20:20:52
Albert
Hallo Franz,
das mit der Bildschirmaktualisierung konnte ich noch umsetzen, es funktioniert. "Wunderbar!!!"
Vielen herzlichen Dank, ich hatte bereits viele Stunden in die Fehlersuche investiert.
Ich werde selbstverständlich auch über das Ergebnis meines zweiten Problems berichten.
Schönen Abend
Albert
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Anwendung von Application.ScreenUpdating = False in Excel VBA


Schritt-für-Schritt-Anleitung

Um die Bildschirmaktualisierung in Excel VBA zu deaktivieren, damit während der Ausführung von Makros kein Flackern auftritt, kannst du die folgende Struktur verwenden:

  1. Anwendung von Application.ScreenUpdating:

    Sub BeispielMakro()
       Application.ScreenUpdating = False
       ' Dein Code hier
       Application.ScreenUpdating = True
    End Sub
  2. Verwendung in Ereignismakros: Wenn du mit Ereignismakros arbeitest, wie Worksheet_Change oder Worksheet_SelectionChange, stelle sicher, dass die Bildschirmaktualisierung am Ende wieder aktiviert wird.

  3. Vermeidung von Select: Versuche, die Verwendung von Select zu minimieren, um die Ausführungsgeschwindigkeit zu erhöhen und unerwünschtes Flackern zu vermeiden.


Häufige Fehler und Lösungen

  • Problem: Application.ScreenUpdating = False funktioniert nicht
    Wenn die Bildschirmaktualisierung nicht wie erwartet funktioniert, stelle sicher, dass du sie am Ende deines Makros wieder aktivierst. Wenn du in ein anderes Makro verzweigst, könnte die Bildschirmaktualisierung fälschlicherweise aktiviert werden.

  • Lösung: Verwende eine Variable, um die Steuerung zu verwalten:

    Private bolNoScreenUp As Boolean
    
    Private Sub Worksheet_Change(ByVal Target As Range)
       Application.ScreenUpdating = False
       bolNoScreenUp = True
       ' Dein Code hier
       If bolNoScreenUp = False Then Application.ScreenUpdating = True
    End Sub
  • Problem: Flackern bei Worksheet_SelectionChange
    Wenn ein Flackern auftritt, kann dies an der Art liegen, wie die Ereignisse ausgelöst werden. Setze Application.EnableEvents vorübergehend auf False.


Alternative Methoden

  • Verwendung von DoEvents: Wenn du sicherstellen möchtest, dass Excel während der Ausführung des Makros responsive bleibt, kannst du DoEvents verwenden, um die Verarbeitung von Ereignissen zu ermöglichen.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um sicherzustellen, dass die Bildschirmaktualisierung auch bei Fehlern deaktiviert bleibt.


Praktische Beispiele

  1. Beispiel für die Verwendung von Application.ScreenUpdating:

    Sub Beispiel()
       On Error GoTo Fehler
       Application.ScreenUpdating = False
       ' Hier wird etwas getan
       Application.ScreenUpdating = True
       Exit Sub
    Fehler:
       Application.ScreenUpdating = True
    End Sub
  2. Behandlung von gelöschten Objekten:
    Um sicherzustellen, dass dein Makro bei gelöschten Objekten nicht abstürzt:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
       On Error Resume Next
       Tabelle1.Visible = xlSheetVeryHidden
       On Error GoTo 0
    End Sub

Tipps für Profis

  • Minimiere den Einsatz von Select und Activate: Dies macht deine Makros schneller und zuverlässiger.
  • Nutze With...End With: Dies kann die Lesbarkeit deines Codes erhöhen und die Ausführung beschleunigen.
  • Dokumentiere deinen Code: Füge Kommentare hinzu, um die Funktionsweise deines Codes zu erklären, besonders wenn du komplexe Logik verwendest.

FAQ: Häufige Fragen

1. Warum funktioniert Application.ScreenUpdating = False nicht immer?
Es gibt bestimmte Excel-Anweisungen, die das Flackern nicht vollständig unterdrücken können, vor allem wenn du zwischen mehreren Makros verzweigst.

2. Wie kann ich sicherstellen, dass die Bildschirmaktualisierung immer wieder aktiviert wird?
Stelle sicher, dass du Application.ScreenUpdating = True in jedem Exit-Punkt deines Makros aufrufst, auch im Fehlerfall.

3. Was soll ich tun, wenn ich mit vielen Bedingungen arbeite?
Verwende eine strukturierte Logik wie Select Case, um die Lesbarkeit zu verbessern und die Anzahl der Bedingungen einfach zu handhaben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige