Stránka 1 z 1

Makro v Excelu funguje pouze v Debug modu

Napsal: 21 pro 2009 19:56
od Luboš
Zdravím všechny ochotné lidi, kteří mi mohou pomoct. Napsal jsem makro v VBA pro Excel 2003, které něco vypočítáva (řádově asi 3 sekundy) a na konci má toto makro zobrazit zprávu o ukončení výpočtu. V ladícím modu, když krokuji každý řádek makra, se toto okénko zobrazí a čeká na odkliknutí - přesně tak, jak to chci. Když však makro spustím přes asociované tlačítko, tak výpočet sice proběhne (zobrazí se změněné hodnoty po výpočtu), ale ukončující dialog ne. Nevíte proč? Na tomto fóru jsem odpověď nemohl najít. Děkuji za smysluplné odpovědi.

Konec makra je následující:

...
Text1 = "Výpočet ukončen"
Text2 = "Zpráva"

Response = MsgBox(Text1, 0, Text2)

Re: Makro v Excelu funguje pouze v Debug modu

Napsal: 21 pro 2009 21:39
od navstevnik
Pricinou muze byt to, ze v bufferu klavesnice je ulozen stisk klavesy Enter (mezernik) v dobe, nez je zobrazena zprava o ukonceni vypoctu. Zobrazena zprava ocekava stisk klavesy (enter, mezernik), a protoze v buferu klavesnice je tento znak ulozen, precte a zpravu ukonci. Overit to muzes vlozenim radku kodu s dalsi zpravou a v dobe pozastaveni behu kodu stiskni mezernik, zobrazi se az druha zprava:

Kód: Vybrat vše

Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sub aa()
  Text1 = "Vypocet ukoncen"
  Text2 = "Zpráva"
  ' v dobe pozastaveni behu makra stiskni mezernik
  Sleep 1000
  response = MsgBox(Text1, 0, Text2)
  response = MsgBox("Druha zprava")
End Sub

Neni nekde v behu kodu pouzit prikaz SendKeys "~" ? Ukazka:

Kód: Vybrat vše

Sub aa()
  Text1 = "Vypocet ukoncen"
  Text2 = "Zpráva"
  SendKeys "~" ' Enter
'  SendKeys "~" ' Enter
  response = MsgBox(Text1, 0, Text2)
  response = MsgBox("Druha zprava")
End Sub

Pokud bude zaktivovan i druhy prikaz SendKeys "~", tak se nezobrazi ani druha zprava.
Samozrejme pricina muze byt i jinde, ale vice informaci jsi neposkytl.

Re: Makro v Excelu funguje pouze v Debug modu  Vyřešeno

Napsal: 22 pro 2009 09:20
od Luboš
Bohužel, nezabralo ani Sleep ani Application.Wait, ale problém jsem vyřešil úplně náhodou. V hlavním chodu jsem totiž vyvolal proceduru pro výpočet příkazem Call a až po něm jsem uvedl příkaz pro zobrazení zprávy - tato varianta však nefungovala, jak jsem uvedl. Zkusil jsem přesunout příkaz Msg z hlavního chodu na konec procedury pro výpočet a ejhle - všechno funguje. Akorát mi uniká logika tohoto problému.
Takže shrnuto:

1. původní varianta:

Sub Main()
...
Call Vypocet()
Response Msg("Výpočet ukončen",0,"Zpráva")
End Sub

Sub Vypocet()
...
End Sub

2. opravená varianta:

Sub Main()
...
Call Vypocet()
End Sub

Sub Vypocet()
...
Response Msg("Výpočet ukončen",0,"Zpráva")
End Sub

Děkuji za ochotu