表示されているのは、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」エラーの修正方法

コメントを残す

メールアドレスが公開されることはありません。