VBAを使った回数のカウント方法の演習

へびせんせい

簡単な入荷出荷リストを作って、データのカウント方法について考えてみます。
下の画像のようなリストをある条件を満たしながら、手入力で表を埋めていくこととします。
その際に、条件を満たさないときには警告がでるように設計しなさい。

演習問題・入荷出荷リストの手入力での作成

入荷出荷リストの画像
入荷出荷リストの作成条件
  • 商品リストの5つの商品を、1日につき、3つ入荷し、1つ出荷するものとする
  • 1日めは、すでに決められており、「りんご、みかん、ばなな」が入荷され、出荷はないこととする
  • 2日めの入荷、出荷、次に、3日めの入荷、出荷・・・の順に5つの商品のいづれかを手入力する
  • 入荷・出荷に商品を入力する際には下記の条件に従う
  • もし条件を満足しない商品を入力したときには、警告が出るように設計する
このExcelファイルを使って、演習をすすめなさい

・条件を満足しないときは警告が出るように設計すること
・sheet1のボタンを押すと、シートの入力をリセットできます

Download

入荷の条件

1つ商品が入荷されれば、1カウントされてストックされるものとする
入荷は5つの商品から任意に選択できるが、できる限り均等に(数の差が1以下)なるように入荷する


・2日めに「すいか、いちご、りんご」を入荷
→ストックは、りんご2、みかん1、ばなな1、すいか1、いちご1となる(OK

・2日めに「すいか、りんご、みかん」を入荷
→ストックは、りんご2、みかん2、ばなな1、すいか1、いちご0となる(NG

出荷の条件

1つ商品が出荷されれば、ストックから-1カウントされるものとする
出荷はストックの中から任意に選択できるが、できる限り均等に(数の差が1以下)なるように出荷する


・2日めに「すいか、いちご、りんご」を入荷、「りんご」を出荷
→ストックは、りんご1、みかん1、ばなな1、すいか1、いちご1となる(OK

・2日めに「すいか、いちご、りんご」を入荷、「みかん」を出荷
→ストックは、りんご2、みかん0、ばなな1、すいか1、いちご1となる(NG

警告の表示方法

入荷出荷リストに商品を入力したときに、条件判定を行い、条件を満たしていないときは警告を出すように設計する

つまり、この演習では、sheet1のイベントプロシージャー(Worksheet_Change)を作成することになる

警告にはMsgBoxを用いる

警告を出すには様々な方法が考えられるが、ここでは、MsgBoxを出すこととする。
商品リストのセルに入力したときに、条件を満たさない場合、MsgBoxを表示させる。

表示内容は

「りんご×、みかん×、ばなな×、すいか×、いちご×となり、○は入荷(出荷)できません」

*表記の中の○と×には、実際のデータが代入されること

無限ループに注意

Worksheet_Changeイベントは、セルが変更されたときに動作する。
このイベントには、気をつけなければならない点があり、このイベント内でセルを変更すると、それをトリガーにして同イベントが動作してしまう。
そして、またWorksheet_Changeが動作し、再びセルが変更され、またWorksheet_Changeが動作し・・・
という具合に、プログラムが止まらなくなってしまう。

そこで、

Application.EnableEvents = False

'セルを変更する処理

Application.EnableEvents = True

と、することで、セルの変更のときには、このイベントを動作させないようにすることができる。

さらに追加の条件

可能なら、次の条件も考慮せよ。

  1. Worksheet_Changeプロシージャーはシート内のすべてのセルに対して動作するため
  2. 入荷出荷リストの中のセルを変えたときだけ、条件判定が行われるようにしなさい
  3. 商品リスト以外の商品が入力されたとき
  4. MsgBoxを表示し、商品リストの中の商品を入力するよう警告をだしなさい
  5. 10日めの出荷を入力して、条件を満足するとき
  6. MsgBoxを表示し、最終的なストックを出力しなさい