Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Userform vbmodeless

Userform vbmodeless
12.06.2018 15:35:36
Christof
Hallo Allerseits!
Ich habe ein Problem mit einer Arbeitsmappe in der ich eine Berechnung über drei Arbeitsblätter hinweg durchführen möchte. Die Berechnung funktioniert einwandfrei.
Ich möchte jetzt im nächsten Schritt bei Betätigen der Berechnung (mittels CommandButton) eine _ Userform öffnen lassen, die dem Nutzer mitteilt, dass die Rechnung läuft. Das funktioniert soweit auch. Die Berechnung läuft durch

UserForm.Show vbmodeless
einfach weiter durch.
Nun soll auf der Userform ein "Abbrechen"-Button sein, mit dessen Hilfe ich eine Berechnung abbrechen kann. Mein Gedanke dazu war dieser: Ich definiere eine Public Variable, die ich bei Klicken auf den "Abbrechen"-Button an die "Rechnen"-Funktion übergebe und mittels If-Bedingung (im Idealfall) einen Abbruch hervorrufe.

Public Abbruch As Integer
Sub Abbrechen_Click()
Abbruch = 1
End Sub
Sub Rechnen_Klicken()
Abbruch = 0
UserForm.Show vbmodeless
DoEvents
If Abbruch = 0 Then
'Führe Berechnung durch
Else
Exit Sub
End if
End Sub

Leider Funktioniert das so nicht. Die UserForm erscheint, der "Abbrechen"-Button lässt sich dann aber nicht betätigen. Die Berechnung läuft also bis zum Schluss durch.
Woran kann das liegen?
Vielen Dank für Eure Hilfe!
PS: Ich habe hier eine Beispiel-Tabelle angefügt:
https://www.herber.de/bbs/user/122062.xlsm
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform vbmodeless
12.06.2018 16:28:05
PeterK
Hallo
Ein Makro aufzurufen während ein Makro läuft funktioniert leider nicht. Mit einem Optionsfeld jedoch geht es.

Private Sub OptionButton1_Click()
Abbruch = 1
End Sub
Wird in die Userform eingefügt. Ein zweiter Fehler: "Abbruch" ist auch lokal in "Rechnen_Klicken" definiert (Bitte löschen). Und nun musst du noch auf Events innerhalb deiner Schleife reagieren "DoEvents()".
Anzeige
AW: Userform vbmodeless
13.06.2018 08:07:21
Christof
Hallo Peter,
Danke für deine Antwort. Habe ich über einen CommandButton also keine Möglichkeit mein Makro abzubrechen?
Ein OptionButton wäre hier leider unschön.
Wie gehe ich, wenn ich Abbruch nicht vorher einmal als Abbruch = 0 deklariere mit der If-Schleife um? Meine Idee war, dass ich Abbruch = 0 setze und die Schleife so lange läuft, bis ich per ButtonKlick den Value von Abbruch auf 1 setze. Oder beißt sich das dann?
Ich habe ja in meiner Rechnen_Klicken() ein DoEvents. Benutze ich das da falsch?
Sorry, bin leider ambitionierter Laie und nicht so bewandert in vba. :)
Anzeige
AW: Userform vbmodeless
13.06.2018 08:52:52
Christof
Also der Fehler scheint zu sein, dass die UserForm während der Prozedur einfriert. Wenn ich meinen Code umstelle, sodass sich die UserForm nach Ablauf der Berechnung nicht entläd, so kann ich nach der Berechnung die UserForm wieder verschieben und auch die Buttons betätigen.
Hat jemand einen Ansatz, woran das liegen kann?
Anzeige
AW: Userform vbmodeless
15.06.2018 14:58:32
mmat
Hallo,
vermutlich ist deine Berechnung so heftig, das alles andere in Excel einfriert. Wie im Beitrag von Peter K bereits erwähnt, muss in der Hauptschleife deiner Berechnung regelmäßig (besser zuviel als zuwenig) doevents aufgerufen werden. Das eine Mal da am Anfang ist unzureichend. Und der Eventhandler darf natürlich nicht durch Globalschalter deaktiviert sein.
Weiterhin muss die Variable "Abbruch" ebenfalls während der Berechnung regelmäßig geprüft werden.
Btw. Natürlich kann man ein Makro starten, während ein anderes läuft. Jedenfalls wenn man alles richtig macht ... :-)
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Userform mit vbModeless in Excel VBA verwenden


