Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1888to1892
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA rennt in Schleife
08.07.2022 13:27:45
T
Hallo!
Ich habe das folgende Problem, dass mein Makro in eine Schleife rennt und ich keine Ahnung habe wieso - evtl kann mir jemand helfen.
Es geht dabei um folgendes:
In eine Zelle kann ein Wert eingetragen (c25), ist die Zelle leer, so wird ein bestimmter Bereich ausgeblendet und das Makro endet. Wird in die Zelle ein Wert eingetragen (z.B. 3) erscheint der ausgeblendete Bereich und und der Bereich wird x-1 mal kopiert.
Wird C25 geleert, soll der Bereich weider ausgeblendet werden und alle Zeilen darunter gelöscht, sodass der Anwender einen neuen Wert eintragen kann.
Leider funktioniert das nicht, Excel kopiert einfach weiter.
Ziehe ich das Makro auseinander und benutze nur den Teil, der für das Kopieren zuständig ist, funktioniert es, auch der Teil zum Ein/Ausblenden alleine funktioniert, nur die Kombi nicht,
Anbei mal der Code:

Private Sub Worksheet_Change(ByVal Target As Range)
Screenupdate = False
If Range("C25").Value = "" Then
Rows("29:55").Hidden = True
Worksheets("testblatt").Rows(56 & ":" & Worksheets("Testblatt").Rows.Count).Delete
Exit Sub
Else
Rows("29:55").Hidden = False
End If
Dim lr As Long
lr = Cells(Rows.Count, "B").End(xlUp).Row
Set X = Sheets("Testblatt").Range("C25")
Do Until X = 1
Range("B29:D55").Copy Destination:=Range("B" & lr + 2)
lr = Cells(Rows.Count, "B").End(xlUp).Row
X = X - 1
Loop
Screenupdate = True
End Sub
Danke schonmal für Hilfestellungen!

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA rennt in Schleife
08.07.2022 13:52:55
Daniel
Hi
Wenn du in einem Eventmakro (Change) eine Aktion ausführst, die dieses Event auslöst, dann führt Excel das Eventmakro an dieser Stelle nochmal aus.
Wenn man da nicht aufpasst, landet man schnell in einer Endlosschleife.
Der einfachste Weg um diese zu verhindern ist, das Ausführen der Eventmakro zu unterbinden.
Dazu führt man im Makro einmal den Befehl Applications.EnableEvents = False aus, danach kann man dann beliebig Zellen ändern, ohne dass das Change-Eventmakro erneut startet.
Am Ende des Makros sollte man diese Einstellung wieder =True setzten, denn die zuletzt gemachte Einstellung bleibt nach Makroende erhalten.
Gruß Daniel
Anzeige
AW: VBA rennt in Schleife
08.07.2022 14:27:50
T
Hallo Daniel. Danke für die Antwort.
Leider wirft der Befehl - egal wo und wie ich ihn setze einen Fehler aus - könntest du mir evtl sagen wie dieser genau gesetzt werden muss bwz im Makro?
Danke!
AW: VBA rennt in Schleife
08.07.2022 14:47:43
Daniel
Sorry mein Fehler, bzw der meines Handys. Das Application schreibt man ohne "s" am Ende.
Bitte Programmierer selber und nutze dabei die Intellisense, dann vermeidet du solche abschreibfehler.
Wo das rein muss?
Am Anfang, spätestens bevor du zum ersten mal einen Zellinhalt änderst, einfügst oder löschst, bzw eine Aktion ausführst, die das Change-Event auslöst.
Es ist dein Code, du solltest wissen was er macht
Und wie gesagt, am Ende auf True setzten nicht vergessen.
Gruß Daniel
Anzeige
AW: VBA rennt in Schleife
08.07.2022 14:48:49
Jowe
....am besten direkt zu Beginn des Makros;
der Behl lautet aber : Application.EnableEvents = False und nicht Applications.EnableEvents = False
:-))
AW: VBA rennt in Schleife
08.07.2022 15:05:29
T
Hallo Daniel.
Funktionier, danke :)
Der einzige kleine Wehrmutstropfen ist, dass es nicht funktioniert wenn das ganze über "Private Sub Worksheet_Change" läuft. Hier kann ich nur einmal eine Eingabe ändern und dann geht in der ganzen Arbeitsmappe nichts mehr - setze ich das Makro in einen Button gehts ohne PRobleme und die Arbeitsmappe bleibt auch unberührt.
Wenn du da noch einen Tipp hast wäre das genail, wenn nicht, dann bin ich auch so schon extrem zufrieden :)
Danke dir!
Anzeige
AW: VBA rennt in Schleife
08.07.2022 15:51:47
GerdL
Moin,
probier mal.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lr As Long, X As Long
Application.ScreenUpdating = False
If Target.Address(0, 0, xlA1) = "C25" Then
If Target = "" Then
Rows("29:55").Hidden = True
Rows(56 & ":" & Rows.Count).Delete
Else
Rows("29:55").Hidden = False
lr = Cells(Rows.Count, "B").End(xlUp).Row
X = CLng(Target.Value)
Do Until X = 1
Range("B29:D55").Copy Destination:=Range("B" & lr + 2)
lr = Cells(Rows.Count, "B").End(xlUp).Row
X = X - 1
Loop
End If
End If
Application.ScreenUpdating = True
End Sub
Gruß Gerd
Anzeige
AW: VBA rennt in Schleife
09.07.2022 13:33:30
Herbert_Grom
Hallo Gerd,
wie schreibe ich es jetzt am Besten, damit du nicht sauer auf mich bist, denn ich möchte nicht besserwisserisch sein. Doch liegt mir seit längerem etwas auf der Seele. Nicht jetzt speziell bei dir, sondern bei vielen anderen auch. Ich probiers mal einfach.
Ich denke, dass ein sauber strukturierter Code für alle Beteiligten besser lesbar ist, aber vor allem für die, meist nicht so versierten, Frager. Deshalb habe ich deinen Code, der natürlich inhaltlich super ist, einmal nach meinen Gedanken überarbeitet. Das "Application.ScreenUpdating = True" braucht man im Übrigen auch nicht mehr. Hier nun mein Vorschlag:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lr As Long, X As Long
Application.ScreenUpdating = False
If Target.Address(0, 0, xlA1) = "C25" Then
If Target = "" Then
Rows("29:55").Hidden = True
Rows(56 & ":" & Rows.Count).Delete
Else
Rows("29:55").Hidden = False
lr = Cells(Rows.Count, "B").End(xlUp).Row
X = CLng(Target.Value)
Do Until X = 1
Range("B29:D55").Copy Destination:=Range("B" & lr + 2)
lr = Cells(Rows.Count, "B").End(xlUp).Row
X = X - 1
Loop
End If
End If
End Sub
Was sagst du dazu?
Servus
Anzeige
AW: VBA rennt in Schleife
11.07.2022 08:15:38
Luschi
Hallo Herbert,
hier meine kleine Manöverkritik.
in Vba verlasse ich mich nie auf Standard-Einstellungen, da es keinen Hintergrund-Compiler gibt wie in VB.Net bzw. C#, deshalb
- Application.ScreenUpdating = False in der Sub festgelegt
- so erfolgt am Schluß dieser auch Application.ScreenUpdating = True (ist meine persönliche Ansichtssache)
- Target = "" sieht bei mir immer so aus: Target.Value = ""
- wenn Du Deinen Code mal im Einzelschrittmodus durchsteppst, wirst Du feststellen
- das bei diesen Befehlen: Rows(56 & ":" & Rows.Count).Delete und Range("B29:D55").Copy Destination:=Range("B" & lr + 2)
- das Worksheet_Change-Ereignis erneut aufgerufen wird, ohne daß das vorherige Ereignis komplett abgearbeitet wurde
- hier fehlt die Einstellung: Application.EnableEvents = False, um das zu verhindern
- wenn ich zig-tausende Zeilen lösche (wie bei Rows(56 & ":" & Rows.Count).Delete) dann schalte ich vorher die
  automatische Berechnung ab
- zum Steuern der Excel-Ereignisse nutze ich die Routine 'GetMoreSpeed' die in vielen Excelforen rumgeistert
Also nix für Ungut und
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA rennt in Schleife
11.07.2022 10:21:11
Herbert_Grom
Hallo Luschi,
vielen Dank für deine Hinweise. Doch ich habe ja nicht den Code an sich beanstandet (und auch nicht getestet!), sondern nur die Strukturierung.
Dass man "Application.ScreenUpdating = True" nicht mehr benötigt, stammt auch nicht von mir, sondern von einem anerkannten VBA-Experten. Außerdem mache ich das schon eine ganze Weile so, ohne irgendwelche Probleme. Aber es schadet auch nix, wenn man es verwendet.
Aber trotzdem vielen Dank und viele Grüße nach "klein-Paris"!
Servus
AW: VBA rennt in Schleife
11.07.2022 10:10:34
GerdL
Moin,
ich habe mich auf die Vereinigung der beiden Hauptbedingungen konzentriert u. dabei das falsche "Application" gelassen.
Herbert, deine Strukturkritik verstehe ich nicht. Vielleicht hast du sie zu vorsichtig ausformuliert.
Gruß Gerd
Anzeige
AW: VBA rennt in Schleife
11.07.2022 10:27:46
Herbert_Grom
Hallo Gerd,
ich meinte u. a. die vielen unnötigen Leerzeilen. Und wenn du beide Codes nebeneinander stellst siehst du den Unterschied. Es ist ja auch nicht kriegsentscheidend, aber ich dachte halt, dass die "Newbies" es gleich richtig mitbekommen.
Servus
AW: VBA rennt in Schleife
11.07.2022 11:57:25
T
Hallo ihr 2 :)
Erstmal vielen Dank - es funktioniert :)
Für mich als nicht so erfahrenen Anwender sind persönlich (meine MEinung) einige Leerzeilen mehr nicht so verkehrt - löschen kann man diese ja immer noch.
Aber es macht manchmal das Verstehen einfach da man sieht wo eine klare Trennung ist.
Aber ja, ich bin mir auch bewußt, dass man sicher das ein oder andere defintiv optimieren kann (z.B. Löschen der ganzen Zeilen) - aber da komme ich nochmal wenn ich mich wieder in einer Schleife festgefressen hab :D
Anzeige
AW: Bitte sehr & danke für die Rückmeldung! owt
11.07.2022 12:10:35
Herbert_Grom
,,,

167 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige