VBA EXCEL 2003 Worksheet_change

Hallo Experten.

ich habe nun schon viel gelesen, aber jetzt bin ich auch mal am Ende meiner bescheidenen Weisheit. Dank eurer vielen hinweise habe ich folgenden Code bei mir:

Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim zelle As Range
Set zelle = Intersect(Target, Range(„B1:B36000“))

zahlen

End Sub

Das funktioniert auch soweit. Allerdings wird der Prozess „zahlen“ immer ausgeführt, sobald auf dem gesamten Tabellenblatt eine Aktion stattfindet. Ich meine, dass ich eigentlich durch

Set zelle = Intersect(Target, Range(„B1:B36000“))

definiert habe, dass „zahlen“ nur ausgeführt werden soll, wenn in Spalte B etwas geändert wird (hier bisher B1:B36000, aber ginge theoretisch auch B:B ??)

Wo ist der Fehler? Weitere Fragen beantworte ich gerne umgehend.

Meine Vermutung: Ich habe zwar zelle definiert, aber keinerlei Abfrage, wo die Aktion stattfindet.

Grüße.

Hallo kackei

frag doch ab, ob sich Target in Spalte B befindet. Z.B. so:

Sub Worksheet\_SelectionChange(ByVal Target As Range)
 If Target.Column = 2 Then zahlen
End Sub

Ich habs nicht getestet, aber so oder so ähnlich müsste es funktionieren.

Gruß, Andreas

Hallo Andreas.

Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 2 Then zahlen
End Sub

Ich habs nicht getestet, aber so oder so ähnlich müsste es
funktionieren.

Danke für die Idee. Brauchst du auch nicht zu probieren - es funktioniert. Weißt du, warum meine Versin nicht funktioniert hat (nur so aus Interesse)?

Grüße und Danke.

Hallo Ei :smile:,

Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim zelle As Range
Set zelle = Intersect(Target, Range(„B1:B36000“))
zahlen
End Sub

Das funktioniert auch soweit. Allerdings wird der Prozess
„zahlen“ immer ausgeführt, sobald auf dem gesamten
Tabellenblatt eine Aktion stattfindet.

Vba macht genau das was du ihm im Code festgelegt hast. Und da steht daß „Zahlen“ bei jedem markierungswechsel durchgeführt werden soll.

Ich meine, dass ich
eigentlich durch
Set zelle = Intersect(Target, Range(„B1:B36000“))
definiert habe, dass „zahlen“ nur ausgeführt werden soll, wenn
in Spalte B etwas geändert wird

Nein. „zahlen“ ist es egal was du davor mit Set machst.

Wenn müßte „zahlen“ nur aufgrund einer erfüllten If-Bedingung o.ä. ausgelöst werden.
Dazu hast du ja schon eine Lösung.

(hier bisher B1:B36000, aber
ginge theoretisch auch B:B ??)

Sag ich nicht *grien*, diese unheimlich schwere Frage mußt du schon selbst ausprobieren.

Meine Vermutung: Ich habe zwar zelle definiert, aber keinerlei
Abfrage, wo die Aktion stattfindet.

Richtig.
Somit sind die zwei Codezeilen mit „zelle“ im Code sinnlos.

Sinn hätten sie ggfs. so:

Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim zelle As Range
Set zelle = Intersect(Target, Range(„B1:B36000“))
if Not Zelle is nothing then call zahlen
End Sub

Gruß
Reinhard

Hallo kackei,

in deinem Code hast du zwar der Variablen Zellen durch „Intersect“ einen Range zugewiesen. Das hat aber nichts damit zu tun, ob hinterher die Funktion zahlen aufgerufen wird. Die wird in deinem Code immer aufgerufen, egal, was da vorher steht. Wenn „zahlen“ nur unter bestimmten Bedingungen aufgerufen werden soll, musst du mit If … Then arbeiten.

Gruß, Andreas

Hallo Reinhard.

Ich arbeite so ziemlich nie mit Set, deshalb wahrschienlich auch der logische Fehler. Ich habe inzwischen den Vorschlag von Andreas umgesetzt. Der ist auch so schön kurz - das magst du ja so am VBA *grins*

Aber danke für die Erklärung - wieder etwas gelernt.

Grüße und Dank.

Hallo Kackei.

definiert habe, dass „zahlen“ nur ausgeführt werden soll, wenn
in Spalte B etwas geändert wird

Geändert wird?

Wie Reinhard schon schrieb: Deine Prozedur wird bei jeder Änderung der Markierung ausgeführt.
Wenn Deine Prozedur nur bei einer Änderung aufgerufen werden soll, dann solltest Du besser das „Worksheet_Change“-Ereignis benutzen. Z.B. so:

Select Case Target.Column
 Case 2 'Spalte B
 zahlen
End Select

Wenn Du die Zeilen auch noch eingrenzen willst, kannst Du auch zwei Select-Blöcke ineinander verschachteln.

Falls die Prozedur „zahlen“ selbst eine Änderung auf dem Blatt hervorruft, solltest Du vor dem Aufruf dieser Prozedur „Application.EnableEvents = False“ eingeben, sonst ist das Ganze am Ende noch rekursiv.

VG
Carsten