2013
1
31

意外と簡単!ExcelVBAでカウントダウンタイマーを作る方法

作ってみたら意外と少ないコードでできるもんだなぁと思ったのでご紹介。わたしは当時Excel2003で作りましたが、そんなに特殊なコードは使ってないので恐らく2007以降でも動く…はずです(たぶん)。実用的かどうかはさておき、勉強のとっかかりにどうぞー。


実装

標準モジュール

130131-1

ではまず、B2セルに分、D2セルに秒の数値が入るようにシートに記入して(枠はなくても構いません)、こちらの記事を参考にプログラム起動用のボタンを作ってみてください。標準モジュールに書くコードはこちらです。

コピペして貼り付けてください。サブルーチンのタイトルが「timer」なので、ボタンへの登録の際ご注意くださいね。

改善コードを記事末尾に追記しました。そちらのほうがスマートなコードとなっております。

ユーザーフォーム

Visual Basic Editorの[挿入]→[ユーザーフォーム]を選択すると、空のUserForm1というものができます。

130131-2

図のようにツールボックスから、ラベル、テキストボックス、コマンドボタンをひとつずつ配置します。(ラベルはプログラム上使っていないので、なくても動きます)

※ツールボックスが出ていない場合は、[表示]→[ツールボックス]を押してみてください。

ユーザーフォームのコード

130131-3

図の部分のUserFrom1を右クリック→[コードの表示]をクリックして、そこに以下をコピペします。

はい、できました!

Excelに戻って、分と秒にお好きな数値を入れて、スタートボタンを押してみてください。意外と簡単ですよね?

解説

主に、3つの変数で出来ています。

  • limit … 現在時刻に指定分・指定秒を足した、到達時刻
  • cnt_d … 到達時刻から現在時刻を引いた秒数(一時停止時間もあればプラス)/60
  • rng … 一時停止していた秒数

limitからTime(現在時刻)を引いて、のちの計算のため60で割ってあるのがcnt_dです。日付や時間の差を計算してくれる関数、DateDiffは分、秒など特定の形式でしか表せないため、秒で出したものを60で割ったりなんかごねごねして、分:秒の形に成形しています。もしかしてもっとスマートなやり方あるのかな_(┐「ε:)_

改善コードを記事末尾に追記しました!

そのため、秒が1桁になったときに頭にゼロがつかないのがちょっと気持ち悪いところです。条件つけて1桁だったら頭にゼロを、ってことも出来るんですが、それで無駄なタイムラグとか生まれるのがやだなーと思って実装しませんでした。

やっぱり、Format(なかみ, "00")で括って1桁でも頭にゼロがつくようにしてみました。ちょっと入れ子すぎな感じもしますがw、やっぱゼロがあったほうが見た目が良いですねー。

rngはストップボタンを押してから再開するまでの秒数を格納しています。モジュールとユーザーフォーム両方で使う変数なので、Public変数で宣言しています。

一時停止機能がいらなければ、rngの変数宣言も、ユーザーフォームのコードもほとんどいらないですね。10~12行目のフォームが閉じるときのEndだけは必要です。

いかがでしたでしょうか?良かったら作ってみてくださいね!

追記

分:秒の形に成形するために60で割ったりなんだりやってたんですが、もっとシンプルな方法があるようでして、その部分を書き直しました。

標準モジュール

ハイライト部分が変更されています。TimeSerialという関数があるんですね…!しらなかった…!

こちらの回答コードより勉強させて頂きました。私のコードは役に立たなかったようで…すみません(;´Д`)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2013/01/31
更新日:2014/03/31


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top