If文の書き方は覚えた。でも、思った通りに分岐してくれない。
「条件に合っているはずなのに、なぜか別の処理が動く」——そんな経験はありませんか?
If文の条件が思い通りに動かない理由は、「見た目は同じでも、実際は違うデータ」を比較していることが多いからです。数値と文字列の違い、余分なスペース、大文字小文字——これらが条件分岐を狂わせる原因になります。
この記事では、次のことを解説します。
- If文が思い通りに動かない代表的な3つの原因
- なぜ「同じに見える値」が一致しないのか
- 条件分岐を確実に動かすための確認方法
なぜIfの条件が思い通りに動かないのか——3つの原因
① 見た目は空白なのに、条件が一致しない
空白に見えるセルを判定するとき、こう書くことがあります。
If Cells(i, 1).Value = "" Then
これは多くの場合うまく動きますが、セルに数式が入っているとき、話が変わります。
たとえば=IF(A1="","",A1)という数式が入っていて、A1が空のとき。セルには何も表示されません。見た目は空白と区別がつきません。
でも、= ""とIsEmptyでは結果が違います。
| セルの状態 | 見た目 | = “” | IsEmpty |
|---|---|---|---|
| 何も入っていない | 空白 | True | True |
| 数式が””を返している | 空白(に見える) | True | False |
数式が入っているセルは、値が””でも「何かが入っているセル」としてIsEmptyはFalseを返します。
「本当に何も入っていないセルだけ飛ばしたい」場合はIsEmptyを使います。「数式が””を返しているセルも空白として扱いたい」場合は= ""で問題ありません。目的によって使い分けてください。
② 見えないスペースが紛れ込んでいる
「東京」と「東京 」(末尾に半角または全角スペース)は、見た目では区別できません。でもVBAにとっては別の文字列です。
Excelに入力する際、コピー&貼り付けで余分なスペースが混入することがあります。条件が一致しないとき、この見えないスペースが原因になっているケースは少なくありません。
対処法として、比較する前にTrim関数で余分なスペースを取り除く方法があります。
If Trim(Cells(i, 1).Value) = "東京" Then
Trimを使うことで、前後の余分なスペースを無視して比較できます。
③ 大文字・小文字、全角・半角が違う
アルファベットの大文字・小文字、数字や文字の全角・半角も、見た目が近いため見落としやすいポイントです。
たとえば「A」と「a」は別の文字として扱われます。「1」(全角)と「1」(半角)も別物です。入力者によって表記がバラバラになりやすい項目でよく起きます。
大文字・小文字の統一にはUCase関数を使います。
If UCase(Cells(i, 1).Value) = "ABC" Then
UCase関数は文字列をすべて大文字に変換します。セルに「abc」「Abc」「ABC」のいずれが入っていても、UCaseで変換してから比較すれば「ABC」と一致します。比較する前に形をそろえるイメージです。
全角・半角の統一にはStrConv関数を使います。
If StrConv(Cells(i, 1).Value, vbNarrow) = "ABC" Then
StrConv関数は文字の「形」を変換します。vbNarrowを指定すると全角文字を半角に変換します。セルに「ABC」(全角)が入っていても、半角に変換してから比較するので「ABC」と一致します。
入力が統一されているか怪しい場合は、比較する前にUCaseやStrConvで形をそろえることで、条件分岐が安定します。
If文を確実に動かすための確認方法
条件に使う値を、まず表示して確認する
比較する前に、形をそろえる
数値と文字列、スペースの有無、大文字小文字——これらは比較する前にそろえることができます。Trim、UCase、CStr(文字列に変換)、CLng(数値に変換)といった関数を使って、比較する両方の形を統一する習慣をつけると、条件分岐が安定します。
条件を一つずつ分けて確認する
複数の条件をAndやOrでつなげている場合、どの条件で引っかかっているか分かりにくくなります。一度それぞれの条件を別々のIf文にして、どこで意図通りに動いていないかを確認すると、原因を特定しやすくなります。
まとめ
If文の条件が思い通りに動かない理由は、「見た目は同じでも実際は違うデータ」を比較していることがほとんどです。
- 見た目は空白でも
= ""とIsEmptyで結果が違う——数式が””を返しているセルはIsEmptyがFalseになる - 見えないスペースの混入——Trimで取り除く
- 大文字・小文字、全角・半角の違い——UCaseやStrConvでそろえる
条件が思い通りに動かないときは、「比較している値そのものを疑う」ことが解決の第一歩です。MsgBoxやDebug.Printで実際の値を確認する習慣をつけると、If文のトラブルがぐっと減ります。
よくある質問
Q. = ""とIsEmptyはどう使い分ければいいですか?
本当に何も入っていないセルだけを「空白」として扱いたい場合はIsEmptyを使います。数式が””を返しているセルも含めて「空白」として扱いたい場合は= ""で問題ありません。どちらを使うかは、そのセルに数式が入り得るかどうかで判断してください。
Q. Trim関数は何をしてくれますか?
文字列の前後にある余分なスペースを取り除いてくれます。文字列の中間にあるスペースは取り除かれません。コピー&貼り付けで紛れ込んだ見えないスペースが原因の不一致を防ぐのに役立ちます。
Q. 数値を文字列に変換するにはどうすればいいですか?
CStr関数を使います。CStr(100)とすると、数値の100が文字列の”100″に変換されます。逆に文字列を数値に変換したい場合はCLng(整数)やCDbl(小数を含む数値)を使います。
Q. ElseIfとElseの違いを教えてください。
ElseIfは「最初の条件に合わなかった場合に、別の条件を確認する」ときに使います。Elseは「どの条件にも当てはまらなかった場合」の処理を書きます。条件が複数ある場合はElseIfを重ねて使い、最後にElseで「それ以外」の処理を用意するのが基本の形です。
If文を含む、実務で安定して動くVBAの書き方を体系的に学びたい方は、JIMOVEの動画講座をご覧ください。
「なぜ条件が一致しないのか」の確認方法まで丁寧に解説しています。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



