To, co vidíte, je chyba kompilace, která znamená, že klíčovému slovu Else (nebo ElseIf) nepředcházel správný příkaz If.
To znamená, že kompilátor našel příkaz Else (který pro uživatele zvýrazní), aniž by viděl příkaz If v řádcích nad ním. To je chyba, protože porušuje správnou syntaxi příkazu If-Then-Else. Správná syntaxe je následující:
Pro použití zkrácené syntaxe příkazu if, který určuje podmínku a akci (pro případ, že je podmínka splněna):
If
Then
Pro použití standardní syntaxe pro příkaz If, který specifikuje podmínku a akci (pro případ, že je podmínka splněna) a alternativní akci pro případ, že podmínka splněna není:
If
Then
Else
.
End if
Pro zadání více než jedné podmínky (a jejich akcí):
If
Then
ElseIf
Then
Else
End if
Chybná kompilace „Else Without If“ nastane, když „If
Then
“ chybí nebo je zapsáno nesprávně. Níže si podrobněji rozebereme nejčastější příčiny této chyby na příkladech.
Chybějící příkaz If
Když kompilátor VBA vidí, že klíčovému slovu Else nepředchází rozpoznatelný (správný) příkaz If, vygeneruje chybu „Else bez If“. Pro každé Else musí existovat příkaz If. Pro každé If však nutně nepotřebujeme příkaz else.
Příklad 1: Chybějící příkaz If
V tomto příkladu zobrazíme vstupní pole, které přijme vstup uživatele a uloží jej do x. Poté se setkáme s klíčovým slovem Else, ale před ním nebyl příkaz If. To skutečně způsobí chybu překladače:
Pro vyřešení tohoto problému stačí přidat příkaz If. Příkaz If se skládá z If
Then
.
Dodržování správné praxe odsazování je klíčové pro rozpoznání, zda se každá logika if-else-then skládá z potřebných klíčových slov (příkaz If, klíčové slovo Else, klíčové slovo End If).
If
Then
Else
If
Then
. Else
Konec If
Konec If
Příklad 2: Příkaz Else je uvnitř cyklu a příkaz If je mimo něj
Možná vás překvapí, že dostáváte chybu, když už máte příkaz If v kódu přítomen a umístěn před klíčovým slovem Else a správně zapsán. Problém nemusí být na první pohled patrný. Pokud se však podíváme blíže, zjistíme, že rozsah příkazu If je jiný než rozsah příkazu else.
Všechno mezi příkazem If a klíčovým slovem End If patří do rozsahu tohoto příkazu If. Další obory mohou v kódu existovat také v důsledku existence smyček, jako je smyčka For Next, smyčka Do Until nebo smyčka For Each Next.
Obor existuje, když logický příkaz vyžaduje více klíčových slov pro označení počátečního a koncového bodu příkazu. Problém nastane, pokud se obory překrývají způsobem, který způsobí, že jeden je částečně umístěn uvnitř druhého. Správný způsob, jak má více rozsahů vzájemně spolupracovat, je takový, že jeden je zcela umístěn uvnitř druhého.
V následujícím příkladu za If
Then
následuje začátek For
cyklu, po kterém následuje Else
klíčové slovo. To odděluje příkaz If a klíčové slovo Else a způsobuje zobrazení chyby.
Sub Else_Without_If()x = InputBox("Nastav hodnotu x")'začátek rozsahu příkazu ifIf x = 1 Then MsgBox "hodnota x je rovna 1" 'začátek nového rozsahu (For Next loop) For R = 1 To 5'Klíčové slovo Else je odděleno od svého příkazu If, protože je v jiném rozsahu.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
Pro odstranění problému zajistíme, aby logický příkaz If jako celek byl plně zahrnut do smyčky For. Nebo je smyčka For plně zahrnuta v rámci logického příkazu If Action; mezi If a Else nebo mezi Else a End If.
Všeobecně platí, že pokud má úsek vašeho kódu nějaký status díky tomu, že má počáteční a koncový bod (If – Else, Else – End If, For – Next, Do – Until), pak v jeho rámci nemůžete začít další úsek (rozsah), aniž byste jej ukončili v rámci prvního úseku.
Začáteční bod (If, Else, For, Do)
Další počáteční bod
Dělej něco
Další koncový bod
Koncový bod (Else, End If, Next, Until)
Pro aplikaci na náš příklad jej změníme na následující kód;
Sub Else_Without_If()x = InputBox("Nastav hodnotu x")'spuštění příkazu if scopeIf x = 1 Then MsgBox "hodnota x je rovna 1" 'spuštění nového scope (For Next loop) For R = 1 To 5 MsgBox "x hodnota je rovna 1" 'ukončení nového oboru ve stejném oboru, ve kterém byl zahájen Next RElse MsgBox "hodnota x není rovna 1 "End IfEnd Sub
Nekorektní příkaz If
Příklad 3: Umístění akce na stejný řádek s příkazem If
Další velmi častou chybou, která se často dělá, je zápis příkazu If způsobem, který není kompatibilní s využitím klíčového slova Else.
Pokud chceme použít klíčové slovo Else, musíme akční část logiky If-Then-Else umístit na další řádek za příkaz if. Pokud klíčové slovo Else nepoužíváme, pak můžeme akci umístit na stejný řádek jako příkaz If a nepíšeme klíčové slovo Else ani klíčové slovo End If.
Pokud je akce (která se má provést, pokud je podmínka pravdivá) umístěna na stejném řádku jako příkaz If, pak je příkaz If považován za dokončený. To se považuje za zkrácený způsob zápisu logiky If – then.
Pokud tedy kompilátor narazí na klíčové slovo Else, nenajde po něm příkaz If, který patří ke klíčovému slovu Else, protože tento příkaz If byl dokončen umístěním akce na stejný řádek jako příkaz If. Následující kód NENÍ správný a způsobí chybu kompilátoru:
Akce (MsgBox "hodnota x se rovná 1"
) musí být umístěna na dalším řádku za příkazem If, aby bylo možné v logice If-Then-Else použít příkaz Else. V následujícím kódu jsme příkaz akce přesunuli na další řádek, čímž jsme problém vyřešili.
Tímto jsme pokryli všechny možné příčiny chyby kompilace: Else bez if. Zopakujme si, že pokud dojde k této chybě, zkontrolujte, zda
1) Je na místě příkaz If, který předchází klíčovému slovu Else.
2) Řádek příkazu if neobsahuje nic jiného než If
Then
.
3) Zkontrolujte, zda příkaz If a klíčové slovo Else nejsou odděleny jiným oborem nebo úsekem, například cykly.
Podívejte se také: Jak opravit chybu „End If bez bloku If“
.