【Excel VBA】If Elseとは違う条件式(Select Case)について
エンジニアのIMMRです。Excel VBAの条件式には、以前に説明したExcel VBA 条件式(If Else)とこれから説明するSelect Caseの二つあります。1.従来のIf Else条件式If Elseは条件に合った時は処理Aを、条件に合わなかったら処理Bを実行します。では、下記のようなデータがあり、複数の条件があるとします。If Elseを使用して作成すると2種類の方法が浮かぶと思
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
皆さんこんにちは、エンジニアのIMMRです。
VBAのプログラムって、普通のプログラムのように全て値等のデータをセットして、それから
プログラムを実行して、出力を得る。というものだけでないんです。
「セルの値を変更」したり、「新しいシートを作成」したり、「右クリック」をしたり、と一定の動作を実施したことで
プログラムを実行させることができるんです。
それが「イベントプロシージャー」です。その方法について説明します。
先ほども説明しましたが、「イベントプロシージャー」は、さまざまな動作において起こるイベントです。
ここでは、その中の1つである「セル内の値が変更された時点」でプログラムが動作する方法を説明します。
サンプルのブックとしては、下記を使用して、
B列に値が入るごとにC列に結果を表示させるようにします。
80点以上なら・・・青文字で”合格”と表示
それ以外格なら・・・赤文字で”不合格”と表示
することにします。
図1 サンプルブック
イベントプロシージャーは、普通のプログラムを作成する時とは、違う方法で行います。
その方法をまず、説明します。
①「Visual Basic」をクリックします。
図2 設定方法1
↓
②「ThisWorkbook」をダブルクリックします。 ※モジュールを作成するわけではありません。
図3 設定方法2
↓
③赤枠部分のv(矢印)部分をクリックします。
図4 設定方法3
↓
④「Workbook」をクリックします。
図5 設定方法4
↓
⑤赤枠部分のv(矢印)部分をクリックします。
図6 設定方法5
↓
⑥イベントで動作するためのリストが出てきます。ここで内容を選択します。
図7 設定方法6
↓
⑦今回は「SheetChange」を選択します。
図8 設定方法7
↓
⑧赤枠のところが、セルの値が変化した度に実行されるところです。
図9 設定方法8
赤枠のところに今回の処理を行うためのプログラムを記載していきます。
先ほどの手順でイベントプロシージャーを作成すると
「Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)」
が作成されます。
そして、「Sh」や「Target」を使ってどこのセルが変更されたかを確認することができます。
例えば、
シート名を確認したい場合 Sh.Name ※シート「テスト」で実施した場合、「テスト」が格納されます
変更したセルのアドレス Target.Address ※セル(B4)で実施した場合「$B$4」が格納されます。
変更したセルの行 Target.Row ※セル(B4)で実施した場合「4」が格納されます。
変更したセルの列 Target.Column ※セル(B4)で実施した場合「2」が格納されます。
以上のことより下記のサンプルプログラムを作成しました。
サンプルプログラム
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Cells(Target.Row, 2) > 80 Then
Cells(Target.Row, 3) = "合格"
Cells(Target.Row, 3).Font.Color = RGB(0, 0, 255)
Else
Cells(Target.Row, 3) = "不合格"
Cells(Target.Row, 3).Font.Color = RGB(255, 0, 0)
End If
End Sub
これは、値が設定された(セル)の左から2つ目の列(B列)の値が
80より大きい場合「合格」という文字を3つ目の列(C列)にセットしてフォントの色を青にする。
それ以外(80以下)の場合「不合格」という文字を3つ目の列(C列)にセットしてフォントの色を赤にする。
といったプログラムです。
では、プログラムを実行していきます。
実行とは言っても、いままでのようにプログラム自信を実行させるのではなく、
イベントの内容に沿った作業を実行します。(ここでは、セルの値変更)
図10のようにセル(B4)に「90」という値を入力します。
そして、Enterキーを押して決定します。
図10 プログラム実行前1
↓
すると、プログラムを実行してないのにも関わらず、
図11のようにセル(C4)に青文字で”合格”と表示されます。
図11 プログラム実行後1
続いて、図12のようにセル(B5)に「70」という数値を入力して、
同じようにEnterキーを押して決定します。
図12 プログラム実行前2
↓
すると、同様に自動で図13のようにセル(C5)に赤文字で”不合格”と表示されます。
図13 プログラム実行後2
これで予定どおり、数値を入力してメッセージを表示することができました。
・80点以上なら・・・青文字で”合格”と表示
・それ以外格なら・・・赤文字で”不合格”と表示
で問題なく、出来ているように見えます。
しかし、いくつか不具合な点(バグ)が含まれているのです。
その1つを説明します。
不具合な点の1つがセルの範囲です。
例えば、図14のように
全く関係のない場所(セルのF6)に値を入れて同じようにEnterキーを押して決定します。
図14 プログラム実行前3
↓
図15のようにC列の箇所に”不合格”をいう文字が表示されてしまいました。
図15 プログラム実行後3
これは、セル(F6)に値を入力した時点で
セルの値を変更したのでプログラムが動いてしまい、
何も入力していないセル(B6)の値をみて、ブランク(値が何もない)すなわち、80以下と
判断して、”不合格”という文字が表示されてしまったからです。
今回の場合、B列のセルに値を入力された場合のみ、プログラムを実行するという条件を追加する必要があります。
以下のサンプルプログラム2のように
B列の場合のみ、プログラムを実行するという設定が必要になります。
考え方はIF文を使って、値が変更された左から2つ目のセルだけを対象にします。
これにより、どのセルの値変更を行ってもプログラムは動作するが
左から2つ目、つまりB列でなければ以降の作業は行われなくなります。
サンプルプログラム2
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If (Target.Column = 2) Then ・・・追加箇所
If Cells(Target.Row, 2) > 80 Then
Cells(Target.Row, 3) = "合格"
Cells(Target.Row, 3).Font.Color = RGB(0, 0, 255)
Else
Cells(Target.Row, 3) = "不合格"
Cells(Target.Row, 3).Font.Color = RGB(255, 0, 0)
End If
End If ・・・追加箇所
End Sub
先ほどと同様に関係のないセルに値を入れて行ってみます。
セル(F6)に値を入力して、
同じようにEnterキーを押して決定します。
図16 プログラム実行前4
↓
図17を確認すると今度は、B列以外のセルに値を入力してもC列にメッセージは表示されません。
無事に不具合部分を改修することができました。
図17 プログラム実行後4
このようにして、不具合部分の修正は完了です。
まだ、上記プログラムには修正しないといけない部分(バグ)がありますが
今回の説明はこれで終了とさせていただきます。
セル内の値が変更された時点で、プログラムを実行することが出来ました。
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート