Prozedur-Ablauf mit Abbrechen-Button oder anders abbrechen?

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Lubeca.

    Prozedur-Ablauf mit Abbrechen-Button oder anders abbrechen?

    Hallo zusammen,
    Ich habe ein ähnliches Problem, wie hier (Ladebalken - Form mit Abbrechen - Fehler!) beschrieben wird, nur in Excel mit VBA.
    Ich habe eine Prozedur die viele Zeilen miteinander vergleicht und wenn welche doppelt sind in ein neues Tabellenblatt kopiert.
    Das kann bei einer Excel-Datei mit mehr als 1000 Zeilen sehr lange dauern. Da Microsoft beim Ausführen längerer Prozesse immer sofort "Keine Rückmeldung" einblendet, habe ich mir einen Fortschrittsbalken als Anzeige, wie weit das Programm ist, eingebaut. Das geht auch ganz gut.
    Jetzt soll aber die Prozedur abbrechbar sein, wenn es doch zu lange dauert.
    Ich habe einen Abbrechen-Button erstellt. In der Click-Prozedur, setze ich die globale Variable "Abbrechen" auf True (Beim Start als False initialisiert). In meiner Prozedur wird in einer If - Bedingung nach jedem Zeilendurchlauf "Abbrechen" abgefragt.
    Ich habe aber das Gefühl, dass ich so oft ich will auf "Abbrechen" klicken kann, aber während die Prozedur läuft, wird nicht in die Click-Prozedur des Buttons gesprungen.
    Hat jemand eine andere Idee, wie ich meine Prozedur abbrechen kann.

    Tschüßi Lubeca
    Hallo,

    du musst dein Vergleich in einem extra Thread laufen lassen und dann ist es asynchron.
    Dann kannst du auch mit der Click-Prozedur den Thread abbrechen.

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Hallo Alex-Digital,
    Wie kann ich in Excel VBA einen zweiten Thread laufen lassen und wie sollte dann mein Abbrechen-Button funktionieren?
    So weit bin ich beim "Programmieren" noch nicht.
    Der Ablauf ist im Moment so:
    Ich starte das Formular und mit Klicken auf den Start-Button wird die Vergleich-Prozedur (Schleife:Einlesen der Zeile, Vergleichen mit allen anderen) gestartet. Wenn Zeilen übereinstimmen wird in eine weitere Prozedur gesprungen, die die beiden Zeilen entweder markiert und/oder in eine neue Tabelle kopiert, je nach vorheriger Auswahl.
    Ich sehe da keinen Ansatz für einen zweiten Thread, geschweige denn, wie ich ihn in Excel realisieren sollte.

    Vielleicht kannst du mir da etwas auf die Sprünge helfen.

    Tschüßi Lubeca
    Also eigentlich unterstützt Vba garkein multithread(außer Exel 2007 wobei man das nicht im vba code mit einbinden kann). Also soweit ich weiß (hab das mal irgendwann irgendwo gelesen)macht man das mit Instanzen. Also z.b. 4 Instanzen macht und dann jeder einen eigenen Kern zuweisen.
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Wie schon gesagt, VBA kann eigentlich kein Multithreading.
    Ich habe jedoch schon öfters das realisiert über einen COM-Timer, der als Event-Routine die Adresse einer VBA-Sub bekommt.
    Die Initialisierung ist nicht ganz trivial.
    Die Callback-Routine muss in einem Modul und als Public definiert sein.
    Die Adresseberechnung muss über eine indirekte Funktion passieren, da eine direkte AddressOf-Übergabe an COM nicht akzeptiert wird.
    Alles in allem recht tricky.


    Aber so weit musst du gar nicht gehen.
    Dein Problem lässt sich viel einfacher lösen über das gute alte DoEvents.
    Mach einfach in deiner Schleife, die alles blockiert ein DoEvents-Statement rein und plötzlich kannst du auch zwischendurch Button-Events abarbeiten.

    Vielleicht benötigst du auch gar keinen Cancel-Button mehr, wenn du die Verarbeitung in der Schleife optimierst.
    Wenn du der Meinung bist, dass der Code schon optimal ist,, darfst du noch die beiden Wunderstatements

    Quellcode

    1. ​Application.ScreenUpdating = False
    2. Application.Calculation = xlCalculationManual
    ausprobieren.
    Hinterher natürlich wieder zurückbiegen!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Aber so weit musst du gar nicht gehen.
    Dein Problem lässt sich viel einfacher lösen über das gute alte DoEvents.
    Mach einfach in deiner Schleife, die alles blockiert ein DoEvents-Statement rein und plötzlich kannst du auch zwischendurch Button-Events abarbeiten.

    Ja genau das habe ich gesucht. Danke petaod
    Jetzt habe ich in die Do-while-Schleife gleich am Anfang dieses gesetzt:

    Quellcode

    1. DoEvents
    2. If Abbrechen then
    3. MsgboxResult = Msgbox("Text",vbcritical)
    4. Exit Sub
    5. End If

    Wenn ich das DoEvents hinter die If-Bedingung gesetzt habe, wurde immer noch der RestCode nach der Do-While-Schleife durchlaufen. DoEvents vor der If-Bedingung lässt die Prozedur sofort abbrechen, so wie gewünscht.

    Danke nochmal.
    Tschüßi Lubeca