表示されているのは、Else (or ElseIf) キーワードに正しい If 文が先行しなかったことを意味するコンパイル エラーです。 これは、If-Then-Else ステートメントの正しい構文に違反しているため、エラーとなります。 正しい構文は次のとおりです。
条件とアクション (条件が満たされたとき) を指定する if 文の短縮構文を使用する場合。
If
Then
条件とアクション (条件が満たされたとき用) および条件が満たされないときの代替アクションを指定する If 文の標準構文を使用する場合。
If
Then
Else
End if
複数の条件(とその動作)を指定したい場合。
If
Then
ElseIf
Then
Else
の場合
End if
コンパイルエラー「Else Without If」は、「If
Then
」が抜けていたり間違って書かれていたりする場合に発生するエラーです。
Missing If Statement
VBAコンパイラは、Elseキーワードの前に認識可能な(正しい)If文がないことを確認すると、「IfなしのElse」というエラーを発生させます。 すべてのElseには、If文が必要です。 しかし、すべての If に対して、必ずしも else 文が必要なわけではありません。
Example 1: Missing If Statement
この例では、ユーザーの入力を受けてそれを x に格納する入力ボックスが表示されています。 これは確かにコンパイラーエラーを引き起こします。 Else Without If.
この問題を解決するには、If文を追加すればよいのです。 If文はIf
Then
.
良いインデントのやり方は、それぞれの if-else-then 論理が、必要なキーワード (If 文、Else キーワード、 End If キーワード) からなっているかを識別するのに極めて有効である。
If
Then
Else
If
Then
に相当する。 Else
End If
End If
<2185>例2.Edit I/Oの場合 Else 文がループの内側にあり、If 文が外側
すでにコード内に If 文があり、Else キーワードの前に置かれ、正しく書かれているのに、このエラーが表示されることに驚くかもしれません。 この問題は一見するとわからないかもしれません。 しかし、よく見てみると、If 文のスコープと else 文のスコープが異なることがわかります。
If 文と End If キーワードの間はすべて、この If 文のスコープに属しています。 また、For Nextループ、Do Untilループ、For Each Nextループなどのループの存在により、他のスコープもコード内に存在することがあります。
論理ステートメントがステートメントの開始点と終了点を示すために複数のキーワードを必要とする場合、スコープが存在します。 スコープを重ねると、一方が他方の中に部分的に入り込んでしまうという問題が発生します。
次の例では、If
Then
の後に For
ループの始まりと Else
キーワードが続いています。 これによりIf文とElseキーワードが分離され、エラーが表示されます。
Sub Else_Without_If()x = InputBox("Set x value")'starting the if statement scopeIf x = 1 Then MsgBox "x value is equal to 1" 'starting a new scope (For Next loop) For R = 1 To 5'Else keyword is separated from its If statement because it's in a different scope.If statement, Elseキーワードは、別のスコープにあるため。Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
この問題を解決するには、If論理文全体がForループ内に完全に包含されることを確認することです。 または、For ループが If 論理ステートメント Action 内に完全に包含されるようにします。
一般規則として、コードのセクションに開始点と終了点 (If – Else, Else – End If, For – Next, Do – Until) があるため、最初のセクションで終了せずにその中で別のセクション (scope) を始めることができません。
開始点 (If, Else, For, Do)
別の開始点
Do Something
別の終了点
終了点 (Else, End If, Next, Until)
これを例に適用するには、次のコードに変更する。
Sub Else_Without_If()x = InputBox("Set x value")'starting the if statement scopeIf x = 1 Then MsgBox "x value is equal to 1" 'starting a new scope (For Next loop) For R = 1 To 5 MsgBox "x value is equal to 1" '新しいスコープを開始したのと同じスコープ内で終了するNext RElse MsgBox "x value is not equal to 1 "End IfEnd Sub
Incorrect If Statement
Example 3.1: Ifステートメントと同じ行にアクションを配置する
また、よくある間違いは、Elseキーワードを利用することと互換性のない方法でIfステートメントを書くことです。
Elseキーワードを使用したい場合は、If-Then-Elseロジックのアクション部分をIfステートメントの次の行に配置する必要があります。 Elseキーワードを使用しない場合は、If文と同じ行にアクションを配置すればよく、ElseキーワードやEnd Ifキーワードは書きません。
アクション(条件が真の場合に実行されるべきもの)をIf文と同じ行に配置すると、If文が完了したとみなされます。 これは、If – then ロジックを書くための省略法と考えられています。
そのため、コンパイラがその後に Else キーワードに出会ったとき、Else キーワードに属する If 文を見つけることができないのですが、これはその If 文が If 文と同じ行に動作を配置して完了したためです。 次のコードは正しくなく、コンパイラーエラーを引き起こします。 Else without If.
アクション (MsgBox "x value is equal to 1"
) は、If-Then-Else ロジックで Else ステートメントを使用できるようにするために If ステートメントの次の行に配置される必要があります。 次のコードでは、action 文を次の行に移動し、問題を解決しています。
これで、コンパイル エラーの考えられる原因をすべて網羅しました。 if を使用しない Else です。 要約すると、このエラーが発生した場合、
1) Else キーワードの前に If 文があるかどうかを確認します。
2) If 文の行に If
Then 以外が含まれていないかどうか。
3) If 文と Else キーワードはループなどの別のスコープまたはセクションで分離されていないかを検証します。
関連記事もご覧ください。 ブロックIfがないEnd If」エラーの修正方法