Není rovná se jako rovná se

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).

Klikni a stahuj!