V této části budeme pokračovat ve vývoji doplňku Odebrat úsečky dle délky z části minulé. Doplníme možnost volby, zda se budou odebírat úsečky kratší nebo delší než zadaná délka. Pro nabídku této volby uživateli vytvoříme vlastní dialogové okno.
Uživatelský formulář (User Form)
V editoru VBA otevřeme projekt ReLiByLe. V menu Insert vybereme položku UserForm. Je dostupná i po kliknutí pravým tlačítkem myši na název projektu v okně Project – ReLiByLe v kontextovém menu Insert > UserForm. Místo modulu pro psaní kódu se otevře formulář pro návrh dialogového okna. Projekt může takových formulářů obsahovat libovolný počet. Standardně jsou pojmenovávány UserForm1, UserForm2 a tak dále. Název každého formuláře můžeme změnit tak, aby lépe popisoval jeho funkci, v okně Properties, v položce Name. (Musíme dodržet pravidla pro pojmenovávání podobně jako u proměnných a procedur.)
Název v záhlaví dialogu, ve výchozím stavu rovněž UserForm1, je vlastnost Caption. V okně Properties ji změníme na Odebrat úsečky dle délky:

Ovládací prvky
Spolu s formulářem se otevřel i panel nástrojů Toolbox (pokud ne, použijte menu View > Toolbox). Je viditelný pouze tehdy, když je aktivní návrhový formulář. Obsahuje různé ovládací prvky (controls), které můžeme použit v dialogu.
V první řadě potřebujeme textové pole pro zadání délky. Je to ovládací prvek s názvem TextBox. Jeho umístění do formuláře můžeme provést několika způsoby. Nejjednodušší je přetáhnout ho z Toolboxu na vhodné místo ve formuláři. Další možnost je kliknout nejprve na TextBox a pak na místo ve formuláři, kde chceme mít levý horní roh pole. (nad formulářem se kurzor změní na pravoúhlý kříž). V obou případech se pole vykreslí ve výchozí velikosti. Pokud neklikneme, ale jen stiskneme, tažením myši pak můžeme vykreslit pole libovolné velikosti.
Umísťování ostatních ovládacích prvků funguje stejně. Polohu a velikost všech prvků můžeme kdykoli změnit, buď přetažením, nebo zadáním přesné hodnoty v okně Properties. Polohu určují vlastnosti Top (vzdálenost horního okraje prvku od horního okraje formuláře) a Left (totéž pro levý okraj). Rozměry jsou Width (šířka) a Heigth (výška).
Textové pole je vhodné popsat, aby uživatel věděl, jaký je jeho účel. K tomu slouží ovládací prvek Label (štítek, popisek). Umístíme ho před textové pole, klikneme na něj a přepíšeme výchozí text Label1 na Zadejte délku:. Přepsání můžeme provést i v okně Properties, vlastnost Caption. Za pole vložíme další štítek pro uvedení jednotky délky (m). Výchozí výška štítků je zbytečně velká, pro jednořádkový text stačí menší. Nastavíme ji opět buď přetažením okraje nebo v okně Properties. V něm můžeme nastavovat společné vlastnosti pro více ovládacích prvků současně, pokud je na formuláři vybereme přetažením myší. (Přidávat nebo odebírat další pak můžeme novým výběrem po stisku klávesy Ctrl.) Vybereme tedy oba štítky a v okně Properties nastavíme vlastnost Height na 12.
Zarovnávání ovládacích prvků usnadňuje mřížka na formuláři, ke které se přichytávají. Její nastavení nebo případné vypnutí je dostupné v menu Tools > Options… na kartě General, položky Form Grid Settings.
Zarovnávání ovládacích prvků
Pro usnadnění zarovnávání, centrování a podobně jsou dostupné různé možnosti v menu Format. Naše prvky – pole a štítky, mají různou velikost, použijeme proto položku Align > Middles (zarovnání vybraných prvků na jejich středy), kterou aplikujeme po jejich výběru.
Dále potřebujeme dvě tlačítka OK pro spuštění akce a Zavřít pro zavření dialogu. Tlačítko je ovládací prvek CommandButton. Umístíme dva tyto prvky do formuláře a změníme jejich výchozí popisky (opět vlastnost Caption) na OK a Zavřít. Vhodně je umístíme a zarovnáme. Tažením upravíme velikost celého formuláře, aby odpovídala prvkům tvořících jeho obsah.
Pečlivě umísťovat a zarovnávat ovládací prvky se vyplatí, dialog působí profesionálněji. Je například dobré samostatné skupiny ovládacích prvků zarovnávat na střed formuláře: Vybereme nejprve textové pole a oba štítky. Seskupíme je pomocí menu Format > Group, zarovnáme – menu Format > Center in Form > Horizontally a oddělíme – Format > Ungroup. Stejný postup zopakujeme pro obě tlačítka.
Pořadí ovládacích prvků
Někteří uživatelé používají pro pohyb mezi ovládacími prvky klávesu Tab, která přesunuje fokus z jednoho prvku na následující. Pořadí prvků je ve výchozím stavu dané pořadím jejich vložení na formulář. Může být správné, pokud ale prvky různě přesunujeme a vkládáme mezi ně nové, pořadí se naruší a fokus přeskakuje chaoticky. Pak je třeba pořadí správně nastavit, a to pomocí položky menu View > Tab Order. Je dostupná i v kontextovém menu formuláře. Další možností je ručně nastavit vlastnost TabIndex každého prvku. První prvek má hodnotu 0, druhý 1 atd. Pokud provedeme změnu u jednoho prvku, automaticky se přečíslují i prvky za ním.
Pojmenování ovládacích prvků
Máme tedy formulář UserForm1 s ovládacími prvky:
- Label1
- TextBox1
- Label2
- CommandButton1
- CommandButton2
Tyto výchozí názvy můžeme samozřejmě ponechat. Budeme s nimi ale pracovat dále v kódu, je proto vhodné použít nějaké lépe vypovídající názvy (vlastnost Name): TextBox1 přejmenujeme na tbLength, CommandButton1 na cbOk a CommandButton2 na cbClose. Se štítky v kódu pracovat nebudeme, přejmenovávat je nemusíme.
Zobrazení dialogu
Uživatelské formuláře je možno spustit stejně jako procedury (menu Run > Run Sub/UserForm, stejnojmenné tlačítko nebo F5) Naše dialogové okno se otevře v prostředí MicroStationu:

Tímto způsobem můžeme dialog testovat a kontrolovat. Pro otevření dialogu uživatelem musíme vytvořit samostatnou proceduru s příslušným příkazem, která musí být umístěna ve standardním modulu.
Z návrhového formuláře přejdeme na modul Main, který jsem používali v minulé části (menu Window > Main (Code) nebo dvojklik na tento modul v okně Project Explorer). Tady vložíme tento kód:
Sub Start() UserForm1.Show FalseEnd Sub
Tato veřejná procedura bude startovním bodem našeho doplňku, proto jsem ji pojmenoval Start. Voláme v ní metodu Show objektu UserForm1. Tato metoda inicializuje a zobrazí náš dialog.
Metoda Show má parametr Modal datového typu Boolean s výchozí hodnotou True. Dialog se zobrazí modálně. To znamená, že je aktivní pouze on samotný a ostatní prostředí MicroStationu je nedostupné. Někdy je toto chování žádoucí, v tomto našem konkrétním příkladu nikoli. Kdyby chtěl uživatel například vybrat další úsečky, nemůže, dokud dialog nezavře. Nastavíme proto parametr Modal na hodnotu False (nebo 0, nebo konstantu vbModeless).
Zavření dialogu – zpracování událostí
Uživatel může dialog zavřít stisknutím křížku v pravém horním rohu nebo pomocí kláves Alt + F4. My máme své vlastní plnohodnotné tlačítko Zavřít. Jak dosáhneme toho, aby fungovalo, když na něj uživatel klikne?
Kliknutí je jedním ze způsobů, jak může uživatel s dialogem interagovat. Může provést i dvojklik, stisknout nějakou klávesu a podobně. V terminologii VBA tím vyvolává události (events), v případě kliknutí událost Click. V kódu můžeme tyto události zpracovávat v událostních procedurách (Event Handler).
Každý uživatelský formulář má své okno kódu. Když vybereme formulář v okně Project Explorer, můžeme přepínat mezi formulářem a jeho kódem tlačítky View Code a View Object v záhlaví tohoto okna. Můžeme rovněž použít menu View > Code a View > Object nebo klávesové zkratky F7 a Shift + F7. Tyto nabídky jsou i v kontextových menu formuláře a jeho názvu v okně Project Explorer.
Událostní procedury musí být umístěny v okně kódu formuláře, ne v běžném modulu. V záhlaví okna kódu jsou dva rozbalovací seznamy. První je seznam objektů a obsahuje daný formulář UserForm a všechny ovládací prvky na něm umístěné. Druhý je seznam událostí, které mohou nastat u objektu vybraném v prvním seznamu. Události, které jsou již v kódu implementovány, jsou zobrazeny tučně a po jejich vybrání se do příslušné událostní procedury přesune kurzor. Pokud implementovány nejsou, editor proceduru automaticky vytvoří.
Vytvořme tedy událostní proceduru pro kliknutí na tlačítko Zavřít. Některým z popsaných způsobů se přepneme do okna kódu formuláře. V prvním seznamu vybereme objekt cbClose. Událost Click je pro objekt CommandButton výchozí, takže editor VBA vytvoří událostní proceduru automaticky. Má název cbClose_Click. Takto jsou pojmenovávány všechny událostní procedury – kombinací názvu ovládacího prvku, podtržítka a názvu události.
Pokud bychom chtěli implementovat jinou událost, například dvojklik (double click), vybereme ji v druhém seznamu (DbClick). Editor opět vloží danou proceduru automaticky.
Pro událost Click může být vytvoření událostní procedury ještě snadnější. V návrhovém formuláři našeho dialogu stačí poklepat (provést dvojklik) na tlačítko Zavřít. VBA editor se automaticky přepne z návrhového formuláře do okna jeho kódu a vytvoří proceduru. Pokud již existuje, přesune do ní kurzor.
Zbývá do procedury napsat kód pro zavření dialogu:
Private Sub cbClose_Click() Unload UserForm1End Sub
Místo UserForm1 můžeme použít klíčové slovo Me, které v kódu formuláře odkazuje na tento formulář. Výhoda je v tom, že pokud někdy přejmenujeme formulář, nemusíme opravovat kód.
Private Sub cbClose_Click() Unload MeEnd Sub
Unload je příkaz, který zavře otevřený formulář a uvolní ho z paměti, včetně všech uživatelských vstupů a voleb. Pokud uživatel zadá do textového pole nějakou délku a dialog zavře, při dalším otevření bude pole prázdné. Aby k tomu nedošlo, použijeme jinou metodu objektu UserForm: Hide. Ta dialog pouze skryje, ale ponechá ho v paměti:
Private Sub cbClose_Click() Me.HideEnd Sub
Spuštění hlavní procedury
Z minulé části máme připravenou hlavní proceduru RemoveLinesByLength. Její využití vyžaduje jen drobnou úpravu – odstranění zadání délky pomocí funkce InputBox a s tím souvisejícím ošetřením chyb. Délku, kterou uživatel zadá do textového pole, předáme proceduře jako parametr Length datového typu Double:
Sub RemoveLinesByLength(length As Double)
Dim elEm As ElementEnumerator
' Dim length As Double
If Not ActiveModelReference.AnyElementsSelected Then
MsgBox "Není vybrán žádný prvek.", vbOKOnly + vbExclamation, TITLE
Exit Sub
End If
' On Error GoTo errorHandler
' length = InputBox("Zadejte délku:", TITLE)
Set elEm = ActiveModelReference.GetSelectedElements
Do While elEm.MoveNext
If elEm.Current.IsLineElement Then
If elEm.Current.AsLineElement.length <= length Then
ActiveModelReference.UnselectElement elEm.Current
End If
Else
ActiveModelReference.UnselectElement elEm.Current
End If
Loop
'errorHandler:
End Sub
Místo proměnné Length deklarujeme stejnojmenný parametr a odstraníme InputBox.
Na formuláři poklepeme na tlačítko OK, editor vytvoří proceduru cbOk_Click. V ní zavoláme hlavní proceduru s parametrem length:
Private Sub cbOk_Click() RemoveLinesByLength Me.tbLength.ValueEnd Sub
Voláme hlavní proceduru a jako parametr ji předáváme vlastnost Value objektu tbLength, která obsahuje hodnotu zadanou v textovém poli.
Klíčové slovo Me odkazující na formulář můžeme vynechat, předpokládá se implicitně. Stejně tak vlastnost Value. Každý ovládací prvek má svoji implicitní vlastnost, u textového pole je to tato. Příkaz tedy funguje i ve formě
RemoveLinesByLength tbLength
Toto řešení je plně funkční a bezproblémové, vyplynulo ale hlavně z toho, že proceduru RemoveLineByLength už máme napsanou z dřívějška. Kdybychom hned začínali s vlastním dialogem, kód této procedury bychom napsali přímo do událostní procedury a další samostatnou proceduru bychom nevytvářeli:
Private Sub cbOk_Click()Dim elEm As ElementEnumerator If Not ActiveModelReference.AnyElementsSelected Then MsgBox "Není vybrán žádný prvek.", vbOKOnly + vbExclamation, TITLE Exit Sub End If Set elEm = ActiveModelReference.GetSelectedElements Do While elEm.MoveNext If elEm.Current.IsLineElement Then If elEm.Current.AsLineElement.length <= tbLength Then ActiveModelReference.UnselectElement elEm.Current End If Else ActiveModelReference.UnselectElement elEm.Current End If LoopEnd Sub
Místo volání procedury jsme ji zrušili a její kód přesunuli do událostní procedury. Jediná změna spočívá v přímém použití hodnoty v textovém poli, která byla původně předávaná jako parametr procedury.
I toto řešení je správné. V programování téměř vždy existuje více způsobů, jak dosáhnout zamýšleného výsledku. Výběr mezi nimi závisí na konkrétní situaci a na osobních preferencích.
Kontrola vstupu
Po zadání platné délky vše funguje Potřebujeme ale znovu ošetřit nesprávný vstup. S malými úpravami bychom mohli ponechat původní zpracování chyby, ale pro uživatele je pohodlnější, když místo dodatečného upozornění hned vidí například svůj překlep.
Při každé změně hodnoty v textovém poli je vyvolána jeho událost Change. Můžeme tedy využít událostní proceduru pro kontrolu aktuální hodnoty pole.
V návrhovém formuláři poklepeme na textové pole, editor vytvoří událostní proceduru. Vložíme do ní tento kód:
Private Sub tbLength_Change()Dim length As Double On Error Resume Next length = CDbl(tbLength) If Err <> 0 Then tbLength.ForeColor = vbRed Else tbLength.ForeColor = vbBlack End If End Sub
Deklarujeme proměnnou length typu Double a pokoušíme se do ní přiřadit hodnotu v textovém poli (implicitní vlastnost Value) pomocí konverzní funkce CDbl, která vrací hodnotu typu Double, pokud je její parametr Expression převoditelný na desetinné číslo a která vyvolá chybu, pokud parametr převoditelný není.
Pro ošetření chyby použijeme podobný příkaz jako v původním řešení, ale místo GoTo label zadáme Resume Next (pokračovat na dalším). V tomto případě není při chybě běh programu přesunut na označený řádek, ale na řádek následující za řádkem, na kterém k chybě došlo.
Na tomto řádku použijeme VBA objekt Err, který obsahuje informace o chybě. Jeho implicitní vlastnost je Number – číslo chyby. Má hodnotu 0, pokud k chybě nedošlo (konverze na číslo proběhla v pořádku, zadaná hodnota je platná). To ověříme v konstrukci If Then, a podle výsledku nastavíme barvu textu v textovém poli (vlastnost ForeColor) buď na červenou (chyba), nebo na výchozí černou (platná hodnota). Použijeme k tomu předdefinované konstanty vbRed a vbBlack.
Pozn. 1: Barvy ve VBA
Barva ve VBA je definovaná celočíselnou hodnotou v rozsahu 0 – 16777215, která může být zapsána v desítkové nebo hexadecimální (prefix &H) číselné soustavě. Černá má hodnotu 0 nebo &H0, červená 255 nebo &HFF, zelená 65280 nebo &HFF00 a podobně.
Pro základní barvy jsou definovány VBA konstanty.
Barvy můžeme definovat i pomocí funkce RGB, jejímiž argumenty jsou hodnoty červené, zelené a modré.
Hexadecimální a RGB hodnoty barev se dají vyhledat v různých on-line nástrojích (color picker). V prostředí VBA editoru je můžeme zjistit u ovládacích prvků v okně Properties u vlastností obsahujících barvy, kde je pro jejich nastavení k dispozici rozbalovací nabídka s různými možnostmi výběru. Vybereme požadovanou barvu a zkopírujeme její kód. Pak vrátíme původní barvu.
Zablokování ovládacího prvku
Naše ošetření chyb zatím funguje jen jako vizuální upozornění během psaní do textového pole. Uživatel má stále možnost stisknout tlačítko OK, a to i v případě, že nezadá žádnou délku.
Napravíme to tak, že tlačítko OK budeme blokovat, dokud uživatel nezadá platnou délku. Vybereme ho v návrhovém formuláři a v okně Properties nastavíme vlastnost Enabled na hodnotu False. A stejnou vlastnost nastavíme i v kódu událostní procedury v závislosti na kontrole chyby:
Private Sub tbLength_Change()
Dim length As Double
On Error Resume Next
length = CDbl(tbLength)
If Err <> 0 Then
tbLength.ForeColor = vbRed
cbOk.Enabled = False
Else
tbLength.ForeColor = vbBlack
cbOk.Enabled = True
End If
End Sub
Tlačítko OK (cbOk) je dostupné jen v případě, že textové pole tbLength obsahuje hodnotu převoditelnou na text.
Přepínač (Option Button)
Zatím jsme pouze nahradili InputBox z minulé části vlastním dialogem, ale funkčnost zůstala stejná. Teď přidáme novou: možnost volby, zda se budou odebírat úsečky kratší nebo delší než zadaná délka.
Pro výběr pouze jedné z několika možností se používá ovládací prvek přepínač (option button). Je tvořen malým kruhovým políčkem a textovým popisem. Políčko je buď vyplněné nebo prázdné – přepínač je zapnutý nebo vypnutý. Zapnutí se provádí kliknutím nebo stiskem mezerníku (přepínač musí mít fokus).
Přepínače se vždy používají ve skupinách, nejméně ve dvou. Když je jeden zapnut, ostatní se vypnou. Pokud bychom potřebovali více samostatných skupin přepínačů, musíme je seskupit do ovládacího prvku rámeček (frame). To není náš případ, takže je umístíme přímo na formulář:

Výchozí názvy přepínačů změníme na obShorter a obLonger. Jako výchozí nastavíme první z nich – v okně Properties nastavíme jeho vlastnost Value na hodnotu True.
Srozumitelnost dialogu můžeme vylepšit jasnějším popisem a uspořádáním ovládacích prvků:

Do kódu doplníme další konstrukci If Then s podmínkou hodnoty přepínače:
Private Sub cbOk_Click()Dim elEm As ElementEnumerator If Not ActiveModelReference.AnyElementsSelected Then MsgBox "Není vybrán žádný prvek.", vbOKOnly + vbExclamation, TITLE Exit Sub End If Set elEm = ActiveModelReference.GetSelectedElements Do While elEm.MoveNext If elEm.Current.IsLineElement Then If obShorter Then If elEm.Current.AsLineElement.length <= tbLength Then ActiveModelReference.UnselectElement elEm.Current End If Else If elEm.Current.AsLineElement.length > tbLength Then ActiveModelReference.UnselectElement elEm.Current End If End If Else ActiveModelReference.UnselectElement elEm.Current End If LoopEnd Sub
Implicitní vlastnost přepínače je Value, nemusíme ji proto uvádět. Má hodnotu True, pokud je přepínač zapnutý. Pokud to tedy platí u přepínače obShorter, odebíráme kratší úsečky, jinak (else) je jasné, že je zapnutý obLonger a odebíráme úsečky delší.
Stavový řádek
MicroStation průběžně informuje o tom, který příkaz zpracovává, co má uživatel udělat a jaký je výsledek nebo stav. Používá k tomu stavový řádek (status bar). Není to nutné, ale užitečné, proto toto chování do našeho malého doplňku zahrneme.
Knihovna MicroStationDGN nám dává potřebné funkce k dispozici. Jsou to metody objektu Application ShowCommand (příkaz), ShowPromt (výzva k akci) a ShowStatus (aktuální stav). Můžeme je použít kdykoli v běhu programu.
Nejdříve zobrazíme informace před otevřením dialogu v proceduře Start:
Option ExplicitPublic Const TITLE As String = "Jesyka"Public Const COMMAND As String = "ODEBRAT ÚSEČKY DLE DÉLKY"Public Const PROMPT As String = "Vyberte prvek"Sub Start() ShowCommand COMMAND ShowPrompt PROMPT ShowStatus "" UserForm1.Show FalseEnd Sub
Texty příkazu a výzvy použijeme i na dalších místech, uložíme je proto do konstant COMMAND a PROMPT.
I když nepřinášíme žádné informace, použijeme prázdný řetězec, abychom vymazali případné informace z předchozích interakcí.

Dialog je nemodální, takže uživatel má stále možnost vybrat úsečky. Pokud tak učiní, MicroStation změní příkaz ve stavovém řádku na Vybrat prvek nebo jinak podle toho, co uživatel bude dělat. My ho proto opět aktualizujeme po kliknutí na naše tlačítko OK, hned na začátku procedury.
Na konci této procedury by bylo vhodné uživatele informovat, kolik prvků bylo odebráno. K tomuto účelu doplníme do kódu počítání zpracovávaných prvků.
Private Sub cbOk_Click()
Dim elEm As ElementEnumerator
Dim tc As Long, c As Long
ShowCommand COMMAND
ShowPrompt ""
ShowStatus ""
If Not ActiveModelReference.AnyElementsSelected Then
MsgBox "Není vybrán žádný prvek.", vbOKOnly + vbExclamation, TITLE
ShowPrompt "Vyberte prvek"
Exit Sub
End If
Set elEm = ActiveModelReference.GetSelectedElements
Do While elEm.MoveNext
tc = tc + 1
If elEm.Current.IsLineElement Then
If obShorter Then
If elEm.Current.AsLineElement.length <= tbLength Then
ActiveModelReference.UnselectElement elEm.Current
c = c + 1
End If
Else
If elEm.Current.AsLineElement.length > tbLength Then
ActiveModelReference.UnselectElement elEm.Current
c = c + 1
End If
End If
Else
ActiveModelReference.UnselectElement elEm.Current
c = c + 1
End If
Loop
ShowStatus "Odebraných prvků: " & c & " (z " & tc & ")"
End Sub
Deklarujeme dvě proměnné typu Long – tc a c pro ukládání počtu zpracovávaných a odebíraných prvků. Pro proměnné určené k podobným účelům, které se používají na více místech, je vhodné použít co nejjednodušší název. Volím tc (total count) pro celkový počet a c (count) pro odebraný počet.
Celkový počet navýšíme v každém průchodu cyklu Do Loop a odebraný počet při každém odebírání z výběrové množiny.
Na konci procedury zobrazíme výsledek kombinující textový popis s hodnotami proměnných.

Události formuláře
Pokud jsme pořádkumilovní, měli bychom stavový řádek vyčistit, když uživatel zavře náš dialog. Uděláme to v proceduře cbClose:
Private Sub cbClose_Click() ShowCommand "" ShowPrompt "" ShowStatus "" ShowMessage "Doplněk ReLiByLe byl uzavřen." Me.HideEnd Sub
Vyčistili jsme všechny informace a využili další metodu, kterou máme k dispozici: zobrazení zprávy (ShowMessage).
Uživatel může dialog zavřít křížkem v záhlaví. Jak zjistíme, že to udělal? VBA na takové situace myslí a vyvolává události, které se týkají přímo dialogu, například jeho inicializace, aktivace a deaktivace, změna velikosti a podobně. Tak vyvolá událost i po zavření dialogu, je to událost Terminate. Do její událostní procedury můžeme vložit náš kód.
Proceduru vytvoříme již dříve popsaným postupem: v záhlaví okna kódu formuláře vybereme v prvním, levém rozbalovacím seznamu objekt UserForm a v druhém seznamu událost Terminate. Editor vytvoří proceduru automaticky.
Private Sub UserForm_Terminate() ShowCommand "" ShowPrompt "" ShowStatus "" ShowMessage "Doplněk ReLiByLe byl uzavřen."End Sub
Kdykoli používáme stejný kód na více místech, je lepší umístit ho do samostatné procedury:
Private Sub clearStatusBar() ShowCommand "" ShowPrompt "" ShowStatus "" ShowMessage "Doplněk ReLiByLe byl uzavřen." End SubPrivate Sub cbClose_Click() clearStatusBar Me.HideEnd SubPrivate Sub UserForm_Terminate() clearStatusBarEnd Sub
Vidíme, že do okna kódu formuláře můžeme vkládat i běžné procedury, nejen procedury událostní.
Už jen poslední optimalizace: Text uložený v konstantě COMMAND je stejný jako text v záhlaví našeho dialogu, vlastnost Caption. V okně Properties toho nelze nijak využít, zde se zadává pouze prostý text. Před otevřením dialogu se ale vyvolává událost Initialize (inicializace). V ní máme možnost nastavit libovolné vlastnosti formuláře, včetně Caption:
Private Sub UserForm_Initialize() Caption = COMMANDEnd Sub
Vytvoříme událostní proceduru a nastavíme vlastnost Caption. Doslovný kód je UserForm1.Caption nebo Me.Caption. Je to stejný objekt – aktivní formulář, a jak už víme, předpokládá se automaticky.