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