Schritt-für-Schritt-Anleitung

  1. UserForm erstellen: Erstelle eine UserForm in deinem VBA-Editor, und füge einen CommandButton hinzu, der die Berechnung auslöst. Füge außerdem einen "Abbrechen"-Button hinzu.

  2. Code für die UserForm: Verwende folgenden Code, um die UserForm modeless anzuzeigen und die Berechnung zu starten:

    Public Abbruch As Integer
    
    Sub Rechnen_Klicken()
        Abbruch = 0
        UserForm.Show vbModeless
        DoEvents
    
        ' Beispiel einer Berechnung
        For i = 1 To 100000
            ' Hier können weitere Berechnungen stehen
            DoEvents ' Stelle sicher, dass die UserForm reagiert
            If Abbruch = 1 Then
                Exit Sub
            End If
        Next i
    
        ' UserForm schließen
        Unload UserForm
    End Sub
    
    Sub Abbrechen_Click()
        Abbruch = 1
    End Sub
  3. OptionButton verwenden (optional): Sollte der CommandButton nicht funktionieren, kannst du alternativ einen OptionButton verwenden, um den Abbruch zu implementieren.


Häufige Fehler und Lösungen

  • UserForm friert ein: Wenn die UserForm während der Berechnung einfriert, stelle sicher, dass DoEvents häufig innerhalb der Schleife aufgerufen wird. Platziere DoEvents innerhalb der Hauptschleife, um die UserForm reaktionsfähig zu halten.

  • Abbruch nicht möglich: Wenn der Abbrechen-Button nicht funktioniert, überprüfe, dass die Variable Abbruch global definiert ist und nicht lokal innerhalb des Rechnen_Klicken-Sub.


Alternative Methoden

  • VBA Timer verwenden: Anstatt eine UserForm mit einem CommandButton zu verwenden, kannst du einen Timer einfügen, der regelmäßig überprüft, ob der Abbruch-Button gedrückt wurde.

  • Ereignisgesteuertes Programmieren: Implementiere Ereignisse, die auf Benutzerinteraktionen reagieren, anstatt die Berechnung sofort zu starten.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du eine Berechnung mit einer UserForm und dem vbModeless-Parameter implementieren kannst:

Sub StartBerechnung()
    UserForm1.Show vbModeless
    ' Berechnung starten
    Rechnen_Klicken
End Sub

In diesem Beispiel wird die UserForm UserForm1 im vbModeless-Modus angezeigt, sodass andere Benutzeraktionen gleichzeitig möglich sind.


Tipps für Profis

  • Häufiges DoEvents: Achte darauf, DoEvents nicht nur einmal am Anfang deiner Schleife aufzurufen, sondern regelmäßig, um die Benutzeroberfläche reaktionsfähig zu halten.

  • Optimierung der Berechnung: Versuche, auf rechenintensive Operationen zu verzichten oder diese zu optimieren, um die Leistung zu steigern und die UserForm stets interaktiv zu halten.


FAQ: Häufige Fragen

1. Kann ich die UserForm auch modal anzeigen?
Ja, du kannst die UserForm auch modal anzeigen, indem du einfach UserForm.Show ohne den vbModeless-Parameter verwendest. Beachte jedoch, dass der Benutzer dann die UserForm schließen muss, bevor er wieder mit der Excel-Oberfläche interagieren kann.

2. Was tun, wenn die Berechnung sehr lange dauert?
Wenn die Berechnung lange dauert, solltest du in Betracht ziehen, diese in einen separaten Thread auszulagern (z.B. durch Asynchronous Programming), um die Benutzeroberfläche nicht einzufrieren, oder die Berechnung in kleinere Schritte zu unterteilen.

3. Wie kann ich die UserForm nach der Berechnung schließen?
Du kannst Unload UserForm am Ende deines Berechnungsskripts aufrufen, um die UserForm zu schließen, wenn die Berechnung abgeschlossen ist.

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