Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno GUI VBA - fokus cmd

Ahojky,

mám problém:

Po obslúžení ovládacieho prvku CommandButton v užívateľskom formulári VBA sa spustí kód priradený jeho udalosti Click...

Private Sub cmdTlacRozsahov_Click()
    lblCakaj.Visible = True
    Rozsahy
    lblCakaj.Visible = False
    Sheets("Rozsahy").PrintOut Copies:=1
End Sub

Rozsahy je procedúra vytvárajúca zostavu...

Počas procedúry (vytvára sa zostava a teda uplynie pár sekúnd) chcem zobraziť oznam (prvkom Label) o prebiehajúcej operácii, aby užívateľ vedel, že jeho povel sa vykonáva a musí čakať.
Label sa po vykonaní výpočtov opäť skrýva a zostava sa vytlačí...

Problémom je, že po celú dobu výkonu procedúry vyzerá Command button ako stlačený a ďalšie zmeny na monitore sú blokované (vrátane zobrazenia Labelu) až do doby, keď sa Command button "uvoľní", čo sa udeje až na úplnom konci procedúry a teda, keď už je oznam o potrebe vyčkania, bezpredmetný.
Normálne by som očakával zobrazenie kliknutia t.j. zatlačenie tlačidla, jeho vrátenie sa do štandardného (uvoľneného) stavu (keďže navyše tlačidlo myši nedržím stlačené) a vykonávanie ostatných riadkov kódu...

Medzi udalosťami Command buttonu nevidím inú rozumnú udalosť ako napr Before_Click alebo niečo podobné, čo by sa dalo využiť a nezaberá ani "nasilu" pridaný Application.ScreenUpdating=True

Vie niekto poradiť?

Předmět Autor Datum
A neni to kvuli tomu, ze VBA kod je single-threaded? Pak by se to GUI nemelo jak prekreslit, kdyz se…
MaSo 10.04.2017 14:31
MaSo
Díky moc!!! DoEvents pomohlo! Private Sub cmdTlacRozsahov_Click() lblCakaj.Visible = True DoEvents…
robert13 10.04.2017 14:52
robert13
No ja myslel, ze das to volani spis do te funkce Rozsahy...:-) Po vzoru toho stackoverflow postu, n… poslední
MaSo 10.04.2017 19:10
MaSo

Díky moc!!!

DoEvents pomohlo!

Private Sub cmdTlacRozsahov_Click()
    lblCakaj.Visible = True
    DoEvents
    Rozsahy
    lblCakaj.Visible = False
    Sheets("Rozsahy").PrintOut Copies:=1
End Sub

Skúšal som Application.EnableEvents, čo však viedlo k chybe... tak som myslel, že "tudy cesta nevede" a nakoniec je predsa niečo s Events-ami, len trocha inak ;-)

K tomu 1 threadovému spracovaniu: očakával som, že i tak by sa mohla procedúra prerušiť na prekreslenie a pokračovať s výpočtami až potom...
Takže to treba vynútiť... Zaujímavé však je, že bežne práve ak potrebuješ zakázať obnovovanie obrazu, musíš to zariadiť cez Application.ScreenUpdating=False. To mi zas pripadá, ako by si to vzájomne odporovalo... ::)

Díkyyy ešte raz!!!

:beer:

No ja myslel, ze das to volani spis do te funkce Rozsahy...:-)

Po vzoru toho stackoverflow postu, na ktery jsem odkazoval. Rekl bych, ze to funguje tak (ale ber to s rezervou, nejsem vubec Excel guru), ze kdyz delas nejakou dlouhou operaci, muzes pomoci toho DoEvents dat prostor procesoru se kouknout jestli necekaji nejake eventy na obslouzeni. Typicky, kdyz treba iterujes pres moooc prvku v cyklu, tak treba co 100 prvku volas DoEvents...

Kazdopadne jsem rad, ze pomohlo.

Zpět do poradny Odpovědět na původní otázku Nahoru