パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

エクセルマクロVBAのIF文を20事例で解説|複数条件(and or)からelse not elseif likeの使い方まで

f:id:gene320:20170405191227p:plain:w350

VBAのIf関数を使いこなしたいけど、イマイチよく分からない…
VBAのifとforの組み合わせを使いこなせるようになりたい…

私がVBAを始めた頃は、IF関数の使い方が分かっておらず、苦労しました。しかし、本を読んだり、実践する中で、IFの使い方を習得してきました。

実際に使えるようになると、これほど使える関数はありません。ただ、理解するまでは大変です。

そこで、企業でエクセルマクロVBAを教えた経験がある私が、事例をベースに、IF関数の使い方を詳しく紹介します。

この記事を読んで、IF関数を理解しつつ、コピペして使い倒してください。

エクセルマクロVBAのIFを20事例で|複数条件(and or)からelse not elseif likeまで

VBAのif関数を使いたい、条件式の使い方|if,else,ifelse,then

Ifの基本形は

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以上ならば、合格
それ以外なら、不合格
マクロを起動前

f:id:gene320:20171030213238p:plain

マクロを起動後

f:id:gene320:20171030213253p:plain

これを達成するマクロのコードは以下の通り

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であれば、赤にする
マクロを起動前

f:id:gene320:20171030213317p:plain

マクロを起動後

f:id:gene320:20171030213327p:plain

これを達成するマクロのコードは以下の通り

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点以上なら、再試験
それ以外なら、不合格
マクロを起動前

f:id:gene320:20171030213451p:plain

マクロを起動後

f:id:gene320:20171030213456p:plain

これを達成するマクロのコードは以下の通り

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
マクロを起動前

f:id:gene320:20171030213603p:plain

マクロを起動後

f:id:gene320:20171030213607p:plain

これを達成するマクロのコードは以下の通り

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日のデータを分類したい
マクロを起動前

f:id:gene320:20171030213746p:plain

マクロを起動後

f:id:gene320:20171030213753p:plain

これを達成するマクロのコードは以下の通り

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点以上なら合格
マクロを起動前

f:id:gene320:20171030214158p:plain

マクロを起動後

f:id:gene320:20171030214201p:plain

これを達成するマクロのコードは以下の通り

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で複数条件を設定したいが、コードを短くしたい

_ (アンダーバー)を使えば、改行することができます。そうすれば、文字切れを防ぐことができます。

これを達成するマクロのコードは以下の通り

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)|セルが黄色でない

やりたいこと
東京都でないなら書き換えてくださいと表示する
マクロを起動前

f:id:gene320:20171030214320p:plain

マクロを起動後

f:id:gene320:20171030214323p:plain

これを達成するマクロのコードは以下の通り

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を使わずに、比較演算子 <> を使う方法もあります。

やりたいこと
セルが空白ではない→背景を灰色にする
セルが空白→背景を黄色にする
マクロを起動前

f:id:gene320:20171030214842p:plain

マクロを起動後

f:id:gene320:20171030214854p:plain

これを達成するマクロのコードは以下の通り

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以上」かつ「黄色でない」はないなら、赤にする
マクロを起動前

f:id:gene320:20171030215016p:plain

マクロを起動後

f:id:gene320:20171030215024p:plain

これを達成するマクロのコードは以下の通り

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のコードです。これを使って説明します。

マクロを起動前

f:id:gene320:20171030215126p:plain

マクロを起動後

f:id:gene320:20171030215135p:plain

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です。これを使えば、セルの値が日付の場合で、条件分岐できるようになります。

やりたいこと
日付かどうかを確認する
マクロを起動前

f:id:gene320:20171030223107p:plain

マクロを起動後

f:id:gene320:20171030223112p:plain

これを達成するマクロのコードは以下の通り

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)|セルの情報が数値なら

やりたいこと
数値かどうかを調べたい
マクロを起動前

f:id:gene320:20171030215625p:plain

マクロを起動後

f:id:gene320:20171030215628p:plain

これを達成するマクロのコードは以下の通り

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)|○○が含まれているなら

やりたいこと
区が含まれているなら
マクロを起動前

f:id:gene320:20171030215914p:plain

マクロを起動後

f:id:gene320:20171030215916p:plain

これを達成するマクロのコードは以下の通り

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で始まらないときだけ、処理したい
マクロを起動前

f:id:gene320:20171030220306p:plain

マクロを起動後

f:id:gene320:20171030220310p:plain

これを達成するマクロのコードは以下の通り

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)|県を含まないワイルドカード検索

やりたいこと
都道府県の内、県の場合だけを除外して考えたい
マクロを起動前

f:id:gene320:20171030220630p:plain

マクロを起動後

f:id:gene320:20171030220640p:plain

これを達成するマクロのコードは以下の通り

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を使ったワイルドカード(?, *, #など)の使いかたを紹介しておきます。

Likeを使ったワイルドカードの使いかた
?:1文字の文字列
*:数
#:1文字の数字(0-9)
[charlist] charlistに指定した文字のどれか1文字に該当する
[!charlist] charlistに指定した文字のどれにも該当しない

事例16(Not is nothingの組み合わせ)|シートが設定されているなら

やりたいこと
シート16があるかどうかチェックしたい
マクロを起動後

f:id:gene320:20171030220752p:plain

これを達成するマクロのコードは以下の通り

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を表示して終了

プログラムを動かすと、エラーが出る場合ってありますよね?

もし、何も策を講じないと、エラーメッセージが表示されて、プログラムが停止してしまいます。

ここでは、エラーが出てしまったときの策を紹介します。

やりたいこと
エラーが出たら、プログラムを終了させる
マクロを起動前

f:id:gene320:20171030220829p:plain

マクロを起動後

f:id:gene320:20171030220832p:plain

これを達成するマクロのコードは以下の通り

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)|エラーなら次の行へ

エラーが出てもかまわず、次に進んでほしい場合ってありますよね?

そんなときはこれを使いましょう。

エラーが発生しても、停止することなく、次に進んでくれます。

やりたいこと
エラーが発生しても、そのままプログラムを進めたい
マクロを起動後

f:id:gene320:20171030220927p:plain

これを達成するマクロのコードは以下の通り

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に”不合格”
マクロを起動前

f:id:gene320:20171030221238p:plain

マクロを起動後

f:id:gene320:20171030221240p:plain

これを達成するマクロのコードは以下の通り

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列に”不合格”
マクロを起動前

f:id:gene320:20171030221303p:plain

マクロを起動後

f:id:gene320:20171030221307p:plain

これを達成するマクロのコードは以下の通り

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|エクセルの情報をワードに差し込み、印刷まで行う

ぜひご活用ください。

エクセルマクロでできることを知りたいなら

www.fastclassinfo.com

マクロを高速化したいなら

www.fastclassinfo.com

エクセルマクロの難易度や習得までの期間を知りたいなら

www.fastclassinfo.com

エクセルマクロを独学で上達するコツを知りたいなら

www.fastclassinfo.com

エクセルマクロの勉強方法を知りたいなら

www.fastclassinfo.com

エクセルVBAを本で勉強したいなら

www.fastclassinfo.com

エクセルVBAの資格に興味があるなら

www.fastclassinfo.com

パソコン仕事を効率的に使うワザを知りたいなら

www.fastclassinfo.com