dnes je 6.7.2022

Input:

Excel 2007: Makra - VBA - Jak napsat „záškodnické“ makro

20.1.2011, , Zdroj: Verlag Dashöfer

V předchozích článcích jsme tvořili různé užitečné nástroje pomocí prográmků ve Visual Basicu. Bohužel Murphyho zákony lze jen velmi obtížně odstavit stranou, takže trénink v akcích, které způsobují škodu místo užitku je sám o sobě cenný. Uvědomíme si, jak bychom se při psaní užitečných maker mohli mimoděk stát záškodníky.

Úloha: Sestrojíme sešit, který po aktivaci listu „Tajné – neotevírat!“ způsobí zamrznutí Excelu.

Samozřejmě, že makro Vám nijak moc neuškodí, ale protože Excel doopravdy zamrzne, raději si uložte a případně i zavřete nejprve všechny otevřené soubory v Excelu – tedy pokud právě v této chvíli s Excelem pracujete.

Stáhněte si sešit 11_2 Zaskodnik.xlsm z odkazu na konci článku. Sešit otevřete.

Otevřete si VBE (editor Visual Basicu) např. Alt+<F11> a zobrazte si kód k listu „Tajné – neotevírat!“. Viz obrázek:

Vyvoláme pravým tlačítkem myši menu v okně Projektu na listu, jehož kód chceme ovlivnit. Vybereme View code a zobrazí se to, co ukazuje následující obrázek:

Rozeberme si podrobnosti.

Předně se setkáváme se slůvkem „Private“. Tímto slůvkem VBA zajišťuje, že uvedený podprogram Worksheet_Activate bude „vidět“ jen uvnitř tohoto projektu. Ptáte se, k čemu je to dobré? Uvědomte si, že stejně pojmenovaný program obsahuje každý list v každém Excelovém sešitě. Dovedete si představit ten chaos, kdyby měl VBA uhodnout, až byste takový podprogram chtěli zavolat, který z nich máte na mysli?

List Excelu je z hlediska VBA typový projekt (nazývá se zde „class module“), a obsahuje předem naprogramovanou sadu podprogramů. Jsou to:

Private Sub Worksheet_Activate()

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

Private Sub Worksheet_Calculate()

Private Sub Worksheet_Deactivate()

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

Private Sub Worksheet_Change(ByVal Target As Range)

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Kdybyste chtěli k některému listu takovou přeprogramovanou subroutinu použít, postupovali byste následovně. Aby to bylo konkrétní, řekněme, že budete chtít na listu List3 poté, co uživatel stiskne pravé tlačítko myši, zobrazit zprávu „Co zase chceš?“

Nejprve v okně Projektu pravým tlačítkem označíme List3 a zvolíme „View code“. Otevře se nám prázdné okno vpravo. Zde vybereme „Worksheet“ pomocí rozbalovacího menu. Viz obrázek:

Nyní

Nahrávám...
Nahrávám...