VBAのIf関数を使いこなしたいけど、イマイチよく分からない…
VBAのifとforの組み合わせを使いこなせるようになりたい…
私がVBAを始めた頃は、IF関数の使い方が分かっておらず、苦労しました。しかし、本を読んだり、実践する中で、IFの使い方を習得してきました。
実際に使えるようになると、これほど使える関数はありません。ただ、理解するまでは大変です。
そこで、企業でエクセルマクロVBAを教えた経験がある私が、事例をベースに、IF関数の使い方を詳しく紹介します。
この記事を読んで、IF関数を理解しつつ、コピペして使い倒してください。
目次
VBAのif関数を使いたい、条件式の使い方|if,else,ifelse,then
Ifの基本形は
1 2 3 4 5 6 7 8 9 |
Sub kihon_kei() If A=B then 処理1 elseif A=C then 処理2 else 処理3 end if End Sub |
コードの解説
2行目:A=Bであるならば
3行目:処理1を実行
4行目:A=Cであるならば
5行目:処理2を実行
6行目:それ以外(A=Bではないし、A=Cでもない)ならば
7行目:処理3を実行
8行目:ifはここまで(if終了のおまじない)
では、事例を交えて、詳しく解説していきます。
事例1(IF else then)|80点以上なら
80以上ならば、合格
それ以外なら、不合格
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei_1() If Range(B2).Value >= 80 Then Range(C2).Value = 合格 Else Range(C2).Value = 不合格 End If If Range(B3).Value >= 80 Then Range(C3).Value = 合格 Else Range(C3).Value = 不合格 End If End Sub |
コードの解説
2行目:もし、セルB2の値が80以上ならば
3行目:セルC2に 合格 を出力
4行目:そうでないなら
5行目:セルC2に 不合格 を出力
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
補足
If Range(“B2”).Value => 80 Then
の => は、「以上」を意味します。比較演算子1つです。
比較演算子には、以下のような種類があります。
[1] =:等しい
[2] <>:等しくない
[3] <:より小さい
[4] <=:以下
[5] >:より大きい
[6] =>:以上
[7] Like:文字列のあいまい検索
[8] Is:オブジェクトの変数
Like, Isに関しては、記事の後半で詳しく説明しています。興味がある方は、ぜひこのまま読み進めていってください。
事例2(IF elseif)|評価Aなら、評価Bなら、評価Cなら
評価Aであれば、緑にする
評価Bであれば、黄にする
評価Cであれば、赤にする
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub if_jirei_2() If Range(B3).Value = 評価A Then Range(B3).Interior.Color = vbGreen ElseIf Range(B3).Value = 評価B Then Range(B3).Interior.Color = vbYellow ElseIf Range(B3).Value = 評価C Then Range(B3).Interior.Color = vbRed End If If Range(B4).Value = 評価A Then Range(B4).Interior.Color = vbGreen ElseIf Range(B4).Value = 評価B Then Range(B4).Interior.Color = vbYellow ElseIf Range(B4).Value = 評価C Then Range(B4).Interior.Color = vbRed End If If Range(B5).Value = 評価A Then Range(B5).Interior.Color = vbGreen ElseIf Range(B5).Value = 評価B Then Range(B5).Interior.Color = vbYellow ElseIf Range(B5).Value = 評価C Then Range(B5).Interior.Color = vbRed End If End Sub |
コードの解説
2行目:もし、セルの値が評価Aならば
3行目:セルの背景を緑にする
4行目:もし、セルの値が評価Bならば
5行目:セルの背景を黄にする
6行目:もし、セルの値が評価Cならば
7行目:セルの背景を赤にする
8行目:ifはここまで(if終了のおまじない)
10行目以降:2行目~8行目と同じ(セルの場所だけ違う)
補足
interiorは、セルの背景 colorは色
それぞれを意味しています。
interior.colorは、セルの背景色を指します。
colorは
vbGreen:緑
vbYellow:黄
vbRed:赤
を示しています。
事例3(IF elseif else)|80点以上、80点未満、それ以外なら
80点以上なら、合格
50点以上なら、再試験
それ以外なら、不合格
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub if_jirei_3() If Range(B2).Value >= 80 Then Range(C2).Value = 合格 ElseIf Range(B2).Value >= 50 Then Range(C2).Value = 再試験 Else Range(C2).Value = 不合格 End If If Range(B3).Value >= 80 Then Range(C3).Value = 合格 ElseIf Range(B3).Value >= 50 Then Range(C3).Value = 再試験 Else Range(C3).Value = 不合格 End If If Range(B4).Value >= 80 Then Range(C4).Value = 合格 ElseIf Range(B4).Value >= 50 Then Range(C4).Value = 再試験 Else Range(C4).Value = 不合格 End If End Sub |
コードの解説
2行目:もし、セルB2の値が80以上ならば
3行目:セルC2に 合格 を出力
4行目:もし、セルB2の値が50以上ならば
5行目:セルC2に 再試験 を出力
6行目:それ以外ならば
7行目:セルC2に 不合格 を出力
8行目:ifはここまで(if終了のおまじない)
10行目以降:2行目~8行目と同じ(セルの場所だけ違う)
事例4(IF 場合分け)|60,70,80,90で段階評価
90以上なら、評価S
80-89以上なら、評価A
70-79以上なら、評価B
60-69以上なら、評価C
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Sub if_jirei_4() If Range(B3).Value >= 90 Then Range(C3).Value = 評価S ElseIf Range(B3).Value >= 80 Then Range(C3).Value = 評価A ElseIf Range(B3).Value >= 70 Then Range(C3).Value = 評価B ElseIf Range(B3).Value >= 60 Then Range(C3).Value = 評価C End If If Range(B4).Value >= 90 Then Range(C4).Value = 評価S ElseIf Range(B4).Value >= 80 Then Range(C4).Value = 評価A ElseIf Range(B4).Value >= 70 Then Range(C4).Value = 評価B ElseIf Range(B4).Value >= 60 Then Range(C4).Value = 評価C End If If Range(B5).Value >= 90 Then Range(C5).Value = 評価S ElseIf Range(B5).Value >= 80 Then Range(C5).Value = 評価A ElseIf Range(B5).Value >= 70 Then Range(C5).Value = 評価B ElseIf Range(B5).Value >= 60 Then Range(C5).Value = 評価C End If If Range(B6).Value >= 90 Then Range(C6).Value = 評価S ElseIf Range(B6).Value >= 80 Then Range(C6).Value = 評価A ElseIf Range(B6).Value >= 70 Then Range(C6).Value = 評価B ElseIf Range(B6).Value >= 60 Then Range(C6).Value = 評価C End If End Sub |
コードの解説
2行目:もし、セルB2の値が90以上ならば
3行目:セルC2に 評価S を出力
4行目:もし、セルB2の値が80以上ならば
5行目:セルC2に 評価A を出力
6行目:もし、セルB2の値が70以上ならば
7行目:セルC2に 評価B を出力
8行目:もし、セルB2の値が60以上ならば
9行目:セルC2に 評価C を出力
10行目:ifはここまで(if終了のおまじない)
12行目以降:2行目~10行目と同じ(セルの場所だけ違う)
補足
このコードは、4つの条件分岐(90以上、80以上、70以上、60以上)があります
もし、95点であれば、4つの条件をすべて満たしますよね?
この場合、一番最初のifで処理されるので、ほかの条件はスルーします。
そのため、点数で場合分けするには、上記のプログラムで問題なく稼働します。
複数条件(かつ、または)を作りたい(3つ以上の例も)|and or
70点以上かつ80点未満ならば評価Bというように複数条件で、ifを使いときがあります。
そんなときは、And(かつ)、Or(または)を使います。ここでは、複数条件の作り方を紹介します。
事例5(複数条件 and)|2017/3/1~2017/3/31なら(特定の月のみを取得)
2017年3月1日~2017年3月31日のデータを分類したい
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub if_jirei_5() Dim hajime, owari hajime = #3/1/2017# owari = #4/1/2017# If Range(B3).Value >= hajime And Range(B3).Value < owari Then Range(C3).Value = ○ Else Range(C3).Value = × End If If Range(B4).Value >= hajime And Range(B4).Value < owari Then Range(C4).Value = ○ Else Range(C4).Value = × End If End Sub |
コードの解説
2行目:hajimeとowariを変数として定義
3行目:変数hajime は、2017/3/1とする
4行目:変数owari は、2017/4/1とする
5行目:もし、セルB2の値がhajime(2017/3/1)以降で、かつ、セルB2がowari(2017/4/1)より前ならば
6行目:セルC2に ○ を出力
7行目:そうでないなら
8行目:セルC2に × を出力
9行目:ifはここまで(if終了のおまじない)
11行目以降:2行目~9行目と同じ(セルの場所だけ違う)
事例6(3つ以上の「or」組み合わせ)|どれか1つでも80点以上なら
国語か数学か英語のどれかが80点以上なら合格
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei_6() If Range(B2).Value >= 80 Or Range(C2).Value >= 80 Or Range(D2).Value >= 80 Then Range(E2).Value = 合格 Else Range(E2).Value = 不合格 End If If Range(B3).Value >= 80 Or Range(C3).Value >= 80 Or Range(D3).Value >= 80 Then Range(E3).Value = 合格 Else Range(E3).Value = 不合格 End If End Sub |
コードの解説
2行目:もし、セルB2の値が80以上 もしくは セルC2の値が80以上 もしくは セルD2の値が80以上 ならば
3行目:セルE2に 合格 を出力
4行目:それ以外ならば
5行目:セルE2に 不合格 を出力
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
よくある間違い
If Range(“B2”).Value Or Range(“C2”).Value Or Range(“D2”).Value >= 80 Thenはエラーが出ます
この書き方だと、Range(“B2”).Valueの条件とRange(“C2”).Valueの条件がわかりません。(Range(“D2”).Value >=80 だけは分かります)
ですので、VBAではエラーになってしまいます。
事例おまけ(コードを改行)|if文が長い、1行でおさめたい、短くしたい
ifで複数条件を設定したいが、コードを短くしたい
_ (アンダーバー)を使えば、改行することができます。そうすれば、文字切れを防ぐことができます。
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub if_omake() If Range(B2).Value >= 80 Or Range(C2).Value >= 80 Or _ Range(D2).Value >= 80 Then Range(E2).Value = 合格 Else Range(E2).Value = 不合格 End If If Range(B3).Value >= 80 Or Range(C3).Value >= 80 Or _ Range(D3).Value >= 80 Then Range(E3).Value = 合格 Else Range(E3).Value = 不合格 End If End Sub |
コードの解説
2行目:長いので、 Or _で改行( _ アンダーバーを使えば、改行することができます。)
3行目以降は、割愛
「でないなら」を作りたい|Not, 比較演算子
セルが黄色ではないなら
セルが空白ではないなら
このように「〇〇でないなら」という条件を作りたいときがあります。
そんなときは、Not、比較演算子<>を使う方法があります。
これが使えるようになると、条件分岐をかなり作りやすくなりますので、ぜひこのまま読みすすめていってください。
では、具体例を紹介していきますね。
事例7(Not)|セルが黄色でない
東京都でないなら書き換えてくださいと表示する
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei_7() If Not Range(B2).Value = 東京都 Then Range(C2).Value = 書き換えてください Else Range(C2).Value = OK End If If Not Range(B3).Value = 東京都 Then Range(C3).Value = 書き換えてください Else Range(C3).Value = OK End If End Sub |
コードの解説
2行目:セルB2の値が「東京都」でないなら
3行目:セルC2の値を「書き換えてください」にする
4行目:それ以外なら
5行目:セルC2の値を「OK」にする
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
補足
[1] If Not Range(“B2”).Value = “東京都” Then
[2] If Range(“B2”).Value <> “東京都” Then
は同じ意味を指します。
[2]の使い方は、次の事例で紹介していますので、このまま読み進めていってください
事例8(比較演算子)|セルが空白なら/空白でないなら
Notを使わずに、比較演算子 <> を使う方法もあります。
セルが空白ではない→背景を灰色にする
セルが空白→背景を黄色にする
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei_8() If Range(B2).Value <> Then Range(B2).Interior.Color = ;HC0C0C0 ElseIf Range(B2).Value = Then Range(B2).Interior.Color = vbYellow End If If Range(B3).Value <> Then Range(B3).Interior.Color = ;HC0C0C0 ElseIf Range(B3).Value = Then Range(B3).Interior.Color = vbYellow End If End Sub |
コードの解説
2行目:セルB2の値が何か記載があるなら
3行目:セルB2の背景の色を灰色にする
4行目:セルB2の値が空欄なら
5行目:セルB2の背景の色を黄色にする
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~8行目と同じ(セルの場所だけ違う)
事例9(複数条件 比較演算子)|80点以上で、かつセルが黄色でないなら
And と 比較演算子 <> を組み合わせた事例も紹介します。
「80以上」かつ「黄色でない」はないなら、赤にする
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 |
Sub if_jirei_9() If Range(B2).Value >= 80 And Range(B2).Interior.Color <> vbYellow Then Range(B2).Interior.Color = vbRed End If If Range(B3).Value >= 80 And Range(B3).Interior.Color <> vbYellow Then Range(B3).Interior.Color = vbRed End If End Sub |
コードの解説
2行目:セルB2の値が80以上で、かつセルB2の背景の色が黄色でないなら
3行目:セルB2の背景の色を3赤にする
4行目:ifはここまで(if終了のおまじない)
6行目以降:2行目~4行目と同じ(セルの場所だけ違う)
「何もしない」を作りたい|省略できる
〇〇なら「なにもしない」という条件を作りたいけど、どうすればいいの?
という要望を聞くことがあります。結論からいうと、
不要です。何も書かなくてOKです
事例を使って説明します。
事例10(何もしない)|何も書かず、省略しよう
以下は事例4のコードです。これを使って説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub if_jirei_10() If Range(B3).Value >= 90 Then Range(C3).Value = 評価S ElseIf Range(B3).Value >= 80 Then Range(C3).Value = 評価A ElseIf Range(B3).Value >= 70 Then Range(C3).Value = 評価B ElseIf Range(B3).Value >= 60 Then Range(C3).Value = 評価C End If If Range(B4).Value >= 90 Then Range(C4).Value = 評価S ElseIf Range(B4).Value >= 80 Then Range(C4).Value = 評価A ElseIf Range(B4).Value >= 70 Then Range(C4).Value = 評価B ElseIf Range(B4).Value >= 60 Then Range(C4).Value = 評価C End If End Sub |
60点未満については、何も処理が書かれていません。ですので、60点未満だった場合、何もしません。
つまり、「何もしない」と作成したいのであれば、何も書かなければOKです。
文字列、日付、数値などを識別したい|IsDate Isnumeric
もし、セルの値が日付だったら、処理A、文字列だったら、処理B
というぐあいで、
セルに含まれている情報の種類(データ型と呼びます)を判別したいときの方法を紹介します。
事例11(IsDate)|セルの情報が日付なら
繰り返しの処理をしたいけれど、日付が入っていたり文字列が入っていたりと統一されておらず、エラーが出る…
そんなときにオススメがこのIsDateです。これを使えば、セルの値が日付の場合で、条件分岐できるようになります。
日付かどうかを確認する
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub jirei_11() If IsDate(Range(B2).Value) = True Then Range(C2).Value = Date型 Else Range(C2).Value = Date型ではない End If If IsDate(Range(B3).Value) = True Then Range(C3).Value = Date型 Else Range(C3).Value = Date型ではない End If End Sub |
コードの解説
2行目:もしセルB2の値がDate型であれば
3行目:セルC2に「Date型です」と表示
4行目:それ以外ならば
5行目:セルC2に「Date型ではない」と表示
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
Date型とは、日付型のことです。たとえば、2017/3/4 のようなyyyy/mm/ddはDate型です。
補足
IsDateはBoolean型を取ります。
Boolean型はTrueかFalseで判別するので、
IsDate(変数) = True もしくは IsDate(変数) = Falseと書きます。
使いどころ
セルB100には2017/3/31 と セルB101には”2017年3月末”
この2つは、言葉では同じ意味なのですが、VBAでは同じ意味になりません。
なぜなら、2017年3月末 は「文字列」と判断されるからです。
事例4のように日付で比較する場合、2017年3月末では、エラーが出ます
(原因は、文字列と日付では比較できないから)
このように、セルに日付けや文字列が散在する場合、日付だったら、処理を行うように設定すると、解決します。
事例12(IsNumeric)|セルの情報が数値なら
数値かどうかを調べたい
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub jirei_12() If IsNumeric(Range(B2).Value) = True Then Range(C2).Value = 数値です Else Range(C2).Value = 数値ではない End If If IsNumeric(Range(B3).Value) = True Then Range(C3).Value = 数値です Else Range(C3).Value = 数値ではない End If End Sub |
コードの解説
2行目:もしセルB2の値がNumeric型であれば
3行目:セルC2に「数値です」と表示
4行目:それ以外ならば
5行目:セルC2に「数値ではない」と表示
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
Numeric型とは、数値のことです。1や2などはNumeric型です。
補足
IsNumeric も IsDate と同様に、Boolean型を取ります。
使いどころ
セルに入力されている値が、数値か文字列か、などを判定するときに使うと便利です。
数値として比較したいのに、文字列が入力されていた…
こういう場合は、エラーが出てしまうので、あらかじめIsnumericで判別するのが定石です。
Isnumeric() = false なら、スキップするようにマクロを組んでおくと、エラーを防ぐことができます。
情報を調べたい|instr like not is nothing
セルの中に、”県”が含まれているときだけ、処理をしたい
そんなことってありますよね。ここでは、特定の文字列を検索する方法(instr like not is nothing)を紹介します。
事例13(if instr)|○○が含まれているなら
区が含まれているなら
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei_13() If InStr(Range(B2).Value, 区) > 0 Then Range(C2).Value = ○ Else Range(C2).Value = × End If If InStr(Range(B3).Value, 区) > 0 Then Range(C3).Value = ○ Else Range(C3).Value = × End If End Sub |
コードの解説
2行目:セルB2の値に 区 が含まれているなら
3行目:セルC2の値を ○ とする
4行目:そうでないなら(つまり、B2に 区 が含まれていないなら)
5行目:セルC2の値を × とする
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
補足
Instrは Instr (検索対象,検索したい言葉)で使います。
例1 Instr (“東京都杉並区”,”区”) とすれば、 1 となります。
例2 Instr (“東京都西東京市”,”区”) とすれば、 0 となります。
ですので、セルB2の値に 区 が1つ含まれていれば
Instr ( range ( “B2” ) . value , “区” ) は 1
セルB2の値に 区 が2つ含まれていれば
Instr ( range ( “B2” ) . value , “区” ) は 2
というふうに、検索対象に含まれている数を示します。
事例14(Not like)|1,2,3から始まらない
1,2,3で始まらないときだけ、処理したい
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei_14() If Not Range(B2).Value Like [1-3]* Then Range(C2).Value = 1,2,3から始まらない Else Range(C2).Value = 1,2,3から始まる End If If Not Range(B3).Value Like [1-3]* Then Range(C3).Value = 1,2,3から始まらない Else Range(C3).Value = 1,2,3から始まる End If End Sub |
コードの解説
2行目:もし、セルB2の先頭の数字が 1,2,3から始まらないなら
3行目:セルC2の値に 1,2,3から始まらない と出力
4行目:そうでないなら(1,2,3から始まるなら)
5行目:セルC2の値に 1,2,3から始まる と出力
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
補足
Like “[1-3]*”は 1,2,3のどれかで始まる数字 (何桁でも可) を表します。
123 2345 34567 といった数字は1,2,3から始まるので、該当する
456 5678 678910 といった数字は1,2,3から始まらないので、該当しません
事例15(like Or)|県を含まないワイルドカード検索
都道府県の内、県の場合だけを除外して考えたい
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub if_jirei15() If Range(B2).Value Like ??[県] Or Range(B2).Value Like ???[県] Then Range(C2).Value = 県です Else Range(C2).Value = 県ではない End If If Range(B3).Value Like ??[県] Or Range(B3).Value Like ???[県] Then Range(C3).Value = 県です Else Range(C3).Value = 県ではない End If End Sub |
コードの解説
2行目:もし、セルB2が ○○県 もしくは ○○○県 ならば
3行目:セルC2の値に 県です と出力
4行目:そうでないなら(県以外なら)
5行目:セルC2の値に 県ではない と出力
6行目:ifはここまで(if終了のおまじない)
8行目以降:2行目~6行目と同じ(セルの場所だけ違う)
補足
??[県] ???[県] の?には1文字の文字列が入ります。
県には、広島県のように、2文字入る場合と、和歌山県のように3文字入る場合があります。
ですので、??[県] ???[県]という条件を使っています。
Likeを使ったワイルドカード(?, *, #など)の使いかたを紹介しておきます。
?:1文字の文字列
*:数
#:1文字の数字(0-9)
[charlist] charlistに指定した文字のどれか1文字に該当する
[!charlist] charlistに指定した文字のどれにも該当しない
事例16(Not is nothingの組み合わせ)|シートが設定されているなら
シート16があるかどうかチェックしたい
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 |
Sub if_jirei16() Dim obj Set obj = Sheet16 If Not obj Is Nothing Then MsgBox シート ; obj.Name ; はあります End If End Sub |
コードの解説
2行目:objをobject型で定義
3行目:objにSheet1を設定
4行目:もし obj に何も設定されていない でないなら(もしobjに何か設定されていたら)
5行目:メッセージ「シート「” ; obj.Name ; “」はあります」 と表示
6行目:ifはここまで(if終了のおまじない)
特定条件ならエラーを避けたい|Goto,error
エラーが発生したら、マクロを終了させたい
この条件なら、他のプロシージャへ移行させたい
このようなことを達成したいなら、Gotoやerrorを覚えておくと使えることがあります。IF関数と組み合わせることで、マクロのバリエーションを増やすことができます。
ただし、Gotoは、プログラムの構造を無視する諸刃の剣ですので、エラーが起こったときだけ使うようにしましょう。
では、事例を見ていきます。
事例17(Go to error)|エラーならmsgboxを表示して終了
プログラムを動かすと、エラーが出る場合ってありますよね?
もし、何も策を講じないと、エラーメッセージが表示されて、プログラムが停止してしまいます。
ここでは、エラーが出てしまったときの策を紹介します。
エラーが出たら、プログラムを終了させる
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub jirei_17() Dim a As Integer a = Range(B2).Value If a < 100 Then GoTo Errseq Else MsgBox もとのプロシージャです Exit Sub End If Errseq: MsgBox 他のプロシージャです End Sub |
コードの解説
2行目:aをInteger型の変数として定義
3行目:aはセルB2の値を入れ込む
4行目:もしaの値が100より小さいなら
5行目:Errseqのプロシージャへ移動
6行目:そうでないなら
7行目:メッセージ「もとのプロシージャです」と表示
8行目:プログラムを終了のおまじない
9行目:ifはここまで(if終了のおまじない)
10行目:Errseqへ移動した場合
11行目:メッセージ「他のプロシージャです」と表示
事例18(Go to error resume on next)|エラーなら次の行へ
エラーが出てもかまわず、次に進んでほしい場合ってありますよね?
そんなときはこれを使いましょう。
エラーが発生しても、停止することなく、次に進んでくれます。
エラーが発生しても、そのままプログラムを進めたい
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 |
Sub jirei_18() Dim a As Integer On Error Resume Next a = おはようございます If a = Then MsgBox これはString型なので、本来「型が一致しません」 End If End Sub |
コードの解説
2行目:aをInteger型の変数として定義
3行目:エラーが出ても次へ というおまじない
4行目:aに おはようございます
5行目:もしaの値が “” なら(空欄なら)
6行目:メッセージ「これはString型なので、本来「型が一致しません」」と表示
7行目:ifはここまで(if終了のおまじない)
On Error Resume Nextを使えば、エラーをスキップできます。ただ、エラーがなくなるワケではないので、処置方法を探すようにしましょう。
大量データを処理したい|if elseとfor nextの組み合わせ
ifを使いながら、大量データの処理を行いたいけど、どうやればいいのか?
と感じているあなたへ
IF関数と大量データ処理はfor next構文を組み合わせることで、ifを使いながら大量データを処理できます。以下のコードを参考にしてください。
では、事例を見ていきましょう。
事例19(if else と for next)|データ10コを処理する
まずは、データ数が100で固定されている場合を考えます。
もし、データ数が固定されていない場合は、事例19を参考にしてください。最終行を自動取得する方法を紹介しています。
セルB1~セルB100のそれぞれの値が80以上であれば、セルC1~セルC100に”合格”
それ以外であれば、セルC1~セルC100に”不合格”
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 |
Sub jirei_19() Dim i As Long For i = 1 To 10 If Range(B ; i).Value >= 80 Then Range(C ; i).Value = 合格 Else Range(C ; i).Value = 不合格 End If Next End Sub |
コードの解説
2行目:iをlong型の変数として定義
3行目:iには1から10までを順番に入れ込む(まずは、i=1でスタート)
4行目:もしセルBi(i=1~10)の値が80以上なら
5行目:セルCi(i=1~10)に 合格 を出力
6行目:そうでないなら
7行目:セルCi(i=1~10)に 不合格 を出力
8行目:ifはここまで(if終了のおまじない)
9行目:3行目にもどる(3行目に戻るとiに1加わる、i=10が終わったら、End Subへ)
補足
3行目:For i = 1 to 10の
1 を 2に変えれば、2行目から処理を開始してくれます
10 を 100 に変えれば、100行目まで処理してくれます
このようにfor i = A to B のA(最初)とB(最後)の数字を変えることで、処理する範囲を変えることができます。
それを応用して、次の事例では、B(最後)の数字を自動で決定する方法を紹介します。
事例20(if else と for next)|最終行を取得して処理する
処理したいデータによっては、データ数が固定されておらず、変動するときってありますよね?
この事例では、最終行を読み取って、データ数が変動する場合に対応する方法を紹介します。
B列の一番下までのそれぞれの値が80以上であれば、C列に”合格”
それ以外であれば、C列に”不合格”
これを達成するマクロのコードは以下の通り
1 2 3 4 5 6 7 8 9 10 11 |
Sub jirei_20() Dim i, lastrow As Long lastrow = Range(B65536).End(xlUp).Row For i = 1 To lastrow If Range(B ; i).Value >= 80 Then Range(C ; i).Value = 合格 Else Range(C ; i).Value = 不合格 End If Next End Sub |
コードの解説
2行目:i, lastrowをlong型の変数として定義
3行目:lastrowは、セルB65536から上に移動して、最初にデータが入っているセルの「行数」
4行目:iには1からlastrowまでを順番に入れ込む(まずは、i=1でスタート)
5行目:もしセルBi(i=1~lastrow)の値が80以上なら
6行目:セルCi(i=1~lastrow)に 合格 を出力
7行目:そうでないなら
8行目:セルCi(i=1~lastrow)に 不合格 を出力
9行目:8行目:ifはここまで(if終了のおまじない)
10行目:4行目にもどる(4行目に戻るとiに1加わる、i=lastrowになったら、End Subへ)
補足
Range(“B65536”).End(xlUp).Rowは、エクセルの最終行を取得する常套手段です。
考え方としては、セルB65536から上に移動して、最初にデータは入っているセルが、最終行になるというものです。
B65536をA65536に変えれば、A列の最終行を取得できます。
また65536にしている理由は、エクセル97-2003ブック(.xls)の最終行が65536行なので、65536にしています。エクセルマクロ有効ブック(.xlsm)なら最終行が1048576行なので、1048576にするようにしています。
テンプレートファイルをダウンロードしたい方はコチラから
紹介したのVBAのIf文のプログラムを一から作るのは大変なので、紹介したマクロのプログラムが入ったファイルは無料でダウンロードできるようにします。以下のフォームにメールアドレスを入力いただくと、返信メールからエクセルファイルをダウンロードできます。
この記事を読んだ方は、こちらもオススメです。ぜひ合わせて読んでみてください。
「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。
サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|インターネットに自動アクセスする
サンプル6|ヤフオクの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う
ぜひご活用ください。