Excel(エクセル)の操作が楽になる方法と便利な使い方を紹介しています。


menu

Excel(エクセル)が楽で便利になる方法

条件によって処理内容を変更したい!分岐したい!Excelマクロ(VBA)のIf文

[ この記事の内容は Excel2013 でも使えます ]  
Excelのマクロ(VBA)で、セルの値に対して、なにかの条件で処理内容を変更させたい場合があります。
 
例えば、
  • セルの値が”Aさん”の場合、隣のセルに○マークを表示する。
  • セルの値が”Aさん”でない場合、隣のセルに×マークを表示する。
  • セルに値が入っていない場合、隣のセルに”入力されていません!”を表示する。
  • セルの値が70以上の場合、隣のセルに”合格です!”を表示する。
など。
 
そんな時、If文を使うと簡単に処理を分けることができますよ。
 
 
この記事では、
  1. If文の使い方(その1:一番簡単なIf文を使いたい)
  2. If文の使い方(その2:条件を満たす・満たさないを一つのIf文で書きたい)
  3. If文の使い方(その3:複数の条件式を組み合わせたい)
  4. 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
 
セル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
 
少し変わりましたね。
条件式が 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
 
これでも問題ないのですが、ちょっと面倒ですね。
 
そんな時は、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文の使い方(その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
 
 
一つ一つの条件式を 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
 
 
ちょっと見づらいですが、分割してみると良くわかります。
 
( 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文を複数使うよりもわかりやすくなりました。
 
 
 
よく見ると、一番最後に Else がありますね。
 
ここは、「Elseより上の条件」のどこにも一致しなかった場合、を意味します。
例えば、500や-10を入力すると、 “0~100以外の値でした”と表示されます。
 
これを付けておくと、条件の漏れを防ぐことができますよ。
 
 

まとめ

いかがでしたでしょうか?
 
If文を使うと、条件が複雑で、複数個あった場合でも、簡単で見やすく書くことができます。
 
 
一度、お試しくださいね。
 

スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (10)

    • まめるび
    • 2018年 4月 19日

    知りたかった事が分かりました
    とても分かりやすい表記で助かりました
    ありがとうございます

      • だーしゅ
      • 2018年 4月 19日

      まめるびさん、コメントありがとうございます。

      良かったです!

    • MIZUMIZU
    • 2018年 5月 24日

    お分かりになれば教えてください。A列に5%、8%の消費税額が表示されています。C列に税抜の金額が表示されています。D列にA列の消費税を表示させて、E列に税込の金額を表示させたいのですがどのようなマクロを組めばよいでしょうか?お手数をお掛けいたしますが、宜しくお願い致します。

      • だーしゅ
      • 2018年 5月 27日

      MIZUMIZUさん、コメントありがとうございます。

      まず、セルの値は「Cells関数のValueプロパティ」で取得できます。
      https://amaotolog.com/excel/45

      この関数で「C列の値」を取得し、消費税率を乗算すれば、消費税額が計算できます。
      更に、税抜の金額を足せば、税込の金額になりますね。

      たくさんの商品名がありそうなので、「For~Next」を使うと良いです。
      https://amaotolog.com/excel/46
      の記事をご参考にしてくださいね。

      「商品の行数」はプログラムの中に書いてしまうか、どこかのセルに入力しておくのが簡単ですよ。

        • MIZUMIZU
        • 2018年 6月 04日

        だーしゅさん ご連絡ありがとうございます。こちらで試してみます。また解らないときはご連絡いたします。お手数をお掛けいたします。

    • kongaragatta
    • 2018年 6月 28日

    だーしゅさん、こんにちは

    現在、手作業で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列の終了年月日まで表示したい。

    何か良い案があったらご教示ください。よろしくお願いします。

      • だーしゅ
      • 2018年 6月 28日

      kongaragattaさん、コメントありがとうございます。

      いろんな方法があると思いますが、思いついた案を書いておきますね。
      ・DATEDIF関数で開始年月日と終了年月日の月数を取得
      ・O列を起点とし、年月を固定的に設定
      ・FOR文で「月数」の数分、セルを右方向に移動
       →開始日と同じ年月の場合、●を表示
       →IF文で一つ目と判断した場合、〇を表示
       →3ヵ月単位はMOD関数で判定

      いろいろお試しくださいね。

        • kongaragatta
        • 2018年 6月 29日

        だーしゅさん、案をありがとうございます。
        なるほど!月数を取得するやり方は考えていませんでした。やはり自分だとスキルに限界があるのでどうも柔軟に考えにくいですね。
        ひとつ質問ですが、「O列を起点とし、年月を固定的に設定」の”固定的に設定”とはどのように設定するということでしょうか?

          • だーしゅ
          • 2018年 6月 29日

          言葉が良く無かったですね。
          「O列がFOR文の最初の位置になる」のような意味でした。
          実現するにはいろんな方法があると思います。ご参考まで。

            • kongaragatta
            • 2018年 7月 03日

            だーしゅさん、ご返事ありがとうございます。
            まずは、だーしゅさん案で自分なりにできるかどうかトライしてみます。

だーしゅ
IT関係のお仕事してます。
Excel大好き。

[当ブログについて]

最近のコメント

  • kongaragatta { だーしゅさん、ご返事ありがとうございます。 まずは、だーしゅさん案で自分なりにできるかどうかトライしてみます。 } – 7月 03, 6:35 AM
  • だーしゅ { 言葉が良く無かったですね。 「O列がFOR文の最初の位置になる」のような意味でした。 実現するにはいろんな方法があると思います。ご参考まで。 } – 6月 29, 5:37 PM
  • kongaragatta { だーしゅさん、案をありがとうございます。 なるほど!月数を取得するやり方は考えていませんでした。やはり自分だとスキルに限界があるのでどうも柔軟に考えにくいですね。 ひとつ質問ですが、「O列を起点とし、年月を固定的に設定」の”固定的に設定”とはどのように設定するということでしょうか? } – 6月 29, 8:04 AM
  • だーしゅ { kongaragattaさん、コメントありがとうございます。 いろんな方法があると思いますが、思いついた案を書いておきますね。 ・DATEDIF関数で開始年月日と終了年月日の月数を取得 ・O列を起点とし、年月を固定的に設定 ・FOR文で「月数」の数分、セルを右方向に移動 →開始日と同じ年月の場合、●を表示 →IF文で一つ目と判断した場合、〇を表示 →3ヵ月単位はMOD関数で判定 いろいろお試しくださいね。 } – 6月 28, 4:59 PM
  • kongaragatta { だーしゅさん、こんにちは 現在、手作業で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列の終了年月日まで表示したい。 何か良い案があったらご教示ください。よろしくお願いします。 } – 6月 28, 6:11 AM
  • MIZUMIZU { だーしゅさん ご連絡ありがとうございます。こちらで試してみます。また解らないときはご連絡いたします。お手数をお掛けいたします。 } – 6月 04, 2:23 AM