みなさん、こんにちはケンケンです。
さあ、VBA入門編も5回目を迎えることとなりました。
みなさん、こんにちはケンケンです。 前回は、ForNext構文を使った例をお見せしました。 請求書作成自動化への道が一歩一歩切り開かれていますよ。もう少しで完結しますからがんば[…]
今回は、IF Then構文を勉強していきます。
この構文は、プログラミングの醍醐味のひとつである条件分岐を表現できます。
ForNext構文と組み合わせることによって強力な武器となり請求書を自動作成するための最終段階になりますのでがんばって勉強していきましょう。
それではさっそく解説していきます。
If Then構文を使ってみよう

みなさん、IF関数は覚えていますか。
VBAで使うIFは、関数のときとは多少異なっていまして、直接関数を使うというよりは、構文としてコードを書いて条件を分岐させていきます。
とはいえ、関数とやっている処理は基本同じなので、構造を理解して進めば問題ありません。
まず、構文の構造をご紹介します。

上記のようになります。Elseは省略することが出来ます。
構造だけ見てもピンと来ないかもしれませんので、IF関数をご紹介した際に使った例をもとに具体的に見ていきましょう。

関数を勉強した時に上の表を使いました。
今回は、この表のD列に合否を付け加えていきましょう。
それでは、条件を付していきます。条件は60点以上で合格、未満で不合格としましょう。
これを構文の構造にあてはめてみます。

このようになりますね。
ここまでできたら、VBAのコードに落とし込みます。
まずは、データの最初の行である2行目の判定をします
1 2 3 4 5 6 7 |
Sub if_rensyu() If Range("C2").Value >= 60 Then '得点(C列)が60点以上の場合 Range("D2").Value = "合格" 'D列に合格と表示する Else Range("D2").Value = "不合格" 'D列に不合格と表示する End If End Sub |
上記のようになりました。
コメントにも残しておくと後で見返したときに便利です。
では、このコードをF5で実行してみてください。

上記のようになればOKです。
さあ、2行目で処理ができましたので、これを11行目まで繰り返していきましょう。
繰り返し処理をするときは、ForNext構文を使うのでしたね。
変数を宣言して、構文を使ってみましょう。

変数名は「gouhi」としました。
変数gouhiは2行目から11行目まで繰り返したいので「2 to 11」としています。
ForからNextまでは一気に書き切ってください。それから、



上記のように、2行目の処理をForとNextの間に入れ込んでください。
この状態まできたら繰り返していきます。繰り返す対象は「行」ですから、コードの行に対応する箇所を変数に置き換えます。

これで完成です。実行してみましょう。

D列で繰り返し処理されていれば成功です。
いかがでしたか、IfThen構文とForNext構文を組み合わせた例をお見せしました。
■論理演算子を使ってみよう
続いて論理演算子を用いた条件分岐です。
難しい単語が出てきましたが、これはandやorなどのことで、複数の条件を設定することができます。
とっつきにくいので簡単に日本語へ変換してみます。
and=「条件全部が正しかったらOK!ひとつでも間違ったらNG!」
or=「ひとつでも正しかったらOK!全部ダメだったらNG!」
ということです。
andは論理積、orは論理和と呼ばれますが、覚えていてもコードを書けるようになるわけではないので細かい解説は省きます。興味のある方は詳しく調べてください。
■andで条件を指定してみよう
それでは、andから具体的に解説していきます。
先ほどの表を使っていきます。

B列が「女」でD列が「合格」だった場合に、E列に「2次面接」と表示されるようにしましょう。
andで条件を指定します。ちなみに、条件に該当しなかった場合は、「不採用」とします。
では、ひとつずつコードを書いていきます。
まずは、プロシージャを作ってとりあえず動くコードを書いてみます。

E2セルに2次面接という文字列が入るコードを書いてみました。
実行してE2セルに文字列が入ることを確認してください。
次にIf文を書いていきます。

B2セルが「女」であること→Range(“B2”).Value = “女”
D2セルが「合格」であること→Range(“D2”).Value = “合格”
上記2つの条件をandで結びます。
そして、IfからEndIfまで一気に書いてください。
あとは、先ほどのコードをIf文の中に入れて下さい。



ここまで書けたら実行してみましょう。

E2セルに「不採用」と入力されれば成功です。
D列の条件があてはまらないから「不採用」となりますね。
andはすべての条件が満たされなければならないのでElse以下が実行されます。
続いて、これを11行目まで繰り返してみます。
コードを書く手順は、
- 変数を宣言する
- ForNext構文を書き切る
- IfからEndIfまでをForとNextの間に入れる
- 該当箇所を変数に置き換える
ですね。
以下が完成したコードです。
1 2 3 4 5 6 7 8 9 10 |
Sub and_rensyu() Dim mensetu For mensetu = 2 To 11 If Range("B" & mensetu).Value = "女" And Range("D" & mensetu).Value = "合格" Then Range("E" & mensetu).Value = "2次面接" Else Range("E" & mensetu).Value = "不採用" End If Next End Sub |
このコードを実行すると

以上のようになっていれば成功です。
ちなみに、4行目はB列の条件を満たしていないので不採用となってますね。

■orで条件を指定してみよう
続いては、orを使った条件分岐を解説していきます。
orは、ひとつでも正しかったらOK!全部ダメだったらNG! でしたね。
先ほどandで使ったコードをorに変更してF列に結果を表示してみましょう。

この状態で実行するとどうなるでしょうか。

上記のようになります。
B列が「女」でもなくD列が「合格」でもない全部NGなのは7行目だけなので、そこだけ「不採用」になりました。
いかがでしたか。
これで条件分岐を一通り勉強できました。
次項からは、条件分岐を使って実務で使える方法をご紹介します。
文字列を比較してみよう

ここからは、条件分岐を使っての文字列の比較をやってみましょう。
具体的には、前回並べ替えに使った資料を使います。

何をするかというと、B列の請求先で、会社名が変わった行数を取得していきます。
例えば、株式会社AAAとBBBの境目は5行目、BBBとCCCの境目は8行目ですね。
この境目となる行数をIF文を使って取得していきます。
それでは、解説します。
1 2 3 4 5 |
Sub if_rensyu2() If Range("B2").Value <> Range("B3") Then Range("I2") = Range("B2").Row End If End Sub |
まず、上記のようにコードを入力してください。
コードの解説をすると、B2の値とB3の値が違ったらそれ以降のコードを実行してB2の行数をI2へ入力する。
というものです。
これを実行するとB2とB3は同じ値なので、この条件は満たされずプロシージャが終了します。
仮にB3の値を株式会社AAA以外にすると、条件が満たされてI2に「2」と表示されます。
それでは、先ほどのコードを16行目まで繰り返してみましょう。
ForNext構文で以下のようにコードを書いてください。

書けたらこのコードを実行してください。
すると、

いかがですか。
請求先名が変わる境目の行に行数を転記することができました。
このテクニックは実務では重要なもので、今後も大いに役立ちます。
よく復習しておいてください。
今回お伝えすることは以上ですが、ひとつおまけのテクニックを紹介します。
おまけとはいえ、これも実務ですごく役立つテクニックなので合わせて覚えておいてください。
具体的には、先ほどの行数書き出しでI列に空白なしで転記する方法です。
先ほどの方法だと境目の行数以外は空白となってしまいます。
これでは、データとして不十分です。そこで空白がないように詰めて転記する方法をご紹介します。
今回、なぜI列に空白ができてしまったか、というとI列に転記するコード「Range(“I” & gyosu)」の変数gyosuが、ForNextで回す変数と同じくカウントされているからです。
それを回避する為には、gyosuとは違う変数を宣言し、gyosuとは別にカウントしていく必要があります。
具体的には、
以下のようにコードを変更します。

saisyoという変数を作りました。
そして、初期値として「2」を入れています。意味はI列の転記先の最初が2行目だからです。
I列へ転記するコードを「Range(“I” & gyosu) 」から 「Range(“I” & saisyo)」することによって
最初の転記先I列2行目にまず転記されます。
そして、次の行で変数saisyoの数値を+1することで、次の転記先が2行目から3行目になる、ということです。
コードを実行する際にステップイン「F8」で実行すると、変数の動きも分かり易く理解できるかと思います。
ご自身で確かめながら実行してください。
結果はこうなります。

まとめ
今回は、ここまでです。
If構文を使うとVBAの幅がグッと広がり、繰り返し構文と組み合わせられると、大きな武器になります。
If構文とForNext構文は何回も復習しておいてください。
考え方も重要ですが、コードを書く手順も重要です。
まず、一つ目の処理ができるか、を意識してコードを書いてください。
それが出来れば繰り返したり条件分岐することは比較的簡単です。
勉強し始めのころは、いきなり自動化しようとしてコードがごちゃごちゃしてしまい、結局できないということが多いので手順も合わせて復習しておいてください。
いよいよ次回は今回まで学んだ知識を使って、請求書作成を自動化しますのでお楽しみに。
それでは、また次回お会いしましょう。
みなさん、こんにちはケンケンです。 今回はVBA入門編の6回目となります。突然ですが、本編を進める前にこの記事にたどり着いてくれた方へプレゼントです。以下でForNext構文の書き方を動画(音声なし)でご紹介しているので[…]
今回記述したコードは以下
1 2 3 4 5 6 7 8 9 10 |
Sub if_rensyu() Dim gouhi For gouhi = 2 To 11 If Range("C" & gouhi).Value >= 60 Then '得点(C列)が60点以上の場合 Range("D" & gouhi).Value = "合格" 'D列に合格と表示する Else Range("D" & gouhi).Value = "不合格" 'D列に不合格と表示する End If Next End Sub |
1 2 3 4 5 6 7 8 9 10 |
Sub and_rensyu() Dim mensetu For mensetu = 2 To 11 If Range("B" & mensetu).Value = "女" And Range("D" & mensetu).Value = "合格" Then Range("E" & mensetu).Value = "2次面接" Else Range("E" & mensetu).Value = "不採用" End If Next End Sub |
1 2 3 4 5 6 7 8 9 10 |
Sub or_rensyu() Dim mensetu For mensetu = 2 To 11 If Range("B" & mensetu).Value = "女" Or Range("D" & mensetu).Value = "合格" Then Range("F" & mensetu).Value = "2次面接" Else Range("F" & mensetu).Value = "不採用" End If Next End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub if_rensyu2() Dim gyosu Dim saisyo saisyo = 2 For gyosu = 2 To 16 If Range("B" & gyosu).Value <> Range("B" & gyosu + 1).Value Then Range("I" & saisyo) = Range("B" & gyosu).Row saisyo = saisyo + 1 End If Next End Sub |
エクセルVBA入門編~請求書作成自動化への道~記事一覧
【エクセルVBA入門編①】VBAで何ができるのだろうか?【請求書自動作成の第一歩】
【エクセルVBA入門編②】めんどうな仕事はForNext構文で解決【請求書自動化の最重要構文】
【エクセルVBA入門編③】繰り返し作業はFor Next構文で完全自動化!【請求書作成自動化は目前!】
【エクセルVBA入門編④】自動記録を使い方とコード編集法を解説【請求書作成自動化への道】
【エクセルVBA入門編⑤】If Then構文で条件分岐をマスター【請求書自動化の最終ステップ】
【エクセルVBA入門編⑥】手順に沿って請求書を作成してみよう【請求書作成自動化最終章】