Excelのマクロを使って、一時停止機能付きのシンプルなタイマーを考えてみましたので、作成過程を記事にしておきます。
作ったもののどんなタイミングで使うのか自分でもよくわかっていません。
Excelマクロで作る一時停止機能付きカウントダウンタイマー
今回作成したのは秒単位でカウントダウンを行うタイマーです。
計測する時間を秒単位で指定するとマクロが実行されカウントダウンが始まり、カウントダウンが終了するとメッセージが表示されるシンプルなものです。
動作の感じは動画で確認していただければわかりやすいかと思います。
で、肝心のマクロはこんな感じで作ってみました↓
Option Explicit
'■変数宣言
Dim set_time As Date
Dim goal_time As Long
Dim pause_time As Long
Dim flag As Boolean
Sub count_down()
'■「開始」ボタンを押した時に実行するマクロ
'■インプットボックスに入力した秒数でタイマーを実行する
Dim counter As Long
counter = Application.InputBox("計測する時間を入力",Default:=5, Type:=1)
'■dateadd関数で現在時刻にインプットボックスで入力した秒数を足して計測時間を設定する
set_time = DateAdd("s", counter, Time())
'■一時停止のフラグをfalseに変更する
flag = False
'■処理実行部分(カウントダウンの実施)
Do
DoEvents 'マクロ実行中に他の処理を実行できるようにする
If flag = True Then Exit Do
'■datediff関数で現在時刻と設定したカウントダウン時刻の差を調べる(残りの秒数)
goal_time = DateDiff("s", Time(), set_time)
Range("b1").Value = goal_time
If goal_time <= 0 Then Exit Do
Loop
If flag = True Then
MsgBox "中断します"
Else
MsgBox "time up!!!"
End If
End Sub
Sub pause()
'■「一時停止」ボタンが押された際のマクロ
'■フラグをtrueにして残りの秒数を変数「pause_time」に格納する
flag = True
pause_time = Range("b1").Value
End Sub
Sub re_count_down()
'■「再スタート」ボタンが押された際のマクロ
'■dateadd関数で現在時刻に変数pause_timeに格納した秒数を足して計測時間を設定する
set_time = DateAdd("s", pause_time, Time())
'■一時停止のフラグをfalseに変更する
flag = False
'■処理実行部分(カウントダウンの再実施)
Do
DoEvents
If flag = True Then Exit Do
goal_time = DateDiff("s", Time(), set_time)
Range("b1").Value = goal_time
If goal_time <= 0 Then Exit Do
Loop
If flag = True Then
MsgBox "再度中断します"
Else
MsgBox "再開後のtime up!!!"
End If
End Sub
今回のマクロですが3つのブロック(プロシージャ?)で構成されています。ハイライト表示している箇所がそれぞれのマクロの分かれ目になります。
それぞれのボタン(開始ボタン、一時停止ボタン、再スタートボタン)を押した際に実行されるマクロを割り当てていますので少し長く感じますが一つ一つのマクロは長くないです。
今回のマクロにおけるポイントは
- 変数宣言をする場所とデータ型
- inputbox
- dateadd関数
- datediff関数
- doevents関数
こんなところです。
変数宣言をする場所と変数のデータの型について
今回はいつものマクロと変数を宣言する「場所」が違います。
いつもならSub~end Subの内側で変数宣言をするのですが、今回はSubの外側で変数宣言をしています。
こうすることで他の3つのプロシージャ(今回の場合には「count_down」「pause」「re_count_down」)でも同じ変数を使うことができるようになります。
あと、変数宣言をする際のデータ型ですが、日付のデータを扱うために変数「set_time」の型として「date型」を使用しており、カウントダウンの処理を一時停止させるための目印として変数「flag」に「boolean型」を使用しています。
ボタンとマクロの対応関係について
今回はボタンを3つ設置しており、それぞれに実行するマクロが異なりますので対応関係を図で示しておきます。
一つ目がこちら
2つめがこちら↓
3つ目がこちら↓
ボタンとそれに対応するマクロのコードの対応関係は以上です。
inputboxメソッドで何秒間カウントダウンするか時間を入力させる
「開始ボタン」を押すとインプットボックスを表示させて実際に何秒間カウントダウンを実行するかをユーザーに入力させるようにしています。この部分です↓
ここで入力されたデータを変数「counter」へ格納させます。
ちなみにinputboxとはこんなやつです↓
今回はinputboxの引数にdefaultとtypeという引数を設定しています。
引数「default」を設定することでおあらかじめインプットボックスに表示されるデータを指定できます。
今回は デフォルトで5(秒間という意味)と表示されるように指定しています。
また、引数「type」を設定することでインプットボックスが返すデータの型を指定することができます。今回は「2」と指定することで「数値」としてデータを返すように指定しています。
これによってインプットボックスが表示されると入力する箇所に最初から「5」と表示され、かつ数字以外のデータが入力されるとエラーメッセージが表示されるようにしてあります。
例えば数字以外の文字を入力してOKボタンをクリックすると
こんな感じでエラーになります。
ここで入力した数値を次のdateadd関数へ渡していきます。
dateadd関数を使ってカウントダウンする時間を設定する
dateadd関数を使ってインプットボックスで入力したカウントダウンする「秒数」だけ現在時刻より先(未来)の時間を取得します。
この部分です↓
こうすることで、さきほどインプットボックスで入力し、変数「counter」に格納させた時間だけをtime()で取得した現在時刻に足すことができます。
このデータを変数「set_time」に格納します。
datediff関数を使って、設定した時間と現在時刻の差を把握する
次にdatediff関数を使って上で作業した変数「set_time」に格納した「現在時刻+何秒か」と「現在時刻」との時間の間隔(差)がどれくらいあるかを取得していきます。
この部分です↓
取得させた時間の差は変数「goal_time」に格納し、その格納した値をセルB1に記載するようにしています。
ここまでが一連の作業になります。
あとはこの作業をDo~Loopステートメントを使って変数「goal_time」に格納される値が0以下になるまで、すなわち時間の差が0になるまで繰り返し実行しています。
こうすることでカウントダウンタイマーが動いているように表現することができます。
マクロの実行中に他の作業をできるようにするためにdoeventsを記載しておく
今回一時停止機能をつけたかったので「一時停止」ボタンを作成しています。
この一時停止ボタンは当然カウントダウンのマクロが実行されている時に押す必要があります。
通常マクロが実行されると処理が終了するまでは他の作業ができないです。
今回でいうとカウントダウン実行中にはこの「一時停止」ボタンを押すことができません。
そこでマクロが実行されている時でも「一時停止」ボタンを押すことができるようにするために「DoEvents」というコードを記載する必要があります。
この部分です↓
この一文を書くことで「count_down」というマクロが実行中でも「一時停止」ボタンを押すことができるようになります。
一時停止ボタンをクリックしたら変数flagにtrueを格納する
一時停止ボタンを押した際のマクロについて簡単に説明します。この部分です↓
このマクロに関してはシンプルで変数「flag」にtrueを格納します。
これをすることによって下記のマクロ「count_down」の動作が変化します。
変数「flag」がtrueになることで、Do~Loopから抜け、メッセージが表示されるようになります。
それと同時に変数「pause_time」に対して残り時間であるB1セルに表示されている数字を格納します。
再スタートボタンを押すと実行されるマクロでこの変数「pause_time」をつかっていくことになります。
まとめ
Excelマクロを使ってカウントダウンタイマーを作成しました。
記事冒頭でも書きましたが、作ってみたもののどんな場面で使うのか全く使いどころがわかりません。
カウントダウンが終了したら音を出す機能もつけたいと思っているのですが一旦棚上げします。(Windows APIというものを使うようでそこまで難しくなさそうなのですが。。。。)
そもそもユーザーフォームを使ってつくるほうがいいのか?と思ってみたりして色々考えてみています。
タイマーなんてスマホのアプリ使えよ!って感じですが、普段税理士業務ではなかなか扱うことが少ない「時間」に関するExcelマクロの考え方や使い方を少し学べたような気がするのでよしとします。
【本日の近況報告】
身の回りにある不要なものをメルカリでこつこつと処分をしています。
お酒が割といい値段で売れています。
発送作業が面倒なんですよね。。。
【本日の1曲】
maroon5/sunday morning
説明不要。マルーン5の初期名曲。
やっぱりいい曲ですね。