Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Für Profis:Worksheet_Change und SelectionChange

Forumthread: Für Profis:Worksheet_Change und SelectionChange

Für Profis:Worksheet_Change und SelectionChange
11.11.2003 09:09:58
Benni
Hallo Leute!

Hatte mich gestern schon einmal an das Forum gewand, weil ich 2 verschiedene Worksheet_Change- Ereignisse verwirklichen wollte. Yal gab mir den Tipp, das Zweite mit Worksheet_selectionChange zu verarbeiten (Danke nochmal), aber das Problem ist, daß dann das Ereignis schon beim Auswählen der Zelle eintritt, nicht nach der Änderung!

Hier der Code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim vNew As Variant, vold As Variant
Dim irow As Integer
If Not Application.Intersect(Target, Range("A15:aq50")) Is Nothing Then
vNew = Target.Value
Application.EnableEvents = False
On Error GoTo errorhandler
With Worksheets("Protokoll")
irow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Unprotect password:=""
.Cells(irow, 1).Value = Target.Address(False, False)
.Cells(irow, 2).Value = "Maschinenzahlen"
.Cells(irow, 3).Value = "Auslastung"
.Cells(irow, 4).Value = vNew
.Cells(irow, 5).Value = Date
.Cells(irow, 6).Value = Application.UserName
.Protect password:=""
End With
Else: Exit Sub
End If
errorhandler:
Application.EnableEvents = True
End Sub



Private Sub worksheet_change(ByVal Target As Range)
'Änderung der Maschinenzahl bis ans Ende der Tabelle übernehmen und neuen Wert ins Protokoll übernehmen
Dim r1 As Range
Dim r2 As Range
Dim rGes As Range
Dim Neuwert As Variant
Dim spalte As Integer
Dim Reihe As Integer
If Intersect(Target, Range("c4:aq13")) Is Nothing Then Exit Sub ' GoTo Aenderung
Neuwert = Target.Value
Application.EnableEvents = False
On Error GoTo errorhandler
Reihe = Target.Row
spalte = Target.Column
Worksheets("Maschinenzahlen").Activate
For i = spalte To 43
Cells(Reihe, i).Value = Neuwert
Next i
With Worksheets("Protokoll")
irow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Unprotect password:=""
If irow > 200 Then
.Rows(3).EntireRow.Delete shift:=xlUp '<<<<<
irow = 200
End If
.Cells(irow, 1).Value = Target.Address(False, False)
.Cells(irow, 2).Value = "Maschinenzahlen"
.Cells(irow, 3).Value = "geändert auf:"
.Cells(irow, 4).Value = Neuwert
.Cells(irow, 5).Value = Date
.Cells(irow, 6).Value = BenutzerName1
.Protect password:=""
End With
Hat jemand ne Idee?
MfG Benni

                    
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Für Profis:Worksheet_Change und SelectionChange
11.11.2003 09:17:49
PeterW
Hallo Benni,

prinzipiell löst man das so:

If Bedingung1 then
Code1
End If
If Bedingung2 then
Code2
Endif
Die zweite Bedingung sollte dann lauten:
If Not Intersect(Target, Range("c4:aq13")) Is Nothing Then

Gruß
Peter
Excel kann so einfach sein..., DANKE o.T.!!!
11.11.2003 09:31:30
Benni
oT
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Umgang mit Worksheet_Change und SelectionChange in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Worksheet_SelectionChange erstellen: Erstelle ein neues Makro in deinem Excel-Arbeitsblatt, um das Worksheet_SelectionChange-Ereignis zu implementieren:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       If Not Application.Intersect(Target, Range("A15:AQ50")) Is Nothing Then
           ' Deine Logik hier
       End If
    End Sub
  2. Worksheet_Change einfügen: Füge den Code für Worksheet_Change hinzu, um Änderungen in einem bestimmten Bereich zu überwachen:

    Private Sub Worksheet_Change(ByVal Target As Range)
       If Not Intersect(Target, Range("C4:AQ13")) Is Nothing Then
           ' Deine Logik hier
       End If
    End Sub
  3. Protokollierung hinzufügen: Füge innerhalb der Ereignisse Code hinzu, um Änderungen in einem Protokoll-Worksheet festzuhalten. Verwende Application.EnableEvents = False, um Endlosschleifen zu vermeiden.

  4. Fehlerbehandlung implementieren: Stelle sicher, dass du eine Fehlerbehandlung hast, um sicherzustellen, dass Application.EnableEvents wieder auf True gesetzt wird, selbst wenn ein Fehler auftritt.


Häufige Fehler und Lösungen

  • Ereignis tritt zu früh auf: Wenn das SelectionChange-Ereignis bereits beim Auswählen einer Zelle ausgelöst wird, kann das an der falschen Logik liegen. Überprüfe, ob du Application.Intersect korrekt verwendest.

  • Endlosschleifen: Wenn du beim Ändern einer Zelle das Change-Ereignis erneut auslöst, wird es zu einer Endlosschleife kommen. Setze Application.EnableEvents = False an den Anfang deines Codes.

  • Zugriffsfehler: Wenn du versuchst, auf ein geschütztes Blatt zuzugreifen, stelle sicher, dass du es zuvor entblockierst.


Alternative Methoden

  • Verwendung von Worksheet_Change ohne SelectionChange: Wenn du nur Änderungen an Zellen überwachen möchtest, kannst du direkt Worksheet_Change verwenden, ohne SelectionChange zu benötigen.

  • Nutzung von Formeln: In manchen Fällen kann es effektiver sein, Formeln zu verwenden, um Änderungen zu überwachen, anstatt VBA zu benutzen.


Praktische Beispiele

  1. Änderungen protokollieren:

    Private Sub Worksheet_Change(ByVal Target As Range)
       If Not Intersect(Target, Range("C4:AQ13")) Is Nothing Then
           ' Protokollierungscode
       End If
    End Sub
  2. Überwachen von Auswahländerungen:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       If Not Application.Intersect(Target, Range("A15:AQ50")) Is Nothing Then
           ' Auswahländerungscode
       End If
    End Sub

Tipps für Profis

  • Verwende With-Blöcke: Das kann deinen Code übersichtlicher machen und die Leistung verbessern.

  • Nutze globale Variablen: Wenn du Werte zwischen verschiedenen Ereignissen teilen möchtest, könnten globale Variablen nützlich sein.

  • Debugging: Verwende Debug.Print, um zu verfolgen, was dein Code tut, und um Fehler schnell zu identifizieren.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Worksheet_Change und Worksheet_SelectionChange?
Worksheet_Change wird ausgelöst, wenn der Inhalt einer Zelle geändert wird, während Worksheet_SelectionChange ausgelöst wird, wenn eine andere Zelle ausgewählt wird.

2. Kann ich mehrere Bereiche in einem Worksheet_Change überwachen?
Ja, du kannst mehrere Bereiche mit Union kombinieren oder mehrere Bedingungen mit If-Anweisungen überprüfen.

3. Wie verhindere ich, dass mein Code bei geschützten Blättern Fehler wirft?
Verwende On Error Resume Next, um Fehler zu ignorieren, oder implementiere eine Fehlerbehandlung, die das Blatt vorübergehend entsperrt, um Änderungen vorzunehmen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige