みなさんこんにちは。
ITソリューション事業部の林です。
ExcelVBA学習初級編、今回で4回目となります。
そして、今回をもちまして初級編はひとまず終了となります。
第4回は、「繰り返し処理」と並んでプログラミングの中で重要な要素とされている、「条件分岐」をメインに解説いたします。
繰り返し処理について復習したい方は、以下のリンクからどうぞ。
初級編第3回
■学習トピック■
「条件分岐」は、前回の「繰り返し処理」に続き、初心者には理解の難しい概念です。
しかし、少しずつ紐解いていけば、そう難しいものでもありませんので、心配無用です。
それでは、始めていきましょう!
【条件分岐とは】
条件分岐とは、「実行させる処理を特定の条件によって分岐させること」です。
例として、資格試験の合格判定で考えてみましょう。
満点が1000点の資格試験に、「点数が800点以上であれば合格と判定、800点未満なら不合格と判定」という合格基準があるとします。
この基準をプログラムにおこすと、「点数が800点以上」「点数が800点未満」が条件部分で、「合格判定」「不合格判定」が処理部分です。
条件分岐は、取り扱うデータによって実行結果が変化するので、柔軟性のあるプログラム作りには欠かせません。
【条件分岐の構文】
VBAの条件分岐で特に使用頻度の高いものが、「Ifステートメント」です。
Ifステートメントの構文(真偽判定の書き方)
If 条件式 Then
条件式を満たす場合(True)の処理
Else
条件式を満たさない場合(False)の処理
End If
Ifステートメントは条件に対する「真偽判定」を行います。
条件を満たす場合に「真」、それ以外なら「偽」と判定します。
プログラミングの世界では真を「True」、偽を「False」と呼びますので、本記事でもそれにならいます。
【Ifステートメントを用いたプロシージャ作成】
先ほど例として取り上げた「合格判定」を行うプロシージャをここでは作成します。
まず、Excelシートを以下の状態にしてください。
VBAのエディタを開き、標準モジュールを追加し、プロシージャを作成してください。
点数を記憶するための変数を定義し、B2セルの値を変数に代入する処理を書きます。
次に、以下の通りにIfステートメントを記述します。
C2セルに「合格」を入力する処理は、以下の箇所に記述します。(If ~ Thenの次の行)
「不合格」を入力する処理は、以下の箇所です。(Elseの次の行)
Sub ExcelVBA004() Dim Point As Long Point = Cells(2, 2).Value If Point >= 800 Then Cells(2, 3).Value = "合格" Else Cells(2, 3).Value = "不合格" End If End Sub
プロシージャを実行すると、以下のようにC列が更新されます。
作成したプロシージャについて解説します。
作成したIfステートメントは、条件式として「B2セルの値(Valueプロパティ)が800以上」を指定しています。
「>=」は、比較演算子と呼ばれるものです。
左辺と右辺を比較するためのもので、これを用いることで真偽判定が行えます。
「>=」は左辺の値が右辺の値以上である場合にTrueと判定し、それ以外ならFalseとみなします。
他にも比較演算子はありますが、ここでは値同士の比較に用いるものをピックアップします。
「=」 ・・・左辺の値と右辺の値が一致する場合True
「<>」・・・左辺の値と右辺の値が一致しない場合True
「>」 ・・・左辺の値が右辺の値より大きい場合True
「<」 ・・・左辺の値が右辺の値より小さい場合True
「>=」・・・左辺の値が右辺の値以上である場合True
「<=」・・・左辺の値が右辺の値以下である場合True
「If ~ Then」の次の行には条件がTrueである場合の処理を書きます。ここではC2セルに「合格」の文字を入力する処理を書いています。
「Else」の次の行は条件がFalseの場合の処理を書く箇所です。C2セルに「不合格」を入力します。
条件分岐を用いると、2種類の処理を書いていても、TrueもしくはFalseの処理しか行いません。
ExcelシートのB2セルの値を変更してプロシージャを実行すると、C2セルの結果は変化します。
大きい数字や小さい数字を入力して、処理結果を確認してみてください。
(B2セルを800点未満にするとC2セルに「不合格」が入力される)
【繰り返し処理と条件分岐を組み合わせた構文】
前回の記事で解説した「繰り返し処理」と、「条件分岐」は組み合わせて使用できます。
ForとIfステートメントを組み合わせた書き方
For カウンタ = 開始値 To 終了値
If 条件式 Then
条件式を満たす場合(True)の処理
Else
条件式を満たさない場合(False)の処理
End If
Next
Forステートメントの内側にIfステートメントを書いています。このような書き方のことを「入れ子にする」と言います。
Ifステートメントの内側にさらにIfステートメントを書けますし、Forステートメント同士でも同じことができます。
【ForとIfを組み合わせたプロシージャ作成】
まず、Excelシートを以下の状態にしてください。
B列にはゼロから1000までの数字をなにか入力しておきます。
ここから、先ほど作成した条件分岐のプロシージャに追記していきます。
以下の赤枠の位置に、繰り返し処理で使用するカウンタ用変数を定義します。
続いて、以下の赤枠の位置に、繰り返し処理のForステートメントを記述します。
Excelシートの2行目から11行目まで点数が入っているので、カウンタの開始値は2、終了値は11にします。
Forステートメント(Forの行からNextの行)の内側にあるソースコードにはインデントをつけます。
やり方は、複数行を選択した状態でTabキーを押すだけです。
Cellsで参照する行番号は変数Idxに変更します。
判定結果をわかりやすくするため、以下の赤枠の位置に、セルの背景色を変化する処理を追加します。
Sub ExcelVBA004() Dim Point As Long Dim Idx As Long For Idx = 2 To 11 Point = Cells(Idx, 2).Value If Point >= 800 Then Cells(Idx, 3).Value = "合格" Cells(Idx, 3).Interior.ColorIndex = 23 Else Cells(Idx, 3).Value = "不合格" Cells(Idx, 3).Interior.ColorIndex = 3 End If Next End Sub
これで追記は終わりです。
プロシージャを実行し、Excelシートが以下のように変化しているか確認してください。
作成したプロシージャの解説をします。
このプロシージャでは、ForとIfのステートメントを入れ子にして、C列の各セルの状態を変化させています。
セルの参照にはCellsを使用し、行番号にはカウンタ用変数を指定します。
こうすることで、条件判定する対象セルを繰り返しのたびに変化させられます。
セルの背景色を変化させるために、初出の「Interior.ColorIndex」プロパティを使用しました。
これはセルのプロパティの一種で、ここに数値をセットすることでセルの背景色を変えられます。
背景色は他にも設定できますが、ここでは青(23)と赤(3)を指定しました。
背景を青くする場合・・・Cells(○,○).Interior.ColorIndex = 23
背景を赤くする場合・・・Cells(○,○).Interior.ColorIndex = 3
ここでもB列の値をいろいろ変えてみて、実行結果が変化することを確認してみてください。
【プロシージャの動きをトレースする】
今回のようなステートメント同士を入れ子にしたプログラムは、どのような順序で処理が行われるか一目でわかりにくいものです。
そんなときに便利なのが、「ステップ実行」機能です。
ステップ実行は、エディタ画面でF8キーを押すと始まります。
F8キーを何度か押していくと、黄色い表示が上から下へと進んでいきます。
この黄色く表示される順に、処理は実行されていきます。
プロシージャの処理の順序を確認したいときにステップ実行機能は便利に使えますので、上手く活用してください。
ステップ実行中はプロシージャが中断状態になっています。その状態だと、エディタに"[中断]"が表示されます
プロシージャの末尾(End Sub)まで到達したところでF8きーを押すと、ステップ実行は終了し、中断状態は解除されます。
エディタのリセットボタンクリックでも、中断状態は解除できます。ステップ実行を途中で終わらせたい場合に使ってみましょう。
【終わりに】
以上が「条件分岐」についての初級レベルの解説になります。
前回の「繰り返し処理」と、今回の「条件分岐」はプログラム開発において重要な要素となりますので、身につくまで復習することをおすすめします。
冒頭に書いた通り、今回でVBA学習初級編はひとまず終了です。
ExcelVBAで自由自在にマクロを作るまでは、まだ覚えるべきことがありますが、主要な要素は解説してきました。
「オブジェクト操作」「繰り返し処理」「条件分岐」がそれです。
初級レベルからスタートするなら、まずこれらを理解しておけば今後の学習をスムーズに進められるはずです。
次回以降は、レベル関係なく共通して使えるVBAの技術記事を掲載していきます。
構築・運用現場やオフィス業務におけるVBA活用事例など、コラム的な記事も掲載する予定です。
それでは、また次回お会いしましょう!