If~Thenもし~だったらのIF関数をVBAにする方法
エクセルのワークシートのセルに直接IF関数の数式を書きたくないと思って、IF関数の代わりにVBAコードを使ってできないものかと調べたらここにたどり着いたのすよね。
VBAになったからと言って難しい事はなく、考え方もVBAコードの書き方もIF関数を使うのと同じなので安心して下さい。
作業効率化のためにVBAをエクセルで取り組んでいくと、頻繁に使うようになるので絶対にマスターしなくてはいけませんよ。
条件によって処理を振り分けるIFステートメント
IF関数をVBAでやるのにIFステートメントなんて言われると、引いてしまうかもしれませんが、繰り返しになりますが基本的にIF関数と同じように考えいいので全く難しくありません。
それでは実際にIF関数をVBAに代えて実践してみましょう。
1つの条件を満たした時に処理を実行する
If~Thenステートメントを使う事により1つの条件を満たした時だけ処理を実行することができます。
IF関数と同じで「もし~だったら」と置き換えればとても分かりやすいと思います。
例えば、上の図のように(セルH23)に順位(セルA23)が20位よりも下位の場合は降格と表示するようにIF関数を使って表しています。
=IF(A23>20,”降格”,””)
もしセルA23の値が20よりも大きかったら「降格」と表示、そうでなかったら空白という意味になるのは問題ないと思います。
では、ユーザーフォームに配置したコマンドボタン1に、IF関数で書いた同じ内容をVBAで代用するとこのようになります。
Private Sub CommandButton1_Click()
If Range(“A23”).Value > 20 Then
Range(“H23”).Value = “降格”
End If
End Sub
- コマンドボタン1がクリックされたら
- もしセルA23の値が20よりも大きかったら
- セルH23の値を「降格」と書き込む
- IFステートメント終了
- マクロ記録終了
これでIF関数の内容をVBAで代用することができました。
IF関数で使用していた、「そうでなかったら空欄」という部分が記載されていないのは、条件に合わなかったら何も処理をしないという内容を含んでいる為です。
では次に「そうではなかった時」にも処理を付け加えてみましょう。
1つの条件を満たした時とそうではなかった時に処理を振り分ける
今度はセルA21の順位20位以上だった場合は「残留」という書き込みを「セルH21」にVBAコードで付け加えておきましょう。
=IF(A23>20,”降格”,”残留”)
「””」が空欄なので、「”残留”」とするだけなので、この部分をVBAコードで表しましょう。
Private Sub CommandButton1_Click()
If Range(“A21”).Value > 20 Then
Range(“H21”).Value = “降格”
Else
Range(“H21”).Value = “残留”
End If
End Sub
- コマンドボタン1がクリックされたら
- もしセルA21の値が20よりも大きかったら
- セルH21の値を「降格」と書き込む
- そうでなかったら
- セルH21の値を「残留」と書き込む
- IFステートメント終了
- マクロ記録終了
これでIF関数をVBAで代用でき、ほかのVBAコードと組み合わせる事により、エクセルの住所録や顧客データから、差し込み印刷ができるようになり、タックシールを使わずに送り状やお礼状が印刷できるようになるので、作業効率が良く仕事が早くできますよ。
と、ここで紹介したIF関数をVBAで代用する方法は実用的ではありません。
複数の条件で処理を振り分ける(5段階評価など)
そこで、実用的な例としてテストの点数に応じて5段階評価などがありますが、このままIFを使うとエラーになる時があるので、ちょっと工夫が必要になります。
なぜならば、1つの条件に今までのように2つではなく答えが5つもあるからです。
「そうでなかったら」が4回も繰り返されるので、IF関数の場合でもIFが5回もあったら終始気を組むのに頭が混乱しますよね。
ところが、VBAで代用するとちょっと書き順を気をつければ、意外と簡単なんですよ。
この方法をマスターすれば、印刷枚数を入力すると自動的に印刷範囲などを取得して印刷実行することもできるようになりますよ。
IFステートメントを使った実用例
とにかく使用頻度の高いIFステートメントなので、様々な使い方をしていますので、いくつか実用例をご紹介します。
入力漏れ(空欄)があったらメッセージで警告を出す
代表的なものがユーザーフォームに配置したテキストボックスに入力を忘れて、コマンドボタンを押されてしまうと意図しない結果(エラー)になる事を防ぐために、絶対に必要な警告表示のVBAコードを付け足しておく必要があります。
「もしテキストボックス1が空欄だったら、メッセージを表示して作業を止めて元に戻り、入力されていたら処理を続ける」というVBAコードですね。
自分自身が作成したエクセルを使うならば、あまり必要が無いのですがみんなで共有してエクセルファイルを使う時は、想定外の意図しない操作をしますので、とても大事ですよ。
成績表で点数が同点の場合に色を変えて目立たせる
これはユーザーフォームに配置したラベルを活用した方法で、点数が同点の時にワークシートに自動的に書き込む前に、目立つように文字色を変えて知らせてくれるようにしています。
「もし1位と2位が同点だったら、赤文字にラベルの色を変えてメッセージ表示する」
この機能を追加しておくと、うっかり同点を見逃してしまう事が無くなるので便利ですよ。
応用として、「テストの点数が合格ラインを越えていたら、青文字でメッセージ表示して、落第点ならば赤文字メッセージを表示する」なんてこともできますよ。
テスト受験者全員の成績全て順番に調べて合否で文字色変更
先ほどのテストの点数が合格ラインならば青文字で落第点ならば赤文字にIFステートメントを利用してできますが、受験者が1人って事はありません。
学校のクラスの人数が30人としたら、IFステートメントを30回も繰り返してVBAコードを書くことは現実的ではないので、指定回数分繰り返し処理をするFor~NextステートメントとIFステートメントを組み合わせて使うと簡単にできますよ。
同じ内容の連続セルを自動結合する
エクセルの表などで支店名や顧客名簿のあいうえお順などを書いているセルの列ってありませんか?
見やすくするために同じ支店名や名前を結合するのに、わざわざ探して結合するのは面倒ですよね。
そこで支店ごとにセルを結合したり顧客名簿の「あいうえお順」などの見出しを結合などを、コマンドボタン1回押すだけで自動的にエクセルに作業をさせれば、一瞬で仕事が片付きますよ。
条件を付けてメッセージと組み合わせればエラーも防げて、見栄えも良くなり、しかも一瞬で終わるので仕事がはかどりますよ。
ON/OFFや表示/非表示などの切り替えボタンを作る
IFステートメントの特徴を利用してコマンドボタンに「表示中だったら非表示にする、そうでなかったら(非表示ならば)表示する」という事ができます。
例えば、改ページプレビューと標準モードを切り替えたり、スクロールできるエリアを限定したり解除したり、エクセルの操作パネルでもある上部にあるリボンツールバーを操作できないように非表示にしたり、元に戻して表示したりと、ON/OFF機能を持たせたボタンを作る事です。
これもやはり、意図しない操作をされてマクロエラーになるのを防ぐために様々な機能や表示を使えなくする解決法のひとつです。