Endlosschleife ?

Moin zusaammen,

ich habe mir gerade eine Endlosschleife gelegt :frowning:
Wenn Zelle c23 aktiviert wird, soll die Schleife durchlaufen werden.
Danach soll wieder c23 die aktive Zelle sein, ohne jedoch die
Schleife nochmal zu durchlaufen.

Option Explicit

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)

 Select Case Target.Address
 Case "$C$23"

 Range("$c$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 Range("$D$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 If Intersect(Target, Range("C23:C23")) Is Nothing Then Exit Sub
 Range("$c$23").Select

 End Select

End Sub

Hat vielleicht jemand eine Idee?

Gruß und danke
Rolf

Grüezi Rolf

ich habe mir gerade eine Endlosschleife gelegt :frowning:
Wenn Zelle c23 aktiviert wird, soll die Schleife durchlaufen
werden.
Danach soll wieder c23 die aktive Zelle sein, ohne jedoch die
Schleife nochmal zu durchlaufen.

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Select Case Target.Address
Case „$C$23“

Range("$c$34").Select
ActiveCell.FormulaR1C1 = „=RC[+3]“
Range("$D$34").Select
ActiveCell.FormulaR1C1 = „=RC[+3]“
If Intersect(Target, Range(„C23:C23“)) Is Nothing
Then Exit Sub
Range("$c$23").Select

End Select

End Sub

Hat vielleicht jemand eine Idee?

Ja, das ist ein Klassiker - bedingt durch die Selektion der Zellen in die Du schreibst. Lass die .Select und .Activate alle weg (in >99% sind sie eh unnätig), dann klappt das Ganze schon mal korrekt.
Und da Du dann die markierte Zelle gar nicht verlässt, ist es auch nicht notwendig, sie am Ende wieder zu selektieren.

Dein Code sieht dann gleich viel schlanker aus:

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)

 Select Case Target.Address
 Case "$C$23"
 Range("C34").FormulaR1C1 = "=RC[+3]"
 Range("D34").FormulaR1C1 = "=RC[+3]"
 End Select

End Sub

Wenn Du dann dennoch die weiteren Events unterbinden willst lässt sich auch dies bewerkstelligen:

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)

 Select Case Target.Address
 Case "$C$23"
 Application.EnableEvents = False
 Range("C34").FormulaR1C1 = "=RC[+3]"
 Range("D34").FormulaR1C1 = "=RC[+3]"
 Application.EnableEvents = True
 End Select

End Sub


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Guten Tag.

Option Explicit

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)

<u> Dim HatIhnSchon As Boolean</u>

 Select Case Target.Address 

<u> If (Not HatIhnSchon) Then</u>

 Case "$C$23"

<u> HatIhnSchon = True</u>
 Range("$c$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 Range("$D$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 If Intersect(Target, Range("C23:C23")) Is Nothing
 Then Exit Sub
 Range("$c$23").Select

<u> End If</u>

 End Select

End Sub

So in etwa müsste das gehen.

Gruß Eillicht zu Vensre

Hallo zusammen,

ich danke euch beiden und allen, die sich nen Kopf gemacht haben.
Ich kann’s im Moment nicht zu ende bringen - keine Zeit…

Habe eure Lösungen gut verstaut und melde mich die Tage wieder.

Gruß und danke für eure Mühe.

Rolf

Hallo,
nun komme ich endlich dazu, zu antworten.
Ich habe das mal so eingebaut:

Option Explicit

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)

 Dim HatIhnSchon As Boolean

 Select Case Target.Address

 Case "$C$23"
 If (Not HatIhnSchon) Then

 HatIhnSchon = True
 Range("$c$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 Range("$D$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 If Intersect(Target, Range("C23:C23")) Is Nothing Then Exit Sub
 Range("$c$23").Select

 End If

End Select

End sub

Dabei bleibt er aber auch wieder in dieser Schleife hängen,
d.h. er hoppelt endlos von C34 nach D34.

Select Case Target.Address 

 If (Not HatIhnSchon) Then

 Case "$C$23"

So herum mochte er das nicht, das gab eine Fehlermeldung:
Anweisungen und Zeilenmarken zwischen select case und erstem
Vorkommen von case unzulässig.

Oder hab ich jetzt was falsch gemacht?

Gruß
Rolf

Hallo Rolf,

Dabei bleibt er aber auch wieder in dieser Schleife hängen,
d.h. er hoppelt endlos von C34 nach D34.

ich hab jetzt den Code nur überflogen und gar nicht so geschaut was er genau macht.
Aber im Code wird „Select“ benutzt, d.h. da der Code auf SelectionChange reagiert ruft er sich laufend selbst neu auf.

Baue mal zu Anfang dees Codes
application.enalbleevents=false
und am Ende
application.enalbleevents=true
ein. Vielleicht wars das schon. Wenn nicht muß man mal schauen.

Anweisungen und Zeilenmarken zwischen select case und erstem
Vorkommen von case unzulässig.

Darin ist doch alles gesagt.

Gruß
Reinhard

Select Case Target.Address

If (Not HatIhnSchon) Then

Case „$C$23“

Oder hab ich jetzt was falsch gemacht?

Gruß
Rolf

Hallo Thomas,

ich habe mir gerade eine Endlosschleife gelegt :frowning:
Wenn Zelle c23 aktiviert wird, soll die Schleife durchlaufen
werden.
Danach soll wieder c23 die aktive Zelle sein, ohne jedoch die
Schleife nochmal zu durchlaufen.

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Select Case Target.Address
Case „$C$23“

Range("$c$34").Select
ActiveCell.FormulaR1C1 = „=RC[+3]“
Range("$D$34").Select
ActiveCell.FormulaR1C1 = „=RC[+3]“
If Intersect(Target, Range(„C23:C23“)) Is Nothing
Then Exit Sub
Range("$c$23").Select

End Select

End Sub

Hat vielleicht jemand eine Idee?

Ja, das ist ein Klassiker - bedingt durch die Selektion der
Zellen in die Du schreibst. Lass die .Select und .Activate
alle weg (in >99% sind sie eh unnätig), dann klappt das Ganze
schon mal korrekt.
Und da Du dann die markierte Zelle gar nicht verlässt, ist es
auch nicht notwendig, sie am Ende wieder zu selektieren.

Dein Code sieht dann gleich viel schlanker aus:

So hab ich das nicht hinbekommen. Entweder es passiert nix, wenn ich
auf c23 gehe, oder, wenn ich versuche, was zu ändern, hänge ich wieder in der Schleife.

Hier mal der ganze Code:

Private Sub Worksheet\_SelectionChange(ByVal Target As Range)

 Cancel = True

 'Sheets("Eingabe").ScrollArea = "A$2:blush:L$36"
 
 Select Case Target.Address
 Case "$C$4"
 If Intersect(Target, Range("C4:C4")) Is Nothing Then Exit Sub
 Range("$C$4") = 0
 Range("$C$5") = 0
 Range("$C$6") = 0
 Range("$C$7") = 0
 Range("$C$8") = 0
 Range("$c$14") = 1.4
 Range("$c$22") = 0
 Range("$C$23") = 0
 Range("$C$26") = 0
 Range("$G$22") = 0
 Range("$C$32") = 0
 Range("$C$33") = 0
 Range("$C$34") = 0
 Range("$C$35") = 0

 Case "$C$22"
 If Intersect(Target, Range("C22:C22")) Is Nothing Then Exit Sub
 Range("$C$22") = 0
 Range("$C$23") = 0
 Range("$C$26") = 0
 Range("$C$32") = 0
 Range("$C$33") = 0
 Range("$C$34") = 0
 Range("$C$35") = 0
 Case "$G$22"
 Range("$G$22") = 0
 Case "$C$14"
 Range("$C$14") = 1.4
 Case "$C$23"

 Range("$C$23") = 0
 Range("$C$26") = 0
 Range("$C$32") = 0
 Range("$C$33") = 0
 Range("$C$34") = 0
 Range("$C$35") = 0

 Range("$c$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 Range("$D$34").Select
 ActiveCell.FormulaR1C1 = "=RC[+3]"
 If Intersect(Target, Range("C23:C23")) Is Nothing Then Exit Sub

 Range("$c$23").Select

 Case "$C$26"
 Range("$C$26") = 0
 Range("$C$32") = 0
 Range("$C$33") = 0
 Range("$C$34") = 0
 Range("$C$35") = 0
 Range("$d$34") = 0

 Case "$C$33"
 Range("$C$23") = 0

 End Select

End Sub

wo liegt mein Fehler?

Gruß
Rolf

Hallo Reinhard,

Baue mal zu Anfang dees Codes
application.enalbleevents=false
und am Ende
application.enalbleevents=true
ein. Vielleicht wars das schon.

Das wars tatsächlich, klappt wunderbar.
Nachdem ich das erste „l“ bei enalbleevents weggelassen habe,
war auch die Fehlermeldung weg *g*

Gruß und dank an alle
Rolf

Nachdem ich das erste „l“ bei enalbleevents weggelassen habe,
war auch die Fehlermeldung weg *g*

Hallo Rolf,

das war ein Test, ich wollte wissen ob du schon weißt daß was marode ist wenn der Debugger kleingeschriebenen Code nicht umwandelt :smile:

Natürlich war es kein Schreibfehler. Ich war schon immer in Kramatig und Otografie sehr gut.
Auch das Komatrinken äh die Komaregheln liebte ich.

Gruß
Reinhard, Rechtschreibprofi *kicher*

Grüezi Rolf

Ja, das ist ein Klassiker - bedingt durch die Selektion der
Zellen in die Du schreibst. Lass die .Select und .Activate
alle weg (in >99% sind sie eh unnätig), dann klappt das Ganze
schon mal korrekt.
Und da Du dann die markierte Zelle gar nicht verlässt, ist es
auch nicht notwendig, sie am Ende wieder zu selektieren.

Dein Code sieht dann gleich viel schlanker aus:

So hab ich das nicht hinbekommen. Entweder es passiert nix,
wenn ich
auf c23 gehe, oder, wenn ich versuche, was zu ändern, hänge
ich wieder in der Schleife.

wo liegt mein Fehler?

Ja, Du selektierst ja schon wieder - meine Zeilen kommen auch ohne Ausschalten der Events zugange, weil gar nirgends wieder was selektiert wird. In deinem Code scheinen mir auch ein paar Zeilen nicht notwendig zu sein.

Aber inzwischen hast Du es ja irgendwie hingebogen, wenn ich das richtig mitbekommen habe?

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -