VBA入門
第20回.条件分岐(IF)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2020-09-26

第20回.条件分岐(IF)


マクロ VBA Ifステートメント

ある条件の時だけ処理したい、ある条件の時は処理したくない、そのような条件によって処理内容を変更したい場合があります。
VBAで条件により処理を分岐させたい場合に使うのが、Ifステートメントです。


マクロVBAで自動化する場合の多くは、条件により処理を変えつつ一定回数繰り返すという事です。
プログラムにおいて、最も重要なステートメントのひとつがIfステートメントと言えます。

Ifステートメントの構文

If 条件式 Then 真の処理 [Else 偽の処理]

または

If 条件式 Then
  真の処理 ・・・ 条件式を満たした場合の処理
[Else
  偽の処理] ・・・ 条件式を満たさない場合の処理
End If

[ ]は省略可能です。

真とは、条件式を満たした場合、
偽とは、条件式を満たさない場合

条件式に書かれている条件を判定し、
条件を満たしている(合致している)場合は真の処理、それ以外の(条件式を満たさない)場合は偽の処理を実行します。

真の処理、偽の処理には、複数の処理(ステートメント等)を記述することができます。

IFステートメントの条件式

Ifで判定する条件を、
真(True)か偽(False)を評価する数式または文字列式で指定します。

数式とは、数値と比較演算子・論理演算子の組み合わせ、
文字列式とは、文字列と比較演算子・論理演算子の組み合わせです。

比較演算子

比較演算子 意味
= 等しい
<> 等しくない
> より大きい
>= 以上
< より小さい
<= 以下

論理演算子

論理演算子 意味 条件例 結果
And 論理積 True And True TRUE
True And False FALSE
False And True FALSE
False And False FALSE
Or 論理和 True Or True TRUE
True Or False TRUE
False Or True TRUE
False Or False FALSE
Xor 排他論理和 True Xor True FALSE
True Xor False TRUE
False Xor True TRUE
False Xor False FALSE
Not 論理否定 Not True FALSE
Not False TRUE
Eqv 論理等価
Imp 論理包含

And、Or、Not以外の論理演算子は当分は使用する必要はないでしょう。
特にマクロVBAを他人と共有する場合は、自分が分かるからといってむやみに難しいものを使うことは避けるべきです。

Is演算子

2つのオブジェクト参照変数を比較するために使用されます。
If オブジェクト1 Is オブジェクト2 Then
オブジェクト1とオブジェクト2の両方が同じオブジェクトを参照する場合はTrueになります。
※Is演算子については、第52回.オブジェクト変数とSetステートメントで説明します。
変数のデータ型の説明において、Object…オブジェクト型 というのがあった事を覚えているでしょうか。数値や文字ではなく、オブジェクトを入れる変数がオブジェクト変数です。オブジェクトと言っても、いろいろなものがあります。

オブジェクト変数については、今後の学習で少しずつ覚えていけば良いです。

Ifステートメントの使用例文

IFステートメントの例文1

If Cells(1, 1) >= 100 Then Cells(1, 2) = "○"


※.Valueは省略しています。
A1セルが100以上の場合、B1セルに"○"

IFステートメントの例文2

If Cells(1, 1) >= 100 Then
  Cells(1, 2) = "○"
End If


例文1.と同じです。
特に事情(1行で書く事でプログラムの可読性を高めたい等の場合)が無い限り、こちらを使いましよう。

IFステートメントの例文3

If Cells(1, 1) >= 100 Then
  Cells(1, 2) = "○"
Else
  Cells(1, 2) = "×"
End If


A1セルが100以上の場合、B1セルに"○"
A1セルが100未満の場合、B1セルに"×"

IFステートメントの例文4

If Cells(1, 1) >= 100 Then Cells(1, 2) = "○" Else Cells(1, 2) = "×"


これは、例文3.と同じですが、この使い方はしない方がよいです、
プログラムが見づらくなり、また、ブレークポイントの設定が出来ない等デバッグがしづらくなります。

Ifステートメントのネスト(入れ子)

Ifステートメントをネスト(入れ子、Ifの中にIfを入れる)することで、より複雑な条件分岐が可能です。

If Cells(1, 1) >= 100 Then
  If Cells(1, 1) >= 200 Then
    Cells(1, 2) = "A"  '>= 200
  Else
    Cells(1, 2) = "B"  '>=100 AND < 200
  End If
Else
  If Cells(1, 1) >= 50 Then
    Cells(1, 2) = "C"  '< 100 AND >= 50
  Else
    Cells(1, 2) = "D"  '< 50
  End If
End If


A1セルが
>= 200の場合、B1セルに"A"
>=100 AND < 200の場合、B1セルに"B"
< 100 AND >= 50の場合、B1セルに"C"
< 50の場合、B1セルに"D"

ネストのレベルに特に制限はありませんが、概ね3段階までにしましょう。
それ以上になる場合は、条件式を工夫してみましょう。

ほとんどの場合、より単純な条件式に集約する事が可能です。

サイト内のIfステートメント参考ページ

素直なプログラミング
プログラムを作る場合、「可読性」「保守性」等々に気を配る必要がありますが、まずは、素直なコードを書くことでしょう。テクニックに走ったりせず、頭に浮かんだ事をそのままコーディングしていく事も重要です。頭に浮かんだ事が、今の自分のスキルレベルなのですが、スキルが上がれば、頭に浮かぶ事も、少しずつ変化してきます。
IF文の整理と論理的思考
論理的思考でIf文を整理することについて、簡単な例で解説していきます。無駄な条件が入っていたり、条件が重複しているプログラム程理解しずらい物はありません。問題です。以下のマクロについて、気が付いたことを指摘して下さい。
条件式のいろいろな書き方
If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、VBAを習い始めは、比較演算子で比較した結果が 正しければTrue、間違っていればFalse という事で理解するはずです。しかし、いろいろなサンプルコードを見ていると、「あれっ」比較演算子が無い… というようなIfステートメントやSelectCaseに出くわします。
実は奥が深いIfステートメント
プログラムと言うものは、条件により処理を分ける。これにつきます。つまり、この条件が一番問題となります。そして、その記述をするものが、Ifステートメントになります。IFステートメントの基本 まずはIFステートメントの基本を確認しましょう。
ForとIfのネストこそがVBAの要点
VBA習得で最も肝心なものは、For文とIf文を確実に習得することです。For文とIf文の基本をしっかりと覚え、そして、For文とIf文をネストさせるプログラミング技術を習得してください。For~Nextステートメントは、繰り返し処理 If~EndIfステートメントは、条件分岐 つまり、条件により分岐しつつ繰り返し処理を行う。
セルの値で計算を変える(Ifステートメント)
エクセルでは、他の列の値によって計算式を変えたりすることが多々あります。つまり、条件により処理を分けるということです。ワークシートではIF関数を使いますが、マクロVBAでも、IfはIfと書くのですが、その後の書き方が違ってきます。
IFステートメントの判定(ツイッターお題)
ツイッターでIfステートメントの書き方が話題になっていたのを見て、結構いろいろな要素があるということで、ちょっと意地悪な問題にしてみました。お題のツイート https://twitter.com/yamaoka_ss/status/1271402726174277632 VBA問題 さて、いくつが表示されるでしょうか? Dimi If"true…

最後に

Ifステートメントがサクッと書けるかどうかでVBAスキルのレベルを判断できると言っても良いでしょう。
IFの文法を理解しても、なかなかサクッとは書けないものです。

ここは、じっくりと習得していってください。
その後も、マクロVBAを書いていく上では常にIfの書き方は意識しながら書いてみてください。



同じテーマ「マクロVBA入門」の記事

第17回.繰り返し処理(Do Loop)
第18回.最終行の取得(End,Rows.Count)
第19回.総合練習問題1
第20回.条件分岐(IF)
第21回.条件分岐(ElseIf)
第22回.条件分岐(Select Case)
第23回.メッセージボックス(MsgBox関数)
第24回.インプットボックス(InputBox関数)
第25回.名前付き引数について
第26回.総合練習問題2
第27回.ブック・シートの選択(Select,Activate)


新着記事NEW ・・・新着記事一覧を見る

フォルダとファイルの一覧を取得(os,glob,pathlib)|Python入門(9月26日)
import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