なぜIfの条件が思い通りに動かないのか?

If文の書き方は覚えた。でも、思った通りに分岐してくれない。
「条件に合っているはずなのに、なぜか別の処理が動く」——そんな経験はありませんか?

If文の条件が思い通りに動かない理由は、「見た目は同じでも、実際は違うデータ」を比較していることが多いからです。数値と文字列の違い、余分なスペース、大文字小文字——これらが条件分岐を狂わせる原因になります。

この記事では、次のことを解説します。

  • If文が思い通りに動かない代表的な3つの原因
  • なぜ「同じに見える値」が一致しないのか
  • 条件分岐を確実に動かすための確認方法

なぜIfの条件が思い通りに動かないのか——3つの原因

① 見た目は空白なのに、条件が一致しない

空白に見えるセルを判定するとき、こう書くことがあります。

If Cells(i, 1).Value = "" Then

これは多くの場合うまく動きますが、セルに数式が入っているとき、話が変わります。

たとえば=IF(A1="","",A1)という数式が入っていて、A1が空のとき。セルには何も表示されません。見た目は空白と区別がつきません。

でも、= ""とIsEmptyでは結果が違います。

セルの状態見た目= “”IsEmpty
何も入っていない空白TrueTrue
数式が””を返している空白(に見える)TrueFalse

数式が入っているセルは、値が””でも「何かが入っているセル」として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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール