パソコンスキル教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間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関数の使い方を詳しく紹介します。

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

エクセルマクロVBAのIF文を20の事例で徹底紹介

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

Ifの基本形は

Sub kihon_kei()
    If A=B then '2行目
        処理1 '3行目
    elseif A=C then '4行目
        処理2 '5行目
    else '6行目
        処理3 '7行目
    end if '8行目
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点以上なら

やりたいこと
B2の値が80以上であれば、セルC2に”合格”
B2の値がそれ以外なら、セルC2に”不合格”

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

Sub if_jirei_1()
    If Range("B2").Value >= 80 Then '2行目
        Range("C2").Value = "合格" '3行目
    Else '4行目
        Range("C2").Value = "不合格" '5行目
    End If '6行目
End Sub

コードの解説
2行目:もし、セルB2の値が80以上ならば
3行目:セルC2に 合格 を出力
4行目:そうでないなら
5行目:セルC2に 不合格 を出力
6行目:ifはここまで(if終了のおまじない)

補足
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であれば、赤にする

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

Sub if_jirei_2()
    If Range("B3").Value ="評価A"  Then '2行目
        Range("B3").interior.colorindex = 17 '3行目
    elseIf Range("B3").Value ="評価B"  Then '4行目
        Range("B3").interior.colorindex = 6 '5行目
    elseIf Range("B3").Value ="評価C"  Then '6行目
        Range("B3").interior.colorindex = 3 '7行目
    End If '8行目
End Sub

コードの解説
2行目:もし、セルB3の値が評価Aならば
3行目:セルB3の背景を5(青)にする
4行目:もし、セルB3の値が評価Bならば
5行目:セルB3の背景を6(黄)にする
6行目:もし、セルB3の値が評価Cならば
7行目:セルB3の背景を3(赤)にする
8行目:ifはここまで(if終了のおまじない)

補足
interiorは、セルの背景 colorindexは色 それぞれを意味しています。

interior.colorindexは、セルの背景色を指します。

colorindexには数値と色が紐づいています。5(青) 6(黄) 3(赤) です

事例3(IF elseif else)|80点以上、80点未満、それ以外なら

やりたいこと
80点以上なら、合格
80点未満なら、不合格
それ以外なら、未受験

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

Sub if_jirei_3()
    If Range("B2").Value => 80  Then '2行目
        Range("C2").value = "合格" '3行目
    elseIf Range("B2").Value < 80 Then '4行目
        Range("C2").value = "不合格" '5行目
    else '6行目
        Range("C2").value = "未受験" '7行目
    End If '8行目
End Sub 

コードの解説
2行目:もし、セルB2の値が80以上ならば
3行目:セルC2に 合格 を出力
4行目:もし、セルB2の値が80未満ならば
5行目:セルC2に 不合格 を出力
6行目:それ以外ならば
7行目:セルC2に 未受験 を出力
8行目:ifはここまで(if終了のおまじない)

事例4(IF 場合分け)|60,70,80,90で段階評価

やりたいこと
90以上なら、評価S
80-89以上なら、評価A
70-79以上なら、評価B
60-69以上なら、評価C

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

Sub if_jirei_4()
    If Range("B2").Value >= 90 Then '2行目
        Range("C2").Value = "評価S" '3行目
    ElseIf Range("B2").Value >= 80 Then '4行目
        Range("C2").Value = "評価A" '5行目
    ElseIf Range("B2").Value >= 70 Then '6行目
        Range("C2").Value = "評価B" '7行目
    ElseIf Range("B2").Value >= 60 Then '8行目
        Range("C2").Value = "評価C" '9行目
    End If '10行目
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終了のおまじない)

補足
このコードは、4つの条件分岐(90~、80~、70~、60~)があります
たとえば、95点であれば、4つの条件をすべて満たしますよね?

大丈夫なの?と思われるかもしれません。

しかし、一番最初のifで処理されるので、ほかの条件には該当せず、スルーされます。

ですので、点数で場合分けするには、上記のコードで達成できます。

複数条件(かつ、または)を作りたい(3つ以上の例も)|and or

70点以上かつ80点未満なら評価Bという複数条件で、ifを使いときってありますよね。

そんなときは、かつ(and)または(or)といった方法があります。

これが使えるようになると、あなたのVBAの幅がグッと広がりますので、ぜひこのまま読みすすめていってください。

では、具体例を紹介していきますね。

事例5(複数条件 and)|2017/3/1~2017/3/31なら(特定の月のみを取得)

やりたいこと
2017年3月1日~2017年3月31日のデータを分類したい

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

Sub if_jirei_5()
    Dim hajime, owari As Date '2行目
    hajime = #3/1/2017# '3行目
    owari = #4/1/2017# '4行目
    If Range("B2").Value >= hajime And Range("B2").Value < owari Then '5行目
        Range("C2").Value = "○" '6行目
    Else '7行目
        Range("C2").Value = "×" '8行目
    End If '9行目
End Sub

コードの解説
2行目:hajimeとowariをDate型の変数として定義
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終了のおまじない)

事例6(3つ以上の「or」組み合わせ)|どれか1つでも80点以上なら

やりたいこと
国語か数学か英語のどれかが80点以上なら合格

これを達成するマクロのコードは以下の通り
セルB2に 国語の点数
セルC2に 数学の点数
セルD2に 英語の点数
それぞれの値が入っているとしてコードを作成しています

Sub if_jirei_6()
    Dim kokugo, sugaku, eigo As long '2行目
    kokugo = Range("B2").Value '3行目
    sugaku = Range("C2").Value '4行目
    eigo = Range("D2").Value '5行目
    If kokugo >= 80 Or sugaku >= 80 Or eigo >= 80 Then '6行目
        Range("E2").Value = "合格" '7行目
    Else '8行目
        Range("E2").Value = "不合格" '9行目
    End If '10行目
End Sub

コードの解説
2行目:kokugo,sugaku,eigoをLong型の変数として定義
3行目:kokugo は、セルB2の値とする
4行目:sugaku は、セルC2の値とする
5行目:eigo は、セルD2の値とする
6行目:もし、kokugo(セルB2の値)が80以上 もしくは sugaku(セルC2の値)が80以上 もしくは eigo(セルD2の値)が80以上 ならば
7行目:セルE2に 合格 を出力
8行目:それ以外ならば
9行目:セルE2に 不合格 を出力
10行目:ifはここまで(if終了のおまじない)

よくある間違い
If kokugo Or sugaku Or eigo >= 80 Thenはエラーが出ます

この書き方だと、kokugoとsugakuがどこまで係っているのかわかりません。(eigo >=80 は分かるのですが)

ですので、VBAではエラーになってしまいます。

事例おまけ(コードを改行)|if文が長い、1行でおさめたい、短くしたい

やりたいこと
ifで複数条件を設定したいが、コードを短くしたい

事例6の変数設定をしないバージョンです。

Sub if_omake()
    If Range("B2").Value >= 80 Or Range("C2").Value >= 80 Or _
    Range("D2").Value >= 80 Then '2行目
        Range("E2").Value = "合格" '3行目
    Else '4行目
        Range("E2").Value = "不合格" '5行目
    End If '6行目
End Sub

コードの解説
2行目:長いので、 Or _で改行( _ アンダーバーを使えば、改行することができます。)
3行目以降は、割愛

「でないなら」を作りたい|Not, 比較演算子

セルが黄色ではないなら
セルが空白ではないなら

このように「〇〇でないなら」という条件を作りたいときってありますよね。

そんなときは、Not比較演算子<>を使う方法があります。

これが使えるようになると、条件分岐をかなり作りやすくなりますので、ぜひこのまま読みすすめていってください。

では、具体例を紹介していきますね。

事例7(Not)|セルが黄色でない

やりたいこと
セルが黄色でないなら、黄色にする

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

Sub if_jirei_7()
    If Not Range("B2").Interior.ColorIndex = 6 Then '2行目
        Range("B2").Interior.ColorIndex = 6 '3行目
    End If '4行目
End Sub

コードの解説
2行目:セルB2の背景の色が6(黄色)でないなら
3行目:セルB2の背景の色を6(黄色)にする
4行目:ifはここまで(if終了のおまじない)

補足
[1] If Not Range(“B2”).Interior.ColorIndex = 6 Then
[2] If Range(“B2”).Interior.ColorIndex <> 6 Then
は同じ意味を指します。

[2]の使い方は、次の事例で紹介していますので、このまま読み進めていってください

事例8(比較演算子)|セルが空白なら/空白でないなら

Notを使わずに、比較演算子 <> を使う方法もあります。

やりたいこと
セルが空白ではないなら灰色にする
セルが空白なら黄色にする

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

Sub if_jirei_8()
    If Range("B2").Value <> "" Then '2行目
        Range("B2").Interior.ColorIndex = 15 '3行目
    ElseIf Range("B2").Value = "" Then '4行目
        Range("B2").Interior.ColorIndex = 6 '5行目
    End If '6行目
End Sub

コードの解説
2行目:セルB2の値が空欄(“”)でない(<>)なら
3行目:セルB2の背景の色を15(灰色)にする
4行目:セルB2の値が空欄(“”)なら
5行目:セルB2の背景の色を6(黄色)にする
6行目:ifはここまで(if終了のおまじない)

事例9(複数条件 比較演算子)|80点以上で、かつセルが黄色でないなら

And と 比較演算子 <> を組み合わせた事例も紹介します。

やりたいこと
「80以上」かつ「黄色でない」はないなら、赤にする

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

Sub if_jirei_9()
    If Range("B2").Value >= 80 And Range("B2").Interior.ColorIndex <> 6 Then '2行目
        Range("B2").Interior.ColorIndex = 3 '3行目
    End If '4行目
End Sub

コードの解説
2行目:セルB2の値が80以上で、かつセルB2の背景の色が6(黄色)でないなら 3行目:セルB2の背景の色を3(赤)にする
4行目:ifはここまで(if終了のおまじない)

「何もしない」を作りたい|省略できる

〇〇なら「なにもしない」という条件を作りたいけど、どうすればいいの?

という要望を聞くことがあります。結論からいうと、

不要です。何も書かなくてOKです

事例を使って説明します。

事例10(何もしない)|何も書かず、省略しよう

以下は事例4のコードです。これを使って説明します。

Sub if_jirei_10()
    If Range("B2").Value >= 90 Then
        Range("C2").Value = "評価S"
    ElseIf Range("B2").Value >= 80 Then
        Range("C2").Value = "評価A"
    ElseIf Range("B2").Value >= 70 Then
        Range("C2").Value = "評価B"
    ElseIf Range("B2").Value >= 60 Then
        Range("C2").Value = "評価C"
    End If
End Sub

60点未満については、何も処理が書かれていません。ですので、60点未満だった場合、何もしません。

つまり、「何もしない」と作成したいのであれば、何も書かなければOKです。

文字列、日付、数値などを識別したい|IsDate Isnumeric

もし、セルの値が日付だったら、処理A文字列だったら、処理B というぐあいで、

セルに含まれている情報の種類(データ型と呼びます)を判別したいときの方法を紹介します。

事例11(IsDate)|セルの情報が日付なら

繰り返しの処理をしたいけれど、日付が入っていたり文字列が入っていたりと統一されておらず、エラーが出る…

そんなときにオススメがこのIsDateです。これを使えば、セルの値が日付の場合で、条件分岐できるようになります。

やりたいこと
日付なら、メッセージを表示

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

Sub jirei_11()
    Dim str As String '2行目
    str = Range("B2").Value '3行目
    If IsDate(str) = True Then '4行目
        MsgBox str & "はDate型です" '5行目
    ElseIf IsDate(str) = False Then '6行目
        MsgBox str & "はDate型ではありません" '7行目
    End If '8行目
End Sub

コードの解説
2行目:strをstring(文字列)型として定義
3行目:変数strは、セルB2の値とする
4行目:もし、strがDate型ならば
5行目:メッセージ「str はDate型です」と表示
6行目:そうでないなら
7行目:メッセージ「str はDate型ではありません」と表示
8行目:ifはここまで(if終了のおまじない)

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

やりたいこと
数値かどうかを調べたい

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

Sub jirei_12()
    Dim var As Variant '2行目
    var = range("B2").value '3行目
    If IsNumeric(var)=true Then '4行目
        range("C2").value = var & "は数値です" '5行目
    Else '6行目
        range("C2").value = var & "は数値ではありません" '7行目
    End If '8行目
End Sub

コードの解説
2行目:varをvariant型の変数として定義
3行目:varはセルB2の値とする
4行目:もしvarが数値なら
5行目:セルC2に var&は数値です と出力
6行目:そうでないなら
7行目:セルC2に var&は数値ではありません と出力
8行目:ifはここまで(if終了のおまじない)

補足
IsNumeric も IsDate と同様に、Boolean型を取ります。

使いどころ
セルに入力されている値が、数値か文字列か、などを判定するときに使うと便利です。

数値として比較したいのに、文字列が入力されていた…
こういう場合は、エラーが出てしまうので、あらかじめIsnumericで判別するのが定石です。

Isnumeric() = false なら、スキップするようにマクロを組んでおくと、エラーを防ぐことができます。

情報を調べたい|instr like not is nothing

セルの中に、"県"が含まれているときだけ、処理をしたい

そんなことってありますよね。ここでは、特定の文字列を検索をする方法(instr like not is nothing)を紹介します。

事例13(if instr)|○○が含まれているなら

やりたいこと
区が含まれているなら

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

Sub if_jirei_13()
    If InStr(Range("B2").Value, "区") > 0 Then '2行目
        Range("C2").Value = "○" '3行目
    Else '4行目
        Range("C2").Value = "×" '5行目
    End If '6行目
End Sub

コードの解説
2行目:セルB2の値に 区 が0より多く含まれているなら(つまり、1つ以上含まれているなら)
3行目:セルC2の値を ○ とする
4行目:そうでないなら(つまり、B2に 区 が含まれていないなら)
5行目:セルC2の値を × とする
6行目:ifはここまで(if終了のおまじない)

補足
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で始まらないときだけ、処理したい

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

Sub if_jirei_14()
    If Not Range("B2").Value Like "[1-3]*" Then '2行目
       Range("C2").Value = "1,2,3から始まらない" '3行目
    Else '4行目
       Range("C2").Value = "1,2,3から始まる" '5行目
    End If '6行目
End Sub

コードの解説
2行目:もし、セルB2の値が 1,2,3から始まらない数字 ではないなら
3行目:セルC2の値に 1,2,3から始まらない と出力
4行目:そうでないなら
5行目:セルC2の値に 1,2,3から始まる と出力
6行目:ifはここまで(if終了のおまじない)

補足
Like “[1-3]*"は 1,2,3のどれかで始まる数字 (何桁でも可) を表します。

123 2345 34567 といった数字は1,2,3から始まるので、該当する
456 5678 678910 といった数字は1,2,3から始まらないので、該当しません

事例15(Not like Or)|県を含まないワイルドカード検索

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

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

Sub if_jirei15()
    Dim i As long '2行目
    For i = 1 to 47 '3行目
        If Not range("B" &i).Value Like "??[県]" or Not range("B" &i).Value Like "???[県]" Then '4行目
            range.("C" & i).value = "" '5行目
        End If '6行目
    Next '7行目
End Sub

コードの解説
2行目:iをlong型の変数として定義
3行目:iを 1,2,3・・・45,46,47 で順番に繰り返す
4行目:もしセルBi(i=1~47)の値が ○○県 ではない もしくは ○○○県 ではない なら
5行目:セルCi(i=1~47)の値は 何もなし(空欄) にする
6行目:ifはここまで(if終了のおまじない)
7行目:3行目へもどる

補足
??[県] ???[県] の?には1文字の文字列が入ります。

県には、広島県のように、2文字入る場合と、和歌山県のように3文字入る場合があります。

ですので、??[県] ???[県]という条件を使っています。

Likeを使ったワイルドカード(?, *, #など)の使いかたを紹介しておきます。

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

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

やりたいこと
Sheet1があるかどうかチェックしたい
Sub if_jirei16()
  Dim obj As Object '2行目
  Set obj = Sheet1 '3行目
  If Not obj Is Nothing Then '4行目
    MsgBox "シート「" & obj.Name & "」はあります" '5行目
  End If '6行目
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を表示して終了

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

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

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

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

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

Sub jirei_17()
    Dim a As Integer '2行目
    a = Range("B2").Value '3行目
        If a < 100 Then '4行目
            GoTo Errseq '5行目
        Else '6行目
            MsgBox "もとのプロシージャです" '7行目
            Exit Sub '8行目
        End If '9行目
Errseq: '10行目
    MsgBox "他のプロシージャです" '11行目
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)|エラーなら次の行へ

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

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

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

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

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

Sub jirei_18()
    Dim a As Integer '2行目
    On Error Resume Next '3行目
    a = "おはようございます" '4行目
    If a = "" Then '5行目
        MsgBox "これはString型なので、本来「型が一致しません」" '6行目
    Else '7行目
        MsgBox "これはInteger型です" '8行目
    End If '9行目
End Sub

コードの解説
2行目:aをInteger型の変数として定義
3行目:エラーが出ても次へ というおまじない
4行目:aに おはようございます
5行目:もしaの値が “” なら(空欄なら)
6行目:メッセージ「これはString型なので、本来「型が一致しません」」と表示
7行目:そうでないなら
8行目:メッセージ「これはInteger型です」と表示
9行目:ifはここまで(if終了のおまじない)

On Error Resume Nextを使えば、エラーをスキップできます。ただ、エラーがなくなるワケではないので、処置方法を探しましょうね。

大量データを処理したい|if elseとfor nextの組み合わせ

ifを使いながら、大量データの処理を行いたいけど、どうやればいいのか?
と感じているあなたへ

IF関数と大量データ処理はfor next構文を組み合わせることで、ifを使いながら大量データを処理できます。以下のコードを参考にしてください。

では、事例を見ていきましょう。

事例19(if else と for next)|データ100コを処理する

まずは、データ数が100で固定されている場合を考えます。

もし、データ数が固定されていない場合は、事例19を参考にしてください。最終行を自動取得する方法を紹介しています。

やりたいこと
セルB1~セルB100のそれぞれの値が80以上であれば、セルC1~セルC100に”合格”
それ以外であれば、セルC1~セルC100に”不合格”

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

Sub jirei_19()
    Dim i as long '2行目
    for i = 1 to 100 '3行目
        if range("B" &i).value => 80 then '4行目
          range("C" &i).value = "合格" '5行目
        else '6行目
          range("C" &i).value = "不合格" '7行目
        endif '8行目
    next '9行目
End Sub

コードの解説
2行目:iをlong型の変数として定義
3行目:iには1から100までを順番に入れ込む(まずは、i=1でスタート)
4行目:もしセルBi(i=1~100)の値が80以上なら
5行目:セルCi(i=1~100)に 合格 を出力
6行目:そうでないなら
7行目:セルCi(i=1~100)に 不合格 を出力
8行目:ifはここまで(if終了のおまじない)
9行目:3行目にもどる(3行目に戻るとiに1加わる、i=100が終わったら、End Subへ)

補足
100 を 200 に変えれば、200行目まで処理してくれます
1 を 2に変えれば、2行目から処理を開始してくれます

このようにfor i = A to B のA(最初)とB(最後)の数字を変えることで、処理する範囲を変えることができます。

それを応用して、次の事例では、B(最後)の数字を自動で決定する方法を紹介します。

事例20(if else と for next)|最終行を取得して処理する

処理したいデータによっては、データ数が固定されておらず、変動するときってありますよね?

この事例では、最終行を読み取って、データ数が変動する場合に対応する方法を紹介します。

やりたいこと
B列の一番下までのそれぞれの値が80以上であれば、C列に”合格”
それ以外であれば、C列に”不合格”

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

Sub jirei_20()
    Dim i,lastrow as long '2行目
    lastrow = Range("B65536").End(xlUp).Row '3行目
        for i = 1 to cmax '4行目
        if range("B" &i).value => 80 then '5行目
          range("C" &i).value = "合格" '6行目
        else '7行目
          range("C" &i).value = "不合格" '8行目
        endif '9行目
    next '10行目
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文を使いこなせることは、とてもとても重要です。ここで紹介している20の事例をマスターすれば、たいていの処理で困ることはないでしょう。

ぜひ見直して、自力で書けるようになってくださいね。

エクセルマクロVBAについて、もっと詳しく知りたいなら

www.fastclassinfo.com

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

www.fastclassinfo.com

エクセルVBAの学習本を探しているなら

www.fastclassinfo.com

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

www.fastclassinfo.com

エクセルマクロVBAの上級スキルを試してみたいなら

outlookを操作して自動メールを送りたい

www.fastclassinfo.com

インターネットから自動で情報を取得したい

www.fastclassinfo.com

エクセルマクロVBAを仕事で使いたいなら

こちらの記事では、月末日の処理を自動化する方法を紹介しています

www.fastclassinfo.com

こちらの記事では、在庫管理の自動化を紹介しています

www.fastclassinfo.com

パソコン仕事を効率化する方法を知りたいなら

www.fastclassinfo.com

エクセルマクロVBAをもう一度勉強したいなら

www.fastclassinfo.com