VBA Anfangsschwierigkeiten-Threads?

  • Ich programmier gerade bei Excel 2002 (XP) ein Makro welches eine Excel Tabelle durchgeht und dabei unter anderem während des Berechnens ein "Bitte Warten" Form zeigen soll. Wenn man aber ein Form aufruft, so wird der Programmfluss von vorher gestoppt bis das betreffende Form wieder in der mit hide verschwunden ist. Es ist auch nicht möglich bei dem Form selber das alte Form wieder aufzurufen denn wenn man irgendeinen Code bei UserForm123_Initialize oder UserForm123_Activate verwenden wird sehr dummer Weise nur ein leeres Form am Bildschirm erzeugt (gerade mal die Caption wird noch angezeigt) aber ansonsten nix. Also schein der Programmfluss irgendwie so zu laufen
    UserForm1.Show
    ----->
    UserForm1 als Rahmen anzeigen mit Caption
    -----> UserForm1_Initialize aufrufen
    nach End Sub
    UserForm1 anzeigen (Labels und Images z.B.)

    Hab ich da was übersehen oder gibt es keine möglichkeit dieser Linearität auszukommen (Threads) ? Kann man irgendwie ein Event kreieren das erst nach vollständigem Aufbau des Forms aktiv wird (und wie coded man das?) ?
    Hab vorher schon mal was mit VBA programmiert, aber da hatte ich das Problem nicht, würde mich aber immer noch als ziemlichen Anfänger für VBA bezeichenen und wäre froh wenn mir jemand einen Rat geben könnte.
    mfg Zentor

  • Zugegeben, keine Antwort auf die Frage, aber du könntest es mal mit OpenOffice probieren. Das hat ebenfalls ein "eingebautes" Basic (wie/ob VBA kompatibel weiß ich nicht), aber es gibt auch Schnittstellen zu anderen Sprachen und z.B. in Java wären ja Threads kein Problem...

    Falls du jedoch Microsoftianer bist hätt ich auch einen Vorschlag für dich, weiß aber nicht ob das in VBA geht: du könntest das "Bitte warten" Fenster zu allererst anzeigen und von dem aus dann die Berechnungen starten lassen

    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

  • ich würds auch so machen, dass ich vom "Please wait" Fenster die Berechnungen durchführe...

    martin:
    Ich bin kein Microsoft-Fan, und verwend momentan auch kein Office mehr, sondern RagTime Privat (für Privat-User gratis).
    Aber ich muss trotzdem sagen, dass OpenOffice sicherlich keine echte alternative ist. Ich hab OpenOffice 1.01 zwar noch nicht selbst ausprobiert, aber StarOffice 5.2, und es mangelt an:
    1.) Usability (schon mal probiert, z.b. ein Rechteck zu zeichen, und es mit gedrückter Ctrl-Taste und der Mouse zu kopieren, oder per right-click Drag-and-drop auf das Context-Menu warten, wo man auswählen sollte können, ob man das Objekt verschieben oder kopieren will? Oder probier einmal ein Dialog-Fenster ausserhalb des Haupt-Fensters zu verschieben? Aber ich will nicht sagen, dass OpenOffice nicht versucht, die sachen zu verbessern, weil mittlerweile verwenden sie ja zumindest schon den "offiziellen" Windows Open/Save Dialog.
    2.) Speed. Der Grund, warum ich von Windows XP, Office XP etc. nichts wissen will, ist das sie immer mehr "bloat" mit sich führen. Ich will nicht - wie bei StarOffice/OpenOffice - 8-10 Sekunden oder so warten müssen, bis ich wirklich zu arbeiten beginnen kann.
    3.) Optik. Ok, dass ist eine sache, die hauptsächlich _mich_ betrifft, und vielen anderen vermutlich egal ist: Ich will ein Programm verwenden, dass mir gefällt. Und dass ist weder bei Mozilla, noch bei OpenOffice der Fall... Die sollten einfach die Standard-Controls des OS verwenden (die Common-Controls unter WIndows, und GTK+ (oder Qt) unter Linux), aber dass ist eben bei OSS kompliziert, weil die einfach auf viele OS portiert werden können soll. Dass sowas aber möglich ist, sieht man aber bei der OSS Textverarbeitung AbiWord und bei Opera zum Beispiel.

  • Bitte, keine Disskusionen über MS das ist mehr als Offtopic. Natürlich kann man im "Bitte Warten" Form auch die Berechnungen durchführen ABER (wie schon oben geschrieben) werden Berechnungen über _initialize eben vor dem anzeigen des kompletten Forms durchgeführt. Deshalb meine frage: gibts da ein Event das nach der darstellung des Forms statt findet (oder geht das Problem anders zu lösen (multithreads von mir aus)).
    mfg Zentor

  • also multithreading wirst ddu mit VBA glaub ich nicht schaffen.


    es müsste das event Activate geben, soweit ich weiss (hab ja kein MS Office mehr, damit ich es genau nachürüfen könnte), dass getriggert wird, wenn die Form entweder aktiviert oder deaktiviert wird. Also müsstest du in dem Handler von USerFOrm_Activate(someArguments) einfach nur schreiben:
    static firstTime as boolean
    if firstTime = false then
    firstTime = true
    //jetzt das andere ausführen
    end if


    bin mir nicht mehr ganz sicher, ob das funktioniert, aber ich glaub, ich hab einmal ein ähnliches problem gehabt, und es so gelöst - aber ohne Garantie.

  • Zitat

    Original geschrieben von Zentor
    ....wenn man irgendeinen Code bei UserForm123_Initialize oder UserForm123_Activate ....

    Wie schon geschrieben, ich habs mit beiden versucht, kein unterschied, das selbe Problem.
    mfg Zentor

  • ok, dann würde ich weitere informationen brauchen, wenn ich dir weiterhelfen soll...

    welche FUnktionen außer Initialize und Activate kannst du theoretisch für die UserForm1 noch behandeln. (Gibt es zum beispiel AppActivate?)

  • Also die Standardevents sind alle anders und nicht für meine Zwecke anwendbar (kurzzeitig hab ichs mit mouse_down versucht, aber das is ja ein ziemlicher murks). Ich habs jetzt etwas konfus "gelöst":

    Das Form bei dem man auf Suche starten klickt wird dann resized und der obere Auschnitt dieses Forms bleibt sichtbar. die Caption wird noch geändert und das wars. Is nicht sehr schön, wollte noch ein weiteres Image einfügen das dann visible= true geschaltet wird DOCH(!!!) schon wieder werden zuerst die Berechnungen durchgeführt ohne das Image auszutauschen. Nur das alte von der ursprünglichen Aufmachung bleibt sichtbar. Also das ist echt besch*** gemacht bei VBA. Als ob sies darauf abgelegt hätten diese Form von Programmierung genau zu unterbinden. naja egal. Bin etwas entäuscht das es nciht besser ging aber ich hab nirgends Rat gefunden. Ist wohl unlösbar das Problem.
    mfg Zentor

  • Zitat

    Original geschrieben von Zentor
    Also das ist echt besch*** gemacht bei VBA. Als ob sies darauf abgelegt hätten diese Form von Programmierung genau zu unterbinden.


    Ich würd hier mal unterstellen dass das Absicht war. VBA wird ja meistens von nicht-Programmierern verwendet, und die haben nicht die geringste Ahnung von Multithreading. Stell dir vor eine Sekretärin - sie hat gerade ihren "Computerführerschein" gemacht :D - schreibt sich ein Makro, mit zwei oder mehr Threads und die greifen auf dasselbe Datenelement (sagen wir ein Eintrag in einer Excel Tabelle). Die kommt zu 99,9% garnicht auf die Idee, dass sie die Zugriffe synchronisieren muss, weil es sonst im besten Fall Inkonsistenzen gibt.
    Das heißt aber dann, alle Daten müssten von sich aus synchronisiert sein (nur ein Thread hat zu einer Zeit Zugriffsrechte), dann wär das alles aber schon wieder recht sinnlos ;)

    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!