条件によって処理内容を変更したい!分岐したい!Excelマクロ(VBA)のIf文
[ この記事の内容は Excel2013 でも使えます ]
Excelのマクロ(VBA)で、セルの値に対して、なにかの条件で処理内容を変更させたい場合があります。
例えば、
- セルの値が”Aさん”の場合、隣のセルに○マークを表示する。
- セルの値が”Aさん”でない場合、隣のセルに×マークを表示する。
- セルに値が入っていない場合、隣のセルに”入力されていません!”を表示する。
- セルの値が70以上の場合、隣のセルに”合格です!”を表示する。
など。
そんな時、If文を使うと簡単に処理を分けることができますよ。
この記事では、
- If文の使い方(その1:一番簡単なIf文を使いたい)
- If文の使い方(その2:条件を満たす・満たさないを一つのIf文で書きたい)
- If文の使い方(その3:複数の条件式を組み合わせたい)
- If文の使い方(その4:複数の条件を一つのIf文で書きたい)
を紹介していきます。
目次 [非表示]
If文の使い方(その1:一番簡単なIf文を使いたい)
[書式]
If 条件式 Then
[条件式を満たす場合に実行される内容]
End If
一番基本的な書式ですね。
例えば、「セルA1の値が”Aさん”の場合、隣のセルB1に○マークを表示する」場合、こんな感じになります。
If Cells(1, 1).Value = "Aさん" Then
Cells(1, 2).Value = "○"
End If
If Cells(1, 1).Value = "Aさん" Then
Cells(1, 2).Value = "○"
End If
If Cells(1, 1).Value = "Aさん" Then Cells(1, 2).Value = "○" End If
セルA1の値は Cells(1, 1).Value 、
セルB1の値は Cells(1, 2).Value で取得や設定ができます。
詳しくはこの記事をご覧くださいね。
上の例では Cells(1, 1).Value = “Aさん” の部分が条件式になります。
ここでは、= (イコール) を使って、Cell(1, 1)の値と”Aさん”という文字が同じかを比較しています。
文字を比較する場合、” (半角のダブルクォーテーション)で囲む必要があります。
逆に、「セルの値が”Aさん”でない場合、隣のセルに×マークを表示する」はどうなるでしょうか?
If Cells(1, 1).Value <> "Aさん" Then
Cells(1, 2).Value = "×"
End If
If Cells(1, 1).Value <> "Aさん" Then
Cells(1, 2).Value = "×"
End If
If Cells(1, 1).Value <> "Aさん" Then Cells(1, 2).Value = "×" End If
少し変わりましたね。
条件式が Cells(1, 1).Value <> “Aさん” になってます。
ここで、<> という文字は、同じでない(等しくない)という意味になります。
ちょっとややこしいですが、「セルの値が”Aさん”でない」という条件を満たしてますので、If文の内容が実行されることになります。
= や <> のような文字を 演算子 と呼びます。
他にもいろいろありますので、覚えておくと便利ですよ。
特に、数値や日付を比較する時、以上や未満といった演算子が活躍します。
- = 同じである(等しい)
- <> 同じでない(等しくない)
- <= 以下
- >= 以上
- < より小さい(未満)
- > より大きい
If文の使い方(その2:条件を満たす・満たさないを一つのIf文で書きたい)
先ほどの例で、
- セルの値が”Aさん”の場合、隣のセルに○マークを表示する。
- セルの値が”Aさん”でない場合、隣のセルに×マークを表示する。
の両方を書きたい場合はどうなるでしょうか?
その1で使ったIf文を単純にくっつけると、こうなります。
If Cells(1, 1).Value = "Aさん" Then
Cells(1, 2).Value = "○"
End If
If Cells(1, 1).Value <> "Aさん" Then
Cells(1, 2).Value = "×"
End If
If Cells(1, 1).Value = "Aさん" Then
Cells(1, 2).Value = "○"
End If
If Cells(1, 1).Value <> "Aさん" Then
Cells(1, 2).Value = "×"
End If
If Cells(1, 1).Value = "Aさん" Then Cells(1, 2).Value = "○" End If If Cells(1, 1).Value <> "Aさん" Then Cells(1, 2).Value = "×" End If
これでも問題ないのですが、ちょっと面倒ですね。
そんな時は、Else を使うとすっきりと書けます。
[書式]
If 条件式 Then
[条件式を満たす場合に実行される内容]
Else
[条件式を満たさない場合に実行される内容]
End If
書き換えるとこんな感じになります。
途中の2行をElseに置き変えただけですね。
If Cells(1, 1).Value = "Aさん" Then
Cells(1, 2).Value = "○"
Else
Cells(1, 2).Value = "×"
End If
If Cells(1, 1).Value = "Aさん" Then
Cells(1, 2).Value = "○"
Else
Cells(1, 2).Value = "×"
End If
If Cells(1, 1).Value = "Aさん" Then Cells(1, 2).Value = "○" Else Cells(1, 2).Value = "×" End If
この方法を使えば、条件文を一つだけ書けば良くなります。
条件文を変更する場合にも一か所だけで良いので楽ですね。
If文の使い方(その3:複数の条件式を組み合わせたい)
「If文の使い方その1」では、セルA1の値が”Aさん”の場合、という単純な例を使いました。
もう少し複雑な条件の場合、どうしたら良いでしょうか?
例えば、
- セルA1の値が”Aさん”、かつ、セルB1の値が 80以上 の場合。
- セルA1の値が”Aさん”、または、”Bさん”の場合。
など。
そんな時は、複数の条件式を書くことで対応できます。
先ほどの例の場合、それぞれこのように書きます。
If Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 Then
If Cells(1, 1).Value = "Aさん" Or Cells(1, 1).Value = "Bさん" Then
If Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 Then
If Cells(1, 1).Value = "Aさん" Or Cells(1, 1).Value = "Bさん" Then
If Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 Then If Cells(1, 1).Value = "Aさん" Or Cells(1, 1).Value = "Bさん" Then
一つ一つの条件式を And や Or という文字でつないでいますね。
これを論理演算子と呼びます。
両方の条件を満たす場合は And、いずれかの条件を満たす場合は Or を使います。
(実はもう一つ、Not もあります。Not 以降の結果を反対にするものですが、若干わかりにくいのでここでは使いません)
ちなみに、条件式は2つ以上つなげることもできますよ。
例えば、
- セルA1の値が”Aさん”、かつ、セルB1の値が 80以上
または、
セルA2の値が”Bさん”、かつ、セルB2の値が 90以上
の場合はこんな感じです。
If ( Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 ) Or ( Cells(2, 1).Value = "Bさん" And Cells(2, 2).Value >= 90 ) Then
If ( Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 ) Or ( Cells(2, 1).Value = "Bさん" And Cells(2, 2).Value >= 90 ) Then
If ( Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 ) Or ( Cells(2, 1).Value = "Bさん" And Cells(2, 2).Value >= 90 ) Then
ちょっと見づらいですが、分割してみると良くわかります。
( Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 )
Or
( Cells(2, 1).Value = "Bさん" And Cells(2, 2).Value >= 90 )
( Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 )
Or
( Cells(2, 1).Value = "Bさん" And Cells(2, 2).Value >= 90 )
( Cells(1, 1).Value = "Aさん" And Cells(1, 2).Value >= 80 ) Or ( Cells(2, 1).Value = "Bさん" And Cells(2, 2).Value >= 90 )
よく見ると、それぞれの条件文をカッコで囲んでいますね。
実は、「Andの方がOrより先に実行される」という優先順位があるんですが、カッコで囲んでいる場合は、更に優先して実行されます。
条件式が長くなってくると、自分が意図しない順番でAndとOrが解釈される場合があります。
これを防ぐため、カッコで囲んでおくと間違いがありません。
カッコで囲んだ方が単純に見やすい、という効果もあるので、囲むことをおすすめします。
If文の使い方(その4:複数の条件を一つのIf文で書きたい)
最後の使い方です。
「If文の使い方その2」では、条件を満たす場合と満たさない場合を一つのIf文で書きました。
それでは、こんな条件の場合はどう表現できるでしょうか?
- セルA1の値が 100 の場合、隣のセルB1に”満点”を表示する。
- セルA1の値が 60以上、100未満 の場合、隣のセルB1に”よくがんばりました”を表示する。
- セルA1の値が 30以上、60未満 の場合、隣のセルB1に”良い感じですね”を表示する。
- セルA1の値が 0以上、30未満 の場合、隣のセルB1に”もっとがんばりましょう”を表示する。
とりあえずIf文を4つ使えばできそうですが、面倒ですね。
そんな時は、ElseIf を使うと複数の条件をくっつけることができます。
こんな感じになります。
If Cells(1, 1).Value = 100 Then
Cells(1, 2).Value = "満点"
ElseIf Cells(1, 1).Value >= 60 And Cells(1, 1).Value < 100 Then
Cells(1, 2).Value = "よくがんばりました"
ElseIf Cells(1, 1).Value >= 30 And Cells(1, 1).Value < 60 Then
Cells(1, 2).Value = "良い感じですね"
ElseIf Cells(1, 1).Value >= 0 And Cells(1, 1).Value < 30 Then
Cells(1, 2).Value = "もっとがんばりましょう"
Else
Cells(1, 2).Value = "0~100以外の値でした"
End If
If Cells(1, 1).Value = 100 Then
Cells(1, 2).Value = "満点"
ElseIf Cells(1, 1).Value >= 60 And Cells(1, 1).Value < 100 Then
Cells(1, 2).Value = "よくがんばりました"
ElseIf Cells(1, 1).Value >= 30 And Cells(1, 1).Value < 60 Then
Cells(1, 2).Value = "良い感じですね"
ElseIf Cells(1, 1).Value >= 0 And Cells(1, 1).Value < 30 Then
Cells(1, 2).Value = "もっとがんばりましょう"
Else
Cells(1, 2).Value = "0~100以外の値でした"
End If
If Cells(1, 1).Value = 100 Then Cells(1, 2).Value = "満点" ElseIf Cells(1, 1).Value >= 60 And Cells(1, 1).Value < 100 Then Cells(1, 2).Value = "よくがんばりました" ElseIf Cells(1, 1).Value >= 30 And Cells(1, 1).Value < 60 Then Cells(1, 2).Value = "良い感じですね" ElseIf Cells(1, 1).Value >= 0 And Cells(1, 1).Value < 30 Then Cells(1, 2).Value = "もっとがんばりましょう" Else Cells(1, 2).Value = "0~100以外の値でした" End If
If文を複数使うよりもわかりやすくなりました。
よく見ると、一番最後に Else がありますね。
ここは、「Elseより上の条件」のどこにも一致しなかった場合、を意味します。
例えば、500や-10を入力すると、 “0~100以外の値でした”と表示されます。
これを付けておくと、条件の漏れを防ぐことができますよ。
まとめ
いかがでしたでしょうか?
If文を使うと、条件が複雑で、複数個あった場合でも、簡単で見やすく書くことができます。
一度、お試しくださいね。
コメント
トラックバックは利用できません。
コメント (13)
知りたかった事が分かりました
とても分かりやすい表記で助かりました
ありがとうございます
まめるびさん、コメントありがとうございます。
良かったです!
お分かりになれば教えてください。A列に5%、8%の消費税額が表示されています。C列に税抜の金額が表示されています。D列にA列の消費税を表示させて、E列に税込の金額を表示させたいのですがどのようなマクロを組めばよいでしょうか?お手数をお掛けいたしますが、宜しくお願い致します。
MIZUMIZUさん、コメントありがとうございます。
まず、セルの値は「Cells関数のValueプロパティ」で取得できます。
https://amaotolog.com/excel/45
この関数で「C列の値」を取得し、消費税率を乗算すれば、消費税額が計算できます。
更に、税抜の金額を足せば、税込の金額になりますね。
たくさんの商品名がありそうなので、「For~Next」を使うと良いです。
https://amaotolog.com/excel/46
の記事をご参考にしてくださいね。
「商品の行数」はプログラムの中に書いてしまうか、どこかのセルに入力しておくのが簡単ですよ。
だーしゅさん ご連絡ありがとうございます。こちらで試してみます。また解らないときはご連絡いたします。お手数をお掛けいたします。
だーしゅさん、こんにちは
現在、手作業でExcel作表しているものを少しでも自動化したいと考えています。但し、VBAやマクロは初心者のため、だーしゅさんに是非アドバイスやお力添えをいただければと思います。
L列:開始年月日(原則、当該月の1日)、M列:終了年月日(原則、開始年月日より2年後の月末)、O列~:L列の開始年度及び1~12月の各列があります。L及びM列は、更新されます。 全体件数としては、250件程度。
L列の開始月をキーにO列以降の3か月ごとに黒丸の記号を入力したい。但し、初回の月は、白丸の記号。たとえば、開始年月日が2018/6/1ならばO列には2018年度の6月列に白丸の記号がつき、9月列及び12月列、翌年の2019年度3月に黒丸記号のように、それがM列の終了年月日まで表示したい。
何か良い案があったらご教示ください。よろしくお願いします。
kongaragattaさん、コメントありがとうございます。
いろんな方法があると思いますが、思いついた案を書いておきますね。
・DATEDIF関数で開始年月日と終了年月日の月数を取得
・O列を起点とし、年月を固定的に設定
・FOR文で「月数」の数分、セルを右方向に移動
→開始日と同じ年月の場合、●を表示
→IF文で一つ目と判断した場合、〇を表示
→3ヵ月単位はMOD関数で判定
いろいろお試しくださいね。
だーしゅさん、案をありがとうございます。
なるほど!月数を取得するやり方は考えていませんでした。やはり自分だとスキルに限界があるのでどうも柔軟に考えにくいですね。
ひとつ質問ですが、「O列を起点とし、年月を固定的に設定」の”固定的に設定”とはどのように設定するということでしょうか?
言葉が良く無かったですね。
「O列がFOR文の最初の位置になる」のような意味でした。
実現するにはいろんな方法があると思います。ご参考まで。
だーしゅさん、ご返事ありがとうございます。
まずは、だーしゅさん案で自分なりにできるかどうかトライしてみます。
だーしゅさん、初めまして。VBA初心者です。
IF文のことで教えて頂きたいのです。
表計算で下記の様なコードを作りましたが、うまくいきません、どこが悪いのか教えて下さい。
シート2枚を使って計算をする。
inputoシート セルc5が空欄の時は、シート11の最終行のセルの値ーinputoシートセルc9の値を、inputoシートセルc10に入力
inputoシート セルc5に値が入っていると場合は
inputoシート セルc9の値+11シートの最終行のセルの値をinputoシートセルc10に入力
if worksheets(“inputo”).Range(“c5”).value=””then
worksheets(“inputo”).Range(“c10”).value=worksheets(“11”).(Rows.cout,9)-worksheets(“inputo”).Range(“c9”)
End if
takaさん、コメントありがとうございます。
・「inputoシート セルc5に値が入っていると場合は」の部分がコーディングされていないようです。「Else」を使って分岐するのが良いですね。
・VBAの書式が間違ってるかも知れませんので、以下のサイトなどを参考に確認してみてくださいね。
VBAで最終行を取得するには?|End(xlUp)、SpecialCells(xlLastCell) – 侍エンジニアブログ
最終行の取得(End,Rows.Count)|VBA入門
返信ありがとうございます、お礼遅くなり、すみません。
もっと勉強します。