Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Schleife mit Button abbrechen VBA

Schleife mit Button abbrechen VBA
24.07.2005 17:01:27
Wolfgang
Hallo,
mit folgendem Makro werden Zufallszahlen (ug=Untergrenze, og=Obergrenze) im festgelegten Bereich der Spalte A (zeist=Zeilenstart, zeizi=Zeilenziel) erzeugt. Klappt auch.
Wenn ich bei doppelten Zahlen eine Neuberechnung durchführen lasse (nochmal:) dauert es bei sehr großen Zahlen sehr lange, das Löschen der doppelten Zahlen möchte ich vermeiden. Ich habe schon vorgegeben, daß die Zufallszahlen 3 x größer als die Zeilenanzahl sind, hilft aber nur bei kleineren Zahlen.
Ich habe deshalb versucht einen Abbruch-Button zu setzen, der die Schleife abbrechen soll. Leider reichen meine VBA-Bastelkenntnisse nicht aus z.B. den gefundenen Code: bAbort = False / Do / mein Makro / DoEvents / Loop Until bAbort = True in das Makro zu integrieren.
Den Abbruch mittels Esc / Strg Unterb möchte ich umgehen, da der VBA-Editor nicht geöffnet werden soll.
Würde mich sehr freuen, wenn mir geholfen werden kann.
Schönen Tag wünscht Wolfgang
Option Explicit
Private bAbort As Boolean

Private Sub CommandButton1_Click()
Dim zuf, og, ug As Double
Dim zeist, zeizi, spst, spzi, s, t, Zaehler, Zeile As Integer
On Error Resume Next
ug = Me.TextBox1.Value
og = Me.TextBox2.Value
zeist = Range((Me.TextBox3)).Row
zeizi = Range(Me.TextBox4).Row
spst = Range((Me.TextBox3)).Column
spzi = Range(Me.TextBox4).Column
If CheckBox2 = True Then
Range("A:A").Clear
End If
nochmal:
For s = zeist To zeizi
For t = spst To spzi
zuf = Int((og - ug + 1) * Rnd + ug)
Cells(s, t).NumberFormat = "0"
Cells(s, t) = zuf
Next t
Next s
If CheckBox2 = True Then
If og - ug < (zeizi - zeist) * 3 Then
MsgBox "Es müssen die Daten verändert werden,"
Exit Sub
End If
Zeile = Cells(Cells.Rows.Count, 1).End(xlUp).Row
For Zaehler = Zeile To 1 Step -1
If WorksheetFunction.CountIf(Columns(1), Cells(Zaehler, 1)) > 1 Then GoTo nochmal
Next Zaehler
End If
End Sub


Private Sub cmdAbort_Click()
bAbort = True
End Sub


Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub


Private Sub CommandButton3_Click()
On Error Resume Next
Range(Me.TextBox3.Text, Me.TextBox4.Text).Clear
End Sub

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife mit Button abbrechen VBA
24.07.2005 17:19:43
Reinhard
Hi Wolfgang,
ich habe den Code jetzt nur sehr kurz überflogen aber frag mich trotzdem warum der so lang sein muss.
Ansonsten, du musst doch nur, wo genau auch immer sowas wie
if abort=true then exit sub
einbauen *denk*
Gruß
Reinhard
AW: Schleife mit Button abbrechen VBA
24.07.2005 17:41:33
Wolfgang
Vielen Dank für die schnelle Antwort.
Ich habe versucht an allen möglichen Stellen so etwas einzubauen, ich müßte jedoch noch DoEvents einbauen, sonst kann man den Button doch nicht betätigen, oder ?
Ist der Code zu lang ? Besteht doch nur aus dem Auslesen der Eingaben, Ermittlung der Zahlen, und Abfrage, ob doppelte Werte ausgeschlosen werden sollen,
Wenn es möglich wäre könntest Du den Code ja mal kurz überfliegen.
Würde mich freuen.
Gruß Wolfgang
Anzeige
AW: Schleife mit Button abbrechen VBA
24.07.2005 19:59:38
Christoph
Hi Wolfgang,
probier's mal so:
Gruß
Christoph
PS:
zur Info: Deine Deklaration
Dim zuf, og, ug As Double
Dim zeist, zeizi, spst, spzi, s, t, Zaehler, Zeile As Integer
deklariert nur ug als Double und Zeile als Integer, alle anderen Variablen sind Variant

nochmal:
For s = zeist To zeizi
For t = spst To spzi
zuf = Int((og - ug + 1) * Rnd + ug)
Cells(s, t).NumberFormat = "0"
Cells(s, t) = zuf
If bAbort Then Exit Sub
DoEvents
Next t
Next s

Anzeige
AW: Schleife mit Button abbrechen VBA
24.07.2005 20:20:15
Wolfgang
Hallo Christoph,
vielen Dank, es klappt jetzt.
Das mit der Deklaration habe ich noch nicht gewußt, jetzt muß ich alle meine Makros umschreiben. Bist Du Dir zu 100% sicher?
Gruß Wolfgang
ja, bin ich...
24.07.2005 21:11:27
Christoph
Hi Wolfgang,
das ist ein beliebter Fehler, der sich wahrscheinlich durch Kopieren von Code-Schniepseln aus dem Internet hartnäckig hält.
Ob du jetzt alle Makros umschreiben musst? Variant frisst halt mehr RAM und kann zur Laufzeit den Typ wechseln. Da kann's Probleme geben.
Bevor du jetzt 300 Codes überarbeitest, verstehe das eher als Tipp für die Zukunft.
Noch ein Tipp:
Du kannst die Typkennzeichen verwenden, statt den Variablentyp auszuschreiben.
Gruß
Christoph
hier ein Auszug aus der Microsoft-Library:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vacondeclarationsyntax.asp
In Visual Basic 6.0, you can declare variables of different types in the same statement, but you must specify the data type of each variable or it defaults to Variant. The following example shows multiple declarations and their resulting data types:
Dim I, J As Integer ' I is Variant, J is Integer.
Dim L As Integer, M As Integer ' L is Integer, M is Integer.
Dim N As Integer, X As Double ' N is Integer, X is Double.
Anzeige
AW: ja, bin ich...
24.07.2005 23:22:00
Wolfgang
Hallo Christoph,
leider stimmt das mit der Deklaration wirklich.
Habe schon mit umschreiben begonnen, allerdings ohne die verküzte Variante.
Nochmals vielen Dank.
Gruß Wolfgang
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Schleife mit Button abbrechen in Excel VBA


Schritt-für-Schritt-Anleitung

Um eine Schleife in Excel VBA mit einem Abbrechen-Button zu steuern, gehe wie folgt vor:

  1. Erstelle ein UserForm in deinem Excel VBA-Projekt.

  2. Füge einen Abbrechen-Button (z.B. CommandButton1) und einen weiteren Button für die Ausführung deiner Schleife hinzu.

  3. Deklariere eine globale Variable, um den Abbruchstatus zu speichern:

    Private bAbort As Boolean
  4. Füge den Code für die Schleife ein. Verwende DoEvents, um sicherzustellen, dass der Button gedrückt werden kann:

    Private Sub CommandButton1_Click()
       Dim zuf, og, ug As Double
       Dim zeist, zeizi, s As Integer
       ug = Me.TextBox1.Value
       og = Me.TextBox2.Value
       zeist = Range(Me.TextBox3).Row
       zeizi = Range(Me.TextBox4).Row
       bAbort = False
    
       For s = zeist To zeizi
           zuf = Int((og - ug + 1) * Rnd + ug)
           Cells(s, 1).Value = zuf
           If bAbort Then Exit Sub
           DoEvents
       Next s
    End Sub
  5. Code für den Abbrechen-Button:

    Private Sub cmdAbort_Click()
       bAbort = True
    End Sub
  6. Füge eine Möglichkeit hinzu, um das UserForm zu schließen:

    Private Sub CommandButton2_Click()
       UserForm1.Hide
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Die Schleife wird nicht unterbrochen.

    • Lösung: Stelle sicher, dass DoEvents innerhalb der Schleife verwendet wird, damit der Abbrechen-Button reagiert.
  • Fehler: Variablen werden als Variant deklariert.

    • Lösung: Achte darauf, die Variablen korrekt zu deklarieren, z.B. Dim zuf As Double.

Alternative Methoden

Falls die oben genannte Methode nicht funktioniert, kannst du auch die folgenden Alternativen nutzen:

  • Tastenkombinationen: Verwende die Esc-Taste oder Strg + Pause, um eine Schleife schnell zu beenden.
  • VBA-Vorlagen: Verwende vorgefertigte VBA-Vorlagen, die bereits eine Abbruchfunktion integriert haben.

Praktische Beispiele

Hier ist ein vollständiges Beispiel für ein Makro, das Zufallszahlen generiert und einen Abbrechen-Button nutzt:

Private Sub CommandButton1_Click()
    Dim zuf, og, ug As Double
    Dim zeist, zeizi, s As Integer
    ug = Me.TextBox1.Value
    og = Me.TextBox2.Value
    zeist = Range(Me.TextBox3).Row
    zeizi = Range(Me.TextBox4).Row
    bAbort = False

    For s = zeist To zeizi
        zuf = Int((og - ug + 1) * Rnd + ug)
        Cells(s, 1).Value = zuf
        If bAbort Then Exit Sub
        DoEvents
    Next s
End Sub

Tipps für Profis

  • Nutze die Typkennzeichen für die Variablen, um den Code effizienter und klarer zu gestalten.
  • Überlege, die Schleife in eine separate Funktion auszulagern, um die Übersichtlichkeit zu erhöhen.
  • Halte den Code so kurz wie möglich, um die Wartung zu erleichtern.

FAQ: Häufige Fragen

1. Wie kann ich eine For-Schleife in Excel VBA abbrechen?
Du kannst die Schleife mit einer globalen Abbruch-Variable und einem Button abbrechen, indem du If bAbort Then Exit Sub verwendest.

2. Welche Tastenkombinationen kann ich zum Abbrechen einer Schleife verwenden?
Die häufigsten Tastenkombinationen sind Esc oder Strg + Pause, um eine laufende VBA-Schleife zu beenden.

3. Wie kann ich sicherstellen, dass mein Makro schnell reagiert?
Verwende DoEvents innerhalb der Schleife, um sicherzustellen, dass Benutzerinteraktionen wie das Drücken eines Abbrechen-Buttons erkannt werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige