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

Worksheet_Change(ByVal Target As Range) funktioniert nicht

Forumthread: Worksheet_Change(ByVal Target As Range) funktioniert nicht

Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 15:48:02
Klaus
Hallo,

ich habe ein Tabellenblatt dass in bestimmten Bereichen mittels Makros mit Formeln gefüllt wird, wenn jemand dort eine Zelle löscht.

Das hat bisher immer funktioniert. Nun stelle ich fest, dass dies nur noch eingeschränkt geht. Warum habe ich noch nicht verstanden.

Wenn ich die Datei schließe und Excel (2024er) neu starte, funktioniert das Makro wieder. Wann es dann "aussteigt" und warum - keine Ahnung.


Makro liegt direkt im Haupttabellenblatt (Diese Arbeitsmappe) und
fängt so an:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fehler


Application.EnableEvents = False
ActiveSheet.Unprotect

Dim objRange1 As Range, objCell1 As Range
Set objRange1 = Intersect(Target, Cells(5, 2).Resize(100, 1))

If Not objRange1 Is Nothing Then
For Each objCell1 In objRange1
With objCell1
Select Case UCase$(.Value)
Case Is = "":
.Offset(0, 2).Value = vbNullString
.Offset(0, 3).Value = vbNullString
.Offset(0, 11).Value = 0
.Offset(0, 12).Value = vbNullString

usw. usw.

Kennt jemand das Problem???

Danke!!!
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 15:56:54
RPP63
Moin!
Dein Problem liegt am usw. usw. …
Genauer:
Du schaltest die Events aus und sehr wahrscheinlich nicht (korrekt) wieder ein.
Jedenfalls deutet die Tatsache, dass es nach einem Neustart der Appplication wieder funktioniert, darauf hin.

Gruß Ralf
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 18:48:09
daniel
Hi

wie schon geschrieben wurde, wenn ein Fehler auftritt, dann überspringt der Fehlersprung das Einschalten der Events, und damit bleiben sie ausgeschaltet.

Mein tipp:
Versuche ohne Fehlersprünge auszukommen.

Das Problem ist, dass Set x = Intersect() halt einen Fehler erzeugt, wenn Intersect keinen Treffer findet (das ist anders als bei .FIND)

daher nicht so:
Set objRange1 = Intersect(Target, Cells(5, 2).Resize(100, 1))

If Not objRange1 Is Nothing Then

sondern so
If Not  Intersect(Target, Cells(5, 2).Resize(100, 1)) Is Nothing Then

Set objRange1 = Intersect(Target, Cells(5, 2).Resize(100, 1))

es ist zwar etwas blöd, dass man das Intersect hier zweimal ausführen muss, aber so ist es nunmal.
alternativ höchsten so:
On Error Resume Next

Set objRange1 = Intersect(Target, Cells(5, 2).Resize(100, 1))
On Error Goto 0
If Not objRange1 Is Nothing Then


ich würde auch das ausschalten der Events nicht gleich am Anfang machen, sondern erst dort, wo du es wirklich brauchst und nachdem du alle bekannten Fehlermöglichkeiten abgeprüft hat, dh dort, wo eigentlich keine Fehler mehr passieren sollten.

Private Sub Worksheet_Change(ByVal Target As Range)


ActiveSheet.Unprotect
Dim objRange1 As Range, objCell1 As Range
If Not Intersect(Target, Cells(5, 2).Resize(100, 1)) Is Nothing Then
Set objRange1 = Intersect(Target, Cells(5, 2).Resize(100, 1))
For Each objCell1 In objRange1
With objCell1
Select Case UCase$(.Value)
Case Is = ""
Application.EnableEvents = False
.Offset(0, 2).Value = vbNullString
.Offset(0, 3).Value = vbNullString
.Offset(0, 11).Value = 0
.Offset(0, 12).Value = vbNullString
Application.EnableEvents = True
end Select
End With
next
end if
end Sub

dann brauchst du den Fehlersprung nicht.
sollte unverhofft an anderer Stelle ein Fehler passieren, dann sind die Events ja nicht ausgeschaltet

Gruß Daniel



Anzeige
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 20:52:41
Klaus
Hallo Daniel,

Du schriebt, es wäre besser RC zu verwenden. Hab ich noch nie gemacht. Kannst Du mir hier helfen?

Dim objRange0 As Range, objCell0 As Range
If Not Intersect(Target, Cells(5, 3).Resize(100, 1)) Is Nothing Then
Set objRange0 = Intersect(Target, Cells(5, 3).Resize(100, 1))
For Each objCell0 In objRange0
With objCell0
Select Case UCase$(.Value)
Case Is = ""
Application.EnableEvents = False
.FormulaLocal = "=WENN(ISTLEER(@INDIREKT(""B""&ZEILE()));"""";""PUM"")"
Application.EnableEvents = True
End Select
End With
Next
Set objRange0 = Nothing
End If

Wie müsste die Formel aussehen, wenn ich hier RC verwenden möchte...
Anzeige
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 21:15:56
daniel
Hi

1. Schreibe die Formel von Hand in die Zelle, so wie sie sein soll und auch funktioniert, ganz normal auf Deutsch.
Einziger Unterschied: Setze alle Adressen oder Adressteile (Zeile oder Spalte), die nicht zwingen relativ sein müssen, auf absolut ($ davor) und lass nur die relativ, die zwingend relativ sein müssen.

also in deinem Fall, nehmen wir an in die erste Datenzeile, also C5:

=WENN(ISTLEER($B5);"";"PUM")

2. gehe dann in im Edtior ins Direktfenster und gib dort, nachdem du die Zelle selektiert hast, den Befehl
?Selection.FormulaR1C1 ein oder noch besser ?Replace(Selection.FormulaR1C1, """", """""")

dann bekommst du den Formeltext in FormulaR1C1 für VBA, den du dort direkt einsetzen kannst, in der zweiten Version auch gleich mit gedoppelten Anführungszeichen.
diesen kopierst du und fügst ihn dann hier ein (für die ...):
.FormulaR1C1 = "..."

das hat jetzt mehrere Vorteile:
a) der Formeltext ist englisch und somit funktioniert dein Makro in jeder Länderversion, mit .FormulaLocal funktioniert das Makro nur in einem deutschen Excel
b) mit den R1C1-Adressen anstelle der üblichen A1-Adressen (R=Zeile, C=Column, danach die Zeilen- oder Spaltennummer, für relative Zellbezüge der Zeilen- oder Spaltenversatz in eckigen Klammern, bei Bezug auf die gleiche Ziele oder Spalte [0], darf die Angabe auch ganz weggelassen werden.
Der Vorteil ist, dass die Formel in R1C1 immer die gleiche bleibt, egal in welche Zelle sie geschrieben wird, weil man hier eben die relativen Zellbezüge auch relativ beschreibt und nicht absolut wie in den A1-Adressen

Gruß Daniel
Anzeige
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 22:22:23
Klaus
Hallo Daniel,

vielen Dank für Deine Hilfe. Schon interessant, was alles geht, wenn man es weiss.

Mal schauen, wie weit ich (morgen) komme :-)...
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 19:49:12
Klaus
Hallo Daniel,

klingt gut, werde ich gleich mal angehen... Danke!!!
AW: Worksheet_Change(ByVal Target As Range) funktioniert nicht
10.01.2026 16:26:24
Klaus
Hallo Ralf,

die Funktion ging bisher ohne Probleme...

der Makro endet mit...

Application.EnableEvents = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowSorting:=True

Fehler:
With Err
If .Number > 0 Then
MsgBox "Fehler-Nr. " & .Number & vbLf & .Description & vbLf & .HelpContext
.Clear
End If
End With

End Sub

Ist da ein Fehler zu sehen?

Wenn zwischendrin was nicht OK wäre, müsste zudem die Fehlerroutine ansprechen. Da kommt aber nix....
Anzeige
Ist da ein Fehler zu sehen?
10.01.2026 16:30:38
RPP63
Es ist exakt das, was ich vermutet habe!
Application.EnableEvents = True muss zwingend nach der Sprungmarke Fehler: stehen.
Ansonsten wird es bei einem Abflug eben nicht wieder eingeschaltet!

Gruß Ralf
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18