教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA プログラミング】(条件判断12)入力データを条件判断し結果を表示する方法(Select文とDo~Loop文の組み合わせによる複数判断)

f:id:m_kbou:20200420173750p:plain

入力したデータを条件判断し結果を表示する方法について説明します。今回はSelect文とFor~Next文の組み合わせによる複数判断について説明します。

 

 

例題

<実行>ボタンにVBAマクロが登録されており、ボタンをクリックする事で入力したデータを条件判断して結果を表示します。内容は以下の通りとなります。

[実行前]:

A列に種類が入力されており、B列に金額が入力されている。

f:id:m_kbou:20200316182251p:plain

<判断条件>

・種類(A列セル)に”野菜”が入力されている場合

 ∟金額(B列セル)が30未満の場合、結果(C列セル)に”安い”をセット
 ∟金額(B列セル)が30以上70未満の場合、結果(C列セル)に”普通”をセット
 ∟金額(B列セル)が上記以外の場合、結果(C列セル)に”高い”をセット

・種類(A列セル)に”果物”が入力されている場合

 ∟金額(B列セル)が50未満の場合、結果(C列セル)に”安い”をセット
 ∟金額(B列セル)が50以上80未満の場合、結果(C列セル)に”普通”をセット
 ∟金額(B列セル)が上記以外の場合、結果(C列セル)に”高い”をセット

・種類(A列セル)に”お肉”が入力されている場合

 ∟金額(B列セル)が300未満の場合、結果(C列セル)に”安い”をセット
 ∟金額(B列セル)が300以上500未満の場合、結果(C列セル)に”普通”をセット
 ∟金額(B列セル)が上記以外の場合、結果(C列セル)に”高い”をセット

[実行後]:

判定結果がC列の結果欄に表示される。

f:id:m_kbou:20200316182304p:plain

 

プログラミング

プログラミングは以下の通りとなります。

[記述例]:

Sub サンプル()

  Dim 行 As Double

  行 = 3
  Do Until Trim(Range("A" & 行)) = ""
    Select Case Trim(Range("A" & 行))
      Case "野菜"
        Select Case Trim(Range("B" & 行))
          Case Is < 30
            Range("C" & 行) = "安い"
          Case Is < 70
            Range("C" & 行) = "普通"
          Case Else
            Range("C" & 行) = "高い"
        End Select
      Case "果物"
        Select Case Trim(Range("B" & 行))
          Case Is < 50
            Range("C" & 行) = "安い"
          Case Is < 80
            Range("C" & 行) = "普通"
          Case Else
            Range("C" & 行) = "高い"
        End Select
      Case "お肉"
        Select Case Trim(Range("B" & 行))
          Case Is < 300
            Range("C" & 行) = "安い"
          Case Is < 500
            Range("C" & 行) = "普通"
          Case Else
            Range("C" & 行) = "高い"
        End Select
    End Select
    行 = 行 + 1
  Loop

End Sub

最初に変数:行を指定します。

次に変数:行には初期値として3をセットします。

最後にDo~Loop文を使用して条件判断を行いながら変数:行に数字を1づつ足してループさせます。

ループはA列のセルにデータが入力されていない場合に抜ける事とするため、Trim(Range("A" & 行)) = ""と記述します。Trim関数は文字列前後にスペース文字が入っていた場合に取り除くための指定となります。

このループによりA列に入力されている種類とB列に入力されている金額の2つの条件で判断します。

条件判断にはSelect文を使用します。

---------------------------------

最初にA列セルの種類を判定するため、条件判断セルはTrim(Range("A" & 行))と記述します。種類は”野菜”・”果物”・”お肉”で判断するため、Case "野菜"・Case "果物"・Case "お肉"で各々記述します。

---------------------------------

次にB列セルの金額を判定するため、条件判断セルはTrim(Range("B" & 行))と記述します。種類により金額の判定条件が異なるため、各種類別に金額判定条件を記述します。

-----------------------

種類が”野菜”の場合、金額(B列セル)が”30未満の場合”・”30以上70未満の場合”・それ以外の場合に分ける必要があるため、ここでもSelect文を使用した条件分岐を行います。”30未満の場合”はCase Is < 30、30以上70未満の場合はCase Is < 70、それ以外の場合はCase Elseを記述し、それぞれの結果(C列セル)を表示させる記述をRange("C" & 行) = "安い"・Range("C" & 行) = "普通"・Range("C" & 行) = "高い"とします。

-----------------------

種類が”果物”の場合、金額(B列セル)が”50未満の場合”・”50以上80未満の場合”・それ以外の場合に分ける必要があるため、ここでもSelect文を使用した条件分岐を行います。”50未満の場合”はCase Is < 50、50以上80未満の場合はCase Is < 80、それ以外の場合はCase Elseを記述し、それぞれの結果(C列セル)を表示させる記述をRange("C" & 行) = "安い"・Range("C" & 行) = "普通"・Range("C" & 行) = "高い"とします。

-----------------------

種類が”お肉”の場合、金額(B列セル)が”300未満の場合”・”300以上500未満の場合”・それ以外の場合に分ける必要があるため、ここでもSelect文を使用した条件分岐を行います。”300未満の場合”はCase Is < 300、300以上500未満の場合はCase Is < 500、それ以外の場合はCase Elseを記述し、それぞれの結果(C列セル)を表示させる記述をRange("C" & 行) = "安い"・Range("C" & 行) = "普通"・Range("C" & 行) = "高い"とします。

---------------------------------

上記の記述内容からも既にお気づきだとは思いますが、Select文は上から順番に条件判定を行い、指定した条件に合った場合は記述した処理が実行された後にSelect文を抜ける事になります。

ループ内の処理内容を説明すると、

「まず最初に変数:行に3がセットされているので、A3セルにデータが入力されているか判定します。A3セルにはデータが入力されているため、A3セルの種類及びB3セルの金額で条件判定を行います。A3セルには”野菜”が入力されており、B3セルには100が入力されているため、C3セルへの結果は”高い”をセットします。その後に変数:行に1を足し込みます。この足し込みにより変数:行の値は3+1=4となります。

---------------------------------

次のループでは変数:行に4がセットされているので、A4セルにデータが入力されているか判定します。A4セルにはデータが入力されているため、A4セルの種類及びB4セルの金額で条件判定を行います。A4セルには”果物”が入力されており、B4セルには50が入力されているため、C4セルへの結果は”普通”をセットします。その後に変数:行に1を足し込みます。この足し込みにより変数:行の値は4+1=5となります。

---------------------------------

次のループでは変数:行に5がセットされているので、A5セルにデータが入力されているか判定します。A5セルにはデータが入力されているため、A5セルの種類及びB5セルの金額で条件判定を行います。A5セルには”お肉”が入力されており、B5セルには80が入力されているため、C5セルへの結果は”安い”をセットします。その後に変数:行に1を足し込みます。この足し込みにより変数:行の値は5+1=6となります。

---------------------------------

次のループでは変数:行に6がセットされているので、A6セルにデータが入力されているか判定します。A6セルにはデータが入力されているため、A6セルの種類及びB6セルの金額で条件判定を行います。A6セルには”果物”が入力されており、B6セルには20が入力されているため、C6セルへの結果は”安い”をセットします。その後に変数:行に1を足し込みます。この足し込みにより変数:行の値は6+1=7となります。

---------------------------------

次のループでは変数:行に7がセットされているので、A7セルにデータが入力されているか判定します。A7セルにはデータが入力されているため、A7セルの種類及びB7セルの金額で条件判定を行います。A7セルには”野菜”が入力されており、B7セルには45が入力されているため、C7セルへの結果は”普通”をセットします。その後に変数:行に1を足し込みます。この足し込みにより変数:行の値は7+1=8となります。

---------------------------------

次のループでは変数:行に8がセットされているので、A8セルにデータが入力されているか判定します。A8セルにはデータが入力されているため、A8セルの種類及びB8セルの金額で条件判定を行います。A8セルには”野菜”が入力されており、B8セルには60が入力されているため、C8セルへの結果は”普通”をセットします。その後に変数:行に1を足し込みます。この足し込みにより変数:行の値は8+1=9となります。

---------------------------------

次のループでは変数:行に9がセットされているので、A9セルにデータが入力されているか判定します。A9セルにはデータが入力されていないため、ループを抜ける事になります。

---------------------------------

との意味になります。

f:id:m_kbou:20210426153910p:plain

 

ダウンロード

上記サンプルプログラムを使用したい場合は、こちらからダウンロードして下さい。

drive.google.com

 

関連プログラム

www.osiete-excelvba.work