Excel stürzt mit Code ab !?

Hallo

Möchte mit folgendem Code einen Werte, wenn er aus der Zelle gelöscht wird, wieder zurückschreiben. Habe mir was gebastelt, aber dummerweise
wird die gesamte Mappe geschlossen… keine Ahnung wieso !!

Hier der Code:

Private Sub Worksheet\_Change(ByVal Target As Range)

Actcell = ActiveCell.Value

Set rngNamen = Range(Cells(1, 1), Cells(500, 6))

If Not Intersect(Target, rngNamen) Is Nothing Then
 Target.Value = Actcell
End If

End Sub

Weiss jemand rat.

Danke
Flexo

Hi,

das Zurückschreiben in die Zelle ist auch eine Änderung, wodurch deine Routine immer wieder aufgerufen wird.

powerblue

Hallo Flexo,

Möchte mit folgendem Code einen Werte, wenn er aus der Zelle
gelöscht wird, wieder zurückschreiben.

das geht mit diesem Code nicht. In dem Moment wo die Change-Prozedur gestartet wird ist der Wert in der Zelle schon gelöscht, also für die Prozedur unbekannt, wie willst du ihn denn dann „zurückschreiben“?

Das geht anders. Du brauchst zusätzlich die Ereignisprozedur
Worksheet_SelectionChange
Damit mußt du dir bei Erreichen einer Zelle deren Inhalt merken, in einer globalen Variablen oder in einer Zelle oder in Excel selbst.

Dann erst kannst du in der Change-Prozedur abbrüfen ob da gelöscht wurde und dann den gespeicherten zellwert „zurückschreiben“

Das mal weglassend wird dein Code auf unterschiedlichen PCs unterschiedlich laufen, je nach Einstellungen in den Exceloptionen.
Schau mal in der Vba-Hilfe nach diesen beiden befehlen
Application.MoveAfterReturn = True
Application.MoveAfterReturnDirection = xlToRight
dann weißt du was ich damit meine.

Habe mir was gebastelt, aber dummerweise
wird die gesamte Mappe geschlossen… keine Ahnung wieso !!

Die blaue Macht :smile: hat ja schon korrekt auf die potentielle Endlosschleife die du fabriziert hast hingewiesen.
Bau mal
Application.EnableEvents = False
und
Application.EnableEvents = True
in deinen Code ein.

Wenn ich deinen Code bei mir (XL 2000) laufen lasse wobei ich vor der Set-Zeile dies eingefügt habe
Range(„H1“).Value = Range(„H1“).Value + 1
so wird H1 um 20706 erhöht, dann hat wohl Vba keinen Bock mehr auf die Endlosschleife :smile:
Aber weder stürzt Excel ab noch wird die Mappe geschlossen o.ä.

Warum bei dir die Mappe geschlossen wird kann viele Gründe haben.
Entgegen der Brettbeschreibung verschweigst du deine XL-Version, ergo kann dir auch keiner helfen der die gleiche Version wie du hat indem er mal den Code testet und dir sagt was bei ihm geschieht.

Kann auch locker sein du hast eine Mappe mit vielen volatilen Funktionen, da kann Excel schonmal außer Puste kommen wenn es da 20.000 mal alles schnell neu berechnen muß in der ganzen mappe.
Gibt aber noch mehr Gründe für so ein Verhalten von Excel.

Gruß
Reinhard

Hi Reinhard

Vielen Dank für die Erklärungen, muss da wohl noch einwenig lesen.

Ich lasse mir jetzt wie Du beschrieben hast per SelectionChange den Wert in eine Variable lesen.

Option Explicit
Dim ActCell As String

Public Sub Worksheet\_SelectionChange(ByVal Target As Range)

ActCell = ActiveCell.Value

End Sub





Private Sub Worksheet\_Change(ByVal Target As Range)
Dim rngNamen As Range

Set rngNamen = Range(Cells(1, 1), Cells(100, 1))

If Not Intersect(Target, rngNamen) Is Nothing Then Target = ActCell

End Sub

Dummerweise kommt jetzt ein Laufzeitfehler -2147417848 ???
Die Methode ‚_Default‘ für das Object ‚Range‘ ist fehlgeschlagen.

Sollte doch laufen oder ?

Danke Flexo

Hi

das Zurückschreiben in die Zelle ist auch eine Änderung,
wodurch deine Routine immer wieder aufgerufen wird.

Stimmt, aber irgendwie sollte das doch machbar sein.

Gruss
Flexo

Hi Reinhard

Mit

Application.Event = False

Code aus WorkSheet_Change

Application.Event = False

funktionierts. Kannst Du mir bitte auch sagen wieso ? Schaltest Du damit
ein nochmaligen Durchlauf von WorkSheet_Change ab ? Könnte man das auch mit Exit Sub machen ?

Danke & Gruss
Flexo

Worksheet_Change ruft sich selbst auf
Hallo Flexo,

Application.Event = False
Code aus WorkSheet_Change
Application.Event = False

funktionierts. Kannst Du mir bitte auch sagen wieso ?
Schaltest Du damit
ein nochmaligen Durchlauf von WorkSheet_Change ab ?

ja. Alle Ereignisse die dir im Klassenmodul des Tabellenblattes „angeboten“ werden werden mit =False deaktiviert.
Das zweite = false ist falsch, es muß = True lauten sonst klappt das Change-Ereignis nur einmal.

Könnte man das auch mit Exit Sub machen ?

Nein. Wo willste das hinschreiben (jetzt ohne EnableEvents gedacht)?
Vor
If Not Intersect(Target, rngNamen) Is Nothing Then Target = ActCell
oder danach?
Vor der Codezeile bringt dir nix dann wird sie nie ausgeführt.
Danach bringt dir auch nix. Denn dann wird sie auch nie ausgeführt, von mir aus einmal wenn Excel „aufgibt“ in der Endlosschleife.

Setze mal Exit Sub nach der Codezeile, dann einen haltepunkt bei
If Not Intersect(…

Und schau dir mit F5/F8 an was geschieht…

Gruß
Reinhard

Hi Reinhard,

Stimmt, das 2te False ist auf True (Copy/Paste) Fehler.

Vielen Dank
Flexo