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

Forumthread: 2 x Worksheet_Change in der gleichen Tabelle

2 x Worksheet_Change in der gleichen Tabelle
09.07.2007 21:38:07
Peter
Guten Abend
Habe Probleme mit Worksheet_Change. Der erste

Sub funktionierte, bis ich versuchte einen 2. zu integrieren. Anscheinend verträgt es nicht  _
gleichzeitig zwei (zumindest auf diese Art). Ich möchte jedoch einen Code auslösen, wenn im Bereich C8:C1000 eine Änderung geschieht und zusätzlich, wenn im Range "EndDat" eine Änderung geschieht.
Ob ich dann die Formel auf diese Art eintragen kann, ist wohl fraglich, doch ich kann es noch  _
nicht probieren, wegen dem erst genannten Problem.
Danke für ein Feedback.
Peter


Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Set Bereich = Range(Cells(8, 3), Cells(1000, 3))
If Not Intersect(Target, Bereich) Is Nothing Then Exit Sub
Application.StatusBar = Prüfung(Range(Cells(8, 3), Cells(1000, 3)), 1)  ‘User definierte  _
Funktion
End Sub



Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Set Bereich = Range("EndDat").Address
If Not Intersect(Target, Bereich) Is Nothing Then Exit Sub
'=WENN(ODER(MONAT(G9)>MONAT(G8);JAHR(G8)>JAHR(G9));G9;"")  'entspricht der Formel in A9
Range("EndDat") = "=IF(OR(MONTH(R[-1]C[6])>MONTH(RC[6]),YEAR(R[-1]C[6])>YEAR(RC[6])),RC[6],"""") _
End Sub


Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2 x Worksheet_Change in der gleichen Tabelle
09.07.2007 21:47:37
{Boris}
Hi Peter,
2 mal das selbe Ereignis geht natürlich nicht.
Mach´s in der Art:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Bereich1) Is Nothing Then
Call Routine1 'oder schreib´s direkt in den Code
ElseIf Not Intersect(Target, Bereich2) Is Nothing Then
Call Routine2
End If
End Sub


Grüße Boris

Anzeige
AW: 2 x Worksheet_Change in der gleichen Tabelle
09.07.2007 21:51:07
Peter
Hallo Boris
Vielen Dank!
Kannst du mir noch den Unterschied erklären zwischen
Sub Worksheet_Change(ByVal Target As Range) und
Private Sub Worksheet_Change(ByVal Target As Range)
Danke
Peter

AW: 2 x Worksheet_Change in der gleichen Tabelle
09.07.2007 22:13:00
Daniel
Hi
Private Subs können nur von Makros im gleichen Modul aufgerufen werden.
Fehlt Private oder steht Public davor, können auch Makros aus anderen Modulen oder der Anwender direkt über die Menüfunktion auf das Makro zugreifen (der letzte Fall geht aber nur, wenn keine Variablen an das Makro übergeben werden.)
Gruß, Daniel

Anzeige
AW: vielen Dank, owT
09.07.2007 22:16:09
Peter

AW: 2 x Worksheet_Change in der gleichen Tabelle
09.07.2007 21:49:58
Daniel
Hi
generell darf ein Makro-Name nur einmal vergeben werden.
Ist bei Computerprogrammen halt so, da muß alles eindeutig sein, da bilden auch die Eventgesteuerten Makros keine ausnahme.
Du mußt also beide Makros in eines zusammendfassen und dann über eine entsprechende IF THEN oder SELECT CASE - Programmierung den ablauf entsprechend steueren.
In deinem Fall dann so:

Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich1 As Range
Dim Bereich2 as range
Set Bereich1 = Range(Cells(8, 3), Cells(1000, 3))
If  Intersect(Target, Bereich1) Is Nothing Then
Application.StatusBar = Prüfung(Range(Cells(8, 3), Cells(1000, 3)), 1)
end if
Set Bereich2 = Range("EndDat").Address
If Intersect(Target, Bereich) Is Nothing Then
'=WENN(ODER(MONAT(G9)>MONAT(G8);JAHR(G8)>JAHR(G9));G9;"")  'entspricht der Formel in A9
Range("EndDat") = "=IF(OR(MONTH(R[-1]C[6])>MONTH(RC[6]),YEAR(R[-1]C[6])>YEAR(RC[6])),RC[6],"" _
"") _
end if
End Sub


Gruß, Daniel

Anzeige
AW: 2 x Worksheet_Change in der gleichen Tabelle
09.07.2007 21:51:59
Peter
Hallo Daniel
Besten Dank.
Peter
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Verwendung von Worksheet_Change in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.
  2. Füge ein Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (dein Arbeitsblattname)" und wähle "Einfügen" > "Modul".
  3. Erstelle eine Subroutine: Verwende die folgende Struktur für deine Worksheet_Change-Ereignisprozedur:

    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim Bereich1 As Range
       Dim Bereich2 As Range
       Set Bereich1 = Range(Cells(8, 3), Cells(1000, 3))
       Set Bereich2 = Range("EndDat")
    
       If Not Intersect(Target, Bereich1) Is Nothing Then
           ' Aktion für Bereich1
       ElseIf Not Intersect(Target, Bereich2) Is Nothing Then
           ' Aktion für Bereich2
       End If
    End Sub
  4. Definiere die Aktionen: Füge die gewünschten Aktionen für jeden Bereich hinzu, z.B.:
    Application.StatusBar = Prüfung(Bereich1, 1) ' Beispiel für eine benutzerdefinierte Funktion
    Range("EndDat") = "=IF(OR(MONTH(...), YEAR(...)), ... , """")"

Häufige Fehler und Lösungen

  • Fehler: "Sub oder Function nicht definiert"
    Lösung: Stelle sicher, dass alle verwendeten Funktionen korrekt definiert sind und keine Tippfehler vorliegen.

  • Fehler: "Ereignis nicht gefunden"
    Lösung: Überprüfe die Subroutine und achte darauf, dass sie korrekt geschrieben ist. Verwende Private Sub Worksheet_Change(...) für das Event.

  • Problem mit mehreren Worksheet_Change
    Lösung: Du kannst nicht mehrere Sub Worksheet_Change-Prozeduren in derselben Tabelle haben. Kombiniere sie in einer einzigen Prozedur mit If...ElseIf.


Alternative Methoden

  • Verwendung von Formeln: Anstatt VBA zu verwenden, kannst du auch Excel-Formeln nutzen, um Änderungen in bestimmten Zellen zu überwachen.
  • Datenvalidierung: Du kannst die Datenvalidierungsfunktion von Excel verwenden, um Benutzer daran zu hindern, ungültige Daten einzugeben.

Praktische Beispiele

Beispiel 1: Pruefung des Datenbereichs

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Bereich As Range
    Set Bereich = Range(Cells(8, 3), Cells(1000, 3))

    If Not Intersect(Target, Bereich) Is Nothing Then
        Application.StatusBar = Prüfung(Bereich, 1)
    End If
End Sub

Beispiel 2: Berechnung basierend auf einer Bedingung

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Bereich As Range
    Set Bereich = Range("EndDat")

    If Not Intersect(Target, Bereich) Is Nothing Then
        Range("EndDat") = "=IF(OR(MONTH(...), YEAR(...)), ... , """")"
    End If
End Sub

Tipps für Profis

  • Verwende Application.EnableEvents = False: Um zu verhindern, dass die Worksheet_Change-Prozedur erneut ausgelöst wird, wenn du während der Ausführung Änderungen vornimmst.
  • Debugging: Nutze das Debug.Print-Kommando, um den Status von Variablen im Direktfenster zu überprüfen.
  • Optimierung: Halte den Code schlank und vermeide unnötige Berechnungen innerhalb der Worksheet_Change-Ereignisprozedur, um die Leistung zu verbessern.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Sub Worksheet_Change und Private Sub Worksheet_Change?
Private Sub Worksheet_Change kann nur von Makros im gleichen Modul aufgerufen werden, während Sub Worksheet_Change auch von anderen Modulen oder durch Benutzeraktionen aufgerufen werden kann.

2. Wie kann ich mehrere Bereiche in einem Worksheet_Change überwachen?
Verwende die Intersect-Funktion, um mehrere Bedingungen mit If...ElseIf zu steuern, wie im Schritt-für-Schritt-Anleitung gezeigt.

3. Was mache ich, wenn mein Code nicht funktioniert?
Überprüfe auf Tippfehler, stelle sicher, dass die Bereiche korrekt definiert sind, und halte die Debugging-Tools bereit, um den Fehler zu identifizieren.

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