はじめに
Excel VBAの練習としてタイマーを作るというのが流行っているみたいなので作ってみました。
動作確認環境
デスクトップアプリ版 Office 365 Enterprise Excel
(おそらく大体のバージョンで動作します)
目標のもの
最終的な目標の設定はとても重要です。
動作例
① SETのセルに時間をセット
今回は分、秒、デシ秒(10分の1秒)まで設定できるようにしましょう。
② 「開始」ボタンをクリック
③ NOWに現在の残り時間が表示されながら減少
この間,Excelでの操作はできないですが,今回はこれで妥協します。
④ 残り時間が 0分00.0秒になったら「時間です」とメッセージを表示
ソースコード
これがソースコードの全文です。(ボタンへの追加などは後で)
Timerモジュール
'===================================='
' タイマー '
' MysoShake '
'===================================='
'変数選言の強制
Option Explicit
'ミリ秒単位で待機させる関数を使えるようにする
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'ボタンクリック時に呼び出す
Sub OnButtonClick()
'ループ用フラグ
Dim run_flag As Boolean
'今の残り時間
Dim t_min As Long
Dim t_sec As Long
Dim t_dsec As Long
'B2,C2,D2セルからそれぞれ分,秒,デシ秒を取得(minute,second,decisecond)
t_min = Cells(2, 2).Value
t_sec = Cells(2, 3).Value
t_dsec = Cells(2, 4).Value
'とりあえずはじめはループする
run_flag = True
Do Until run_flag = False
'1回分(1ds = 100ms)残り時間を減らす
t_dsec = t_dsec - 1
'繰り下がり計算 [1秒-1デシ秒 = 9デシ秒]
If t_dsec = -1 Then
t_sec = t_sec - 1
t_dsec = 9
'繰り下がり計算2 [1分-1秒 = 59秒]
If t_sec = -1 Then
t_min = t_min - 1
t_sec = 59
End If
End If
'タイマーが0分0.0秒になったら終了
If t_min = 0 And t_sec = 0 And t_dsec = 0 Then
run_flag = False
End If
'今の残り時間をB4,C4,D4セルに表示
Cells(4, 2).Value = t_min
Cells(4, 3).Value = t_sec
Cells(4, 4).Value = t_dsec
'100ms待つ
Call Sleep(100)
Loop
'お知らせ
Call MsgBox("時間です")
End Sub
これを新しいモジュールTimer(好きな名前)に入れて保存しましょう。
ボタンの追加と見た目の設定
あとは体裁を整えてボタンを配置するのみです。
① 体裁を整える
時間入力の枠を適当に作成します。(B2,C2,D2セルが初期設定,B4,C4,D4が処理中の値で,今回は変更できません)
②-1 ボタンの配置
[開発タブ] → [挿入] → [ボタン] (左上の何もない箱っぽいアイコン)がボタンです。
そのあとでシート上でドラッグ&ドロップするとボタンが作られます。
②-2 マクロの登録
おわりに
お読みくださりありがとうございました。
何かお気づきの点がありましたらお教えいただければ幸いです。
追伸
サクッと作ろうとしたのに、説明のスクショをとりながらの作業で少し長くなりました(所要時間 40分)
ループがあって短いソースでも書けるので,適度に勉強になりそうないい題材だと思いました。