Ereignisbehandlung ausschalten
23.02.2012 11:52:35
Erich
Hi Angelika,
eine Frage: Soll Worksheet_Change in Blatt Daten1 auch dann laufen, wenn die Änderungen nicht duch Eingabe,
sondern durch ein anderes Makro (z. B. Archivieren) vorgenommen werden?
Wenn nicht, solltest du vor den Makroaktionen auf dem Blatt die Ereignisbehandlung abschalten.
Das geht mit Application.EnableEnvents = False
Danach muss man die Ereignisbehandlung wieder einschalten mit Application.EnableEnvents = True
Archivieren() würde dann vielleicht so aussehen:
Private Sub Archivieren()
' Aus Tabelle Daten1 die zu archivierenden Datensätze in Tabelle Archiv verschieben
Dim bereich As Range, Zeilen As Object, Zähler As Long
Dim Zelle As Range, i As Long, ziel As Range, Arr As Variant
Set Zeilen = CreateObject("Scripting.Dictionary")
Set bereich = Me.Range("AA40:AA" & Me.Range("AA" & Rows.Count).End(xlUp).Row)
For Each Zelle In bereich.Cells
If LCase(Zelle.Text) = LCase("X") Then
Set Zeilen(Zähler) = Zelle.Offset(0, 11 - Zelle.Column).Resize(1, 23)
Zähler = Zähler + 1
End If
Next Zelle
If Zähler = 0 Then Exit Sub
Zähler = Zähler - 1
Set ziel = Sheets("Archiv").Range("A65536").End(xlUp).Offset(1, 0)
Application.EnableEvents = False ' Ereignisbehandlung ausschalten
'Werte übertragen
Application.ScreenUpdating = False
For i = 0 To Zähler
Arr = Zeilen(i).Value
ziel.Resize(1, Zeilen(i).Cells.Count).Value = Arr
Set ziel = ziel.Offset(1, 0)
Next i
'Werte löschen
For i = Zähler To 0 Step -1
Zeilen(i).EntireRow.Clear
Next i
Application.EnableEvents = False ' Ereignisbehandlung einschalten
Zeilen.RemoveAll
Set Zeilen = Nothing
Set bereich = Nothing: Set Zelle = Nothing
Set ziel = Nothing
Application.ScreenUpdating = True
End Sub
Übrigens: Option Explicit als erste Zeile in jedem Modul ist nur zu empfehlen.
Und Wörter, die schon in Excel als Namen von Funktionen usw. auftreten,
würde ich nicht als Variablennamen verwenden (z. B. Zeilen, Zelle).
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich