小学校でプログラミング教育が必修化となり、注目を集めていますが、下記のような悩みを抱えている方いませんか?
・そもそもプログラミングって何?
・どうやって学んでいけばいいの?
・社会で通用するプログラミングスキルとは?
このようなお悩みを解決するために、身の回りの自動化を題材に楽しく学んでいきましょう。
今回は、「信号機プログラム」を題材に取り上げます。
第1回~第2回までの内容はこちらに掲載しています。
事前に見ていただくことをお勧めします。
第3回目は、自動で信号の色を青→黄→赤と変える方法をご紹介します。
1. プログラム(VBA)を開く
第1回~第2回で作成したファイルを開き、下記の手順でプログラム(VBA)を開きます。
※プログラム(VBA)が含まれるファイルを開くと、「セキュリティの警告」が表示されることがあります。表示されない方は、そのまま次の手順に進んでください。
2. フローチャートの作成
いきなりプログラミングするのではなく、まずは、どのようなプログラムを作りたいのかをわかりやすくするためにフローチャートを書きましょう。
例えば、青信号を3秒点灯→黄信号を1秒点灯→赤信号を2秒点灯の場合、下記のように表現できます。
3. 青・黄・赤を点灯させるプログラムの作成
第2回で信号を点灯させるプログラムは学びました。このプログラムをフローチャートと合わせると、下記になります。
前回作成したプログラムを複製(コピー&貼り付け)し、点灯させたい色を「True」にします。
4. 指定した時間待機(停止)させるプログラムの作成
プログラムは上から下へと高速で処理します。そのため、このままでは、青の点灯と黄の点灯が目では見えず、すぐに赤の点灯になってしまいます。よって、各色の信号を点灯させた後は、指定した時間待機させる必要があります。
そのため、Application.Wait メソッドを使用します。
サンプルコード
Application.Wait [Now()] + 1000 / 86400000
現段階ではあまり難しく考えず、「1000」が待機する時間だと思ってください。
単位はミリ秒ですので、1000ミリ秒は1秒を表しています。
サンプルコードを使用し、下記のプログラムを作成します。
4. 動作確認
それでは、下記の手順で作成したプログラムを動かし(実行し)、思っている動作になっているかを確認します。
いかがでしょうか?
「あれっ!?意図した時間点灯していない?」
おそらく、自動で青→黄→赤と切り替わってはいますが、指定した時間で切り替わっていないと思います。
これは、ActiveSheet.Shapes("").Visibleによって、画像の表示/非表示を切り替えようとしている間に、Application.Wait メソッドによって、プログラムを待機(停止)させられてしまうため、切り替えがうまくできていません。
5. フローチャートの修正
プログラムを待機させる命令は、Application.Wait メソッド以外にWindows APIのSleep関数というものもあります。しかし、こちらを使ってもうまくできません。
そのため、初めに考えたフローチャートを見直す必要があります。
「どのように見直すのか?」
ここから少し難しくなるため、アニメーション動画をご用意しました。
これをフローチャートにすると、下記のようになります。
一見、難しそうに見えるかもしれませんが、順番に解説していきます。
6. 繰り返し実行するループ処理の作成
Do While ~ Loop ステートメントを使用します。
サンプルコード
Do While True
DoEvents
Loop
Do While TrueとLoopの間にあるプログラムがリセット(停止)されるまで、繰り返し実行されます。
サンプルコードを使用し、下記のプログラムを作成します。
7. 複数の条件分岐の作成
条件が3つ以上(信号の色が、「青」、「黄」、「赤」)の場合は、Select Case ステートメントを使用します。
サンプルコード
Select Case color
Case 0
Case 1
Case 2
End Select
「color」は信号の色が何色かを表すための名前(変数)です。
この変数は、数値(0,1,2,・・・)になるため、青が0、黄が1、赤が2と定義します。
そして、プログラム内で変数を使用するためには、始めに名前の定義をしておく必要があります。
サンプルコード
Dim color As Integer
次に、一番始めの色が何色か(例:信号の色を青)を指示(命令)する必要があります。
サンプルコード
color = 0
サンプルコードを使用し、下記のプログラムを作成します。
8. 青・黄・赤を点灯させるプログラムを移動
手順3で作成したプログラムを条件の合う場所に移動させます。
そして、使用できなかったApplication.Wait メソッドは削除します。
9. 経過時間で条件分岐するプログラムの作成
9.1. 経過時間を計算
経過時間を調べるために、Timer 関数を使用します。
Timer 関数は、0 時からの経過時間を秒数で返します。
「タイマー開始」実行時の経過時間をstart_timeという変数にセット(格納)します。
こちらも変数のため、始めに変数の定義が必要になります。
サンプルコード
Dim start_time As Single
start_time = Timer
「3秒経過?」実行時の経過時間から、「タイマー開始」実行時の経過時間を引くことで、青信号を点灯している時間を監視することができます。
サンプルコード
Timer - start_time
9.2. はい/いいえの条件分岐の作成
条件を満たすか満たさないかの2つの条件分岐は、If 関数を使用します。
ここでは、先ほど計算したTimer - start_timeが指定した時間(例:3秒)以上か未満かを判断します。
サンプルコード
If Timer - start_time >= 3 Then
color = 1
Else
End If
条件を満たすときは、次の信号の色を変えるために、colorの値を変更します。
サンプルコードを使用し、下記のプログラムを作成します。
10. タイマーの再起動のプログラムの作成
イメージは、ストップウォッチのリセット→開始です。
信号の色を変える指示(命令)を出した時間(0 時からの経過時間)をstart_timeにセット(格納)し直します。
サンプルコード
start_time = Timer
サンプルコードを使用し、下記のプログラムを作成します。
少し長くなってしまいましたが、以上でプログラムは完成です。
11. 動作確認
それでは、下記の手順で作成したプログラムを動かし(実行し)、思っている動作になっているかを確認します。
手順6でループ処理を追加したため、リセット(停止)するまで、実行されます。
点灯時間を変更して、オリジナルの信号機にしてみましょう。
以上で第3回目の内容は終了です。
【ポイント】
- プログラミングの前に、フローチャートを書いて、わかりやすくする
- プログラムを待機させるには、Application.Wait メソッドを使用する
※ただし、意図した動作にならないこともある - 繰り返し処理は、Do While ~ Loop ステートメントを使用する
- 複数の条件分岐は、Select Case ステートメントを使用する
- 経過時間を調べるためには、Timer 関数を使用する
- 条件を満たすか満たさないかの2つの条件分岐は、If 関数を使用する
次回は、Excel画面からプログラムを開始/停止できるようにします。