Onehdy jsem narazil na zajímavý kus kódu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Sub Nesrovnalost() 'Baskar S. Ganapathy Dim x As Integer Dim y As Integer Dim z As Integer x = 10 y = 20 If (z = WorksheetFunction.Max(x, y)) > 0 Then MsgBox "Jasnačka..." Else MsgBox "A jejda..." End If End Sub |
Není vám jasné, proč se dočkáte zprávy „A jejda..“? Tak si dáme trochu teorie k „rovná se“.
Prvně, kde se s tímto symbolem uživatel setkává, je učebnice a její výklad „znakem rovná se říkáme Excelu, že začínáme psát vzorec“. Já bych upřesnil, že tímto symbolem přiřazujeme hodnotu do buňky vzorcem. Jinými slovy, jedná se v tomto případě o operátor přiřazení. Pro většinu lidí je takové užití jediné a konečné. Je-li potřeba větvit výpočty, začne učebnice funkcí KDYŽ a její čtenář tak třeba nikdy nepozná zápis =A1=5. Zatímco první „rovná se“ plní úlohu přiřazení výsledku vzorce do buňky, v níž je aplikován, druhé zde zastupuje tzv. srovnávací (porovnávací, komparační) operátor. Jinými slovy, do buňky bude navrácen výsledek testu (výroku) A1=5, tj. PRAVDA nebo NEPRAVDA. Tip: Pokud cítíte ve snaze porozumět vzorci jakýsi blok, zakryjte si první „rovná se“.
A jak je tomu ve VBA? V zápisu x = 10 výše zmíněného kódu plní symbol „rovná se“ také úlohu operátoru přiřazení (hodnoty do proměnné). V konstrukci If..Then už ovšem nepřiřazujeme do proměnné „z“ maximum z výčtu „x“ a „y“, nýbrž porovnáváme obsah proměnné „z“ s maximem na pravé straně „rovná se“. Díky uvedené deklaraci proměnné typu celé číslo obsahuje proměnná „z“ v době srovnávání hodnotu 0.
Pozn. č. 1. Kód nikdy neskočí do první větve. I kdyby byla výsledkem porovnání „pravda“ (na listu PRAVDA ekvivalentní číslu 1), tak ve VBA je výsledek představován hodnotou True odpovídající číslu -1 (škrtil bych programátora, který s tímhle rozdílem ve Visual Basicu přišel).
Pozn. č. 2. Jiné programovací jazyky používají jako srovnávací operátor dvojici „rovná se“, tj. ==. Nedojde tak k uvedené mýlce.
Pozn. č. 3. Stejně jako v případě klasického přiřazení hodnoty proměnné přiřazujeme hodnoty vlastnostem objektů (např. CheckBox.Enabled = True). Pokud ovšem pracujeme ve VBA s výčty parametrů procedur, funkcí či metod, pak používáme pro přiřazení symbolů := (např. MsgBox Title:=“Titulek“, Prompt:=“Je vše v pořádku?“, Buttons:=vbYesNo).