エクセルにタイマーを設定する方法【VBAでカウントダウンタイマーの作り方を徹底解説】
エクセル内にタイマーを設定したい!!
こんな要望にお答えします。
この記事では、
VBAを使ってカウントダウンタイマーを設定する方法、使われている関数
についてご紹介しています。
カウントダウンタイマーを設定すると以下のようなタイマーを表示することができます。
カウントダウンタイマーは以下のような場面で導入されます。
- 職場で複数の人が扱うエクセルファイルで、独占しないよう制限時間後にエクセルを閉じる
- 乗車状況確認マクロで、「降車」を検知して制限時間内に操作がない場合警告音を鳴動させる
- 作業効率をアップさせるため制限時間を設ける
カウントダウンタイマーVBAを具体的にイメージしてもらうために2つのサンプル事例を使ってVBAの解説をしていきます。
サンプル事例① エクセルを開くとタイマーが作動し、タイムアップするとエクセルが自動で閉じる
サンプル事例② 制限時間を自由に変更できるカウントダウンタイマー
カウントダウンタイマーVBAを自由に扱えるようになると、
いろんなエクセル業務への応用が可能になるので是非参考にしてみてください。
目次
サンプル事例① エクセルを開くとタイマーが作動し、タイムアップするとエクセルが自動で閉じる
サンプル事例①「エクセルを開くとタイマーが作動し、タイムアップするとエクセルが自動で閉じる」の概要はこちら
- エクセルを開くと同時にカウントダウンタイマーが起動
- 「A4セル」「C4セル」「E4セル」に入力される数値で制限時間を決定
- ユーザーフォームのテキストボックスに制限時間を表示する
- タイムアップでエクセルを自動的に閉じる
この流れでVBAが動作しています。
サンプルVBA
Module1に入力する1つ目のVBAがこちら
Sub Timer()
Dim L As Date, cnt As Double
L = DateAdd("h", Range("A4"), Time)
L = DateAdd("n", Range("C4"), L)
L = DateAdd("s", Range("E4"), L)
rng = 0
UserForm1.Show vbModeless
Do
cnt = DateDiff("s", Time, L) + rng
UserForm1.TextBox1 = Format(TimeSerial(0, 0, cnt), "hh:nn:ss")
If UserForm1.TextBox1 = "00:00:00" Then Exit Do
DoEvents
Loop
Call CloseMe
End Sub
3行目から5行目は、現在時刻に「A4セル」「C4セル」「E4セル」に入力された時間を加えた時間を変数Lに格納
7行目は、制限時間を表示するユーザーフォームを表示する
8行目から13行目は、変数Lから現在時刻を引いて残りの時刻を有するのテキストボックスに表示させ、0になるまで繰り返す
14行目は、繰り返し処理完了後、「CloseMe」VBAを呼び出す
Module1に入力する2つ目のVBAがこちら
Sub CloseMe()
ActiveWorkbook.Save
ThisWorkbook.Saved = True
If Workbooks.Count <= 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End Sub
「上書き保存して閉じる」という内容です。
UserForm1に入力するVBAがこちら
Private Sub CommandButton1_Click()
Dim rng_t As Date
rng_t = Time
MsgBox ("タイマーがストップされました" & vbCrLf & "再開するには「OK」を押してください")
Rng = Rng + DateDiff("s", rng_t, Time)
End Sub
「ストップボタン押下でカウントダウンの表示が停止されコメントが表示する」という内容です。
導入方法
1.VBA編集画面を開く
2.ユーザーフォーム作成
3.オブジェクトの作成
4.VBAの設定
入力するVBAは上記の「UserForm1に入力するVBA」をコピペしてお使いください。
5.様式の設定
- A4セル・・・「時」
- C4セル・・・「分」
- E4セル・・・「秒」
入力する数字を変更すると、エクセルを閉じるまでの制限時間が変更されます。
6.標準モジュールを作成
7.標準モジュールにVBAを記入
入力するサンプルVBAには上記で紹介している、「Module1に入力する1つ目のVBA」と「Module1に入力する2つ目のVBA」をコピペしてお使いください。
7.Sheet1にVBAを記入
「Sheet1を開くとUserForm1を表示する」という内容です。
8.ワークブックにVBAを記入
「エクセルファイルを開くとカウントダウンタイマーVBAが起動する」という内容です。
以上で「エクセルを開くとタイマーが作動し、タイムアップするとエクセルが自動で閉じる」VBAの導入は完了です。
Module1に入力する2つ目のVBAの内容を変えることで
「制限時間後エクセルを閉じる」から「制限時間後〇〇する」に変更
することができます。
サンプル事例② 制限時間を自由に変更できるカウントダウンタイマー
サンプル事例②「制限時間を自由に変更できるカウントダウンタイマー」の概要はこちら
- 「タイマー表示」ボタン押下でカウントダウンタイマーを表示
- 時間を取得するテキストボックスに入力される数値で制限時間を決定
- テキストボックスに制限時間を表示する
- タイムアップでコメントを表示する
この流れでVBAが動作しています。
サンプルVBA
UserForm2のコマンドボタン1に入力するVBAがこちら
Private Sub CommandButton1_Click()
Dim L As Date, cnt As Double
L = DateAdd("h", UserForm2.TextBox1, Time)
L = DateAdd("n", UserForm2.TextBox2, L)
L = DateAdd("s", UserForm2.TextBox3, L)
Rng = 0
UserForm2.Show vbModeless
Do
cnt = DateDiff("s", Time, L) + Rng
UserForm2.TextBox4 = Format(TimeSerial(0, 0, cnt), "hh:nn:ss")
If UserForm2.TextBox4 = "00:00:00" Then Exit Do
DoEvents
Loop
MsgBox "時間切れ"
End Sub
3行目から5行目は、現在時刻に「テキストボックス1」「テキストボックス2」「テキストボックス3」に入力された時間を加えた時間を変数Lに格納
7行目は、制限時間を表示するユーザーフォームを表示する
8行目から13行目は、変数Lから現在時刻を引いて残りの時刻を有するのテキストボックスに表示させ、0になるまで繰り返す
14行目は、繰り返し処理完了後、メッセージを表示する
UserForm2のコマンドボタン2に入力するVBAがこちら
Private Sub CommandButton2_Click()
Dim rng_t As Date
rng_t = Time
MsgBox ("タイマーがストップされました" & vbCrLf & "再開するには「OK」を押してください")
Rng = Rng + DateDiff("s", rng_t, Time)
End Sub
「コマンドボタン(ストップ)を押下するとメッセージが表示されタイマーが一時停止する」という内容です。
導入方法
1.VBA起動
2.ユーザーフォームの作成
3.ユーザーフォーム(オブジェクトの設定)
4.ユーザーフォームのオブジェクトに設定するVBA
入力するサンプルVBAには上記で紹介している、「UserForm2のコマンドボタン1に入力するVBA」と「UserForm2のコマンドボタン2に入力するVBA」をコピペしてお使いください。
5.標準モジュールに設定するVBA
「UserForm2を表示する」という内容です。
この「click」マクロをボタンに登録することでカウントダウンタイマーを表示させることができます。
6.ボタンの作成
7.ボタンにマクロを登録
以上で「制限時間を自由に変更できるカウントダウンタイマー」VBAの導入は完了です。
ボタンをクリックすることでユーザーフォームを表示させる方法は、
ユーザーフォームは便利だけど、常時表示されると邪魔になる!
というときに隠しておけるのでとても便利です。
タイマー設定に必要な関数
カウントダウンタイマーを設定するには、「時間に関するVBA」と「数値を表示させる関数」が使われています。
- TimeSerial関数
- DateAdd関数
- DateDiff関数
- Format関数
時間に関する3つの関数と数値を表示させる関数を組み合わせることでカウントダウンタイマーを設定することができます。
TimeSerial関数
引数で指定した(時 , 分 , 秒 )値を返すもの
基本構造
TimeSerial( 時 , 分 , 秒 )
時 | 0~23の数値を指定 |
分 | 0~59の数値を指定 |
秒 | 0~59の数値を指定 |
戻り値は日付型(Date)の宣言になります。
TimeSerial関数のサンプル
使用例 | 結果 |
Cells(1,1) = TimeSerial(0,0,1) | 12:00:01 AM |
Cells(1,1) = TimeSerial(23,59,59) | 11:59:59 PM |
Cells(1,1) = TimeSerial(24,60,60) | 1900/1/1 1:01:00 |
TimeSerial関数を使ってセルに時刻を入力してみると、入力値によって書式設定が変わることがわかりました。
上記サンプルの1つ目と2つ目の書式設定は「h:mm:ss AM/PM」
上記サンプルの3つ目の書式設定は「yyyy/m/d h:mm」
Dateadd関数
Dateadd関数は日付を計算するときに使用される関数です。
例えば、
「今から1時間後の日付をA1セルに表示させる」「今からA1セルに記入された時間を加えた日付を表示させる」
という使い方ができます。
基本構造
Dateadd( 単位 , 数量 , 基準時間 )
DateDiff関数
DateDiff関数は日付を計算するときに使用される関数です。
例えば、
「今から1時間前の日付をA1セルに表示させる」「今からA1セルに記入された時間を引いた日付を表示させる」
という使い方ができます。
基本構造
DateDiff( 単位 , 数量 , 基準時間 )
Format関数
Format関数は指定した値を指定する書式で表示させる関数です。
カウントダウンタイマーVBAでは時間関数を取得した値を「00:00:00:」という表示に変換するために設定されています。
基本構造
Format( 指定した値 , “指定した書式" )
指定した書式一覧
指定した書式 | 意味 | 結果 |
yyyy | 年数(西暦) | 2020 |
m | 月 | 6 |
d | 日付 | 1 |
h | 時間 | 0~23 |
n | 分 | 0~59 |
s | 秒 | 0~59 |
hh | 時間 | 00~23(2桁表示) |
nn | 分 | 00~59(2桁表示) |
ss | 秒 | 00~59(2桁表示) |
業務内容に合ったタイマー機能を導入する方法
業務内容に合わせたカウントダウンタイマーVBAを設定するには、
自分でVBAを設定する方法とVBA開発依頼をする方法
の2つがあります。
自分でカウントダウンタイマーVBAを設定する方法
自分でVBAを設定する手順がこちら
- どのような処理をしたいのか具体的なイメージを持つ
- VBAを書いてみる
- ネットや参考書を使って問題点を解決していく
今回紹介した「カウントタイマーVBAの作成」は以下の流れで作業を進めました。
- 制限時間後に〇〇する処理をエクセル業務に導入したい
- 1秒ずつ減っていくタイマーをどうやって表示すればいいのだろう。。
- テキストボックスとFormat関数で表現できるかも
このような流れで一つ一つ疑問を解決して業務内容に合わせたVBAに仕上げていきました。
作業をしてみて感じたことが、
「時間」を操作する関数って複雑でイメージしずらい。
現在時刻に設定したい時間を足して、どんどん引いていくなんてややこしい
です。
関連記事「エクセルにタイマー機能を追加するVBA」では
この記事で紹介した2つのサンプルVBAが設定されたエクセルファイルをダウンロード
することができます。
カウントダウンタイマーVBAを切り取ってお使いのエクセルに追加する!
カウントダウンタイマーVBAをアレンジして使ってみる!
などいろんな利用方法があります。
自分でVBAを設定したい!と考えている方は是非参考にしてみてください。
VBA開発依頼をする方法
当ブログが行っているVBA開発代行サービスの依頼方法は、
現状このようなエクセル作業をしていて自動化したい!
と伝えるだけ。
「こんなエクセル作業にタイマー機能を追加して自動的に〇〇したい!」
ザックリとした依頼内容でOKです。
エクセル業務の効率がアップするようなVBAの提案、開発をさせていただきます。
>>>マメBlogのVBA開発依頼の詳細はこちら
関連記事「年間50件達成!!マクロ開発実績について」ではマメBlogが行ってきたVBA開発の実績が詳しく紹介されています。
どんなVBA開発を行っているのか、費用はどれくらいかかるのか、などVBA開発依頼サービスに興味のある方は是非チェックしてみてください。
ディスカッション
コメント一覧
まだ、コメントがありません