エクセルにタイマーを設定する方法【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スキルを身に付ける
VBAの勉強を始める前は上記の方法で効率化マクロを導入していました。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
毎日のルーティーン作業にうんざりしている、だれでもできる単純作業に時間を費やしている、という方はあなたに合った方法でVBAを導入しちゃいましょう。
マクロの開発を外注に依頼する
マクロの開発を外注に依頼する導入方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなエクセル作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』ですぐにエクセル作業を自動化することができます。
本記事で紹介している『エクセルにタイマー機能を追加するVBA』も下記のサイトでダウンロード可能。
カウントダウンタイマーVBAを切り取ってお使いのエクセルに追加する!
カウントダウンタイマーVBAをアレンジして使ってみる!
などいろんな利用方法があります。
自分でVBAを設定したい!と考えている方は是非参考にしてみてください。
『マクロが設定されたエクセルファイルをダウンロード』する導入方法は、
VBA初心者でもマクロを導入できる、費用が安い、
というメリットがあります。
しかし
VBAに関する情報が多く公開されているとはいえ、ネット上で想定するマクロは見つけることが難しい
というデメリットもあります。

ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。

ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい処理を実現するコードを書くだけ
です。
【VBA 写真を貼る】、【VBA PDF出力】、のようにネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。
業務内容に合ったタイマー機能を導入する方法
業務内容に合わせたカウントダウンタイマーVBAを設定するには、
自分でVBAを設定する方法とVBA開発依頼をする方法
の2つがあります。
自分でカウントダウンタイマーVBAを設定する方法
自分でVBAを設定する手順がこちら
- どのような処理をしたいのか具体的なイメージを持つ
- VBAを書いてみる
- ネットや参考書を使って問題点を解決していく

ガッツポーズの人
今回紹介した「カウントタイマーVBAの作成」は以下の流れで作業を進めました。
- 制限時間後に〇〇する処理をエクセル業務に導入したい
- 1秒ずつ減っていくタイマーをどうやって表示すればいいのだろう。。
- テキストボックスとFormat関数で表現できるかも
このような流れで一つ一つ疑問を解決して業務内容に合わせたVBAに仕上げていきました。
当ブログが行っているVBA開発代行サービスの依頼方法は、
現状このようなエクセル作業をしていて自動化したい!
と伝えるだけ。
「こんなエクセル作業にタイマー機能を追加して自動的に〇〇したい!」
ザックリとした依頼内容でOKです。
エクセル業務の効率がアップするようなVBAの提案、開発をさせていただきます。
>>>マメBlogのVBA開発依頼の詳細はこちら
関連記事「年間50件達成!!マクロ開発実績について」ではマメBlogが行ってきたVBA開発の実績が詳しく紹介されています。
どんなVBA開発を行っているのか、費用はどれくらいかかるのか、などVBA開発依頼サービスに興味のある方は是非チェックしてみてください。
ディスカッション
コメント一覧
まだ、コメントがありません