ホーム » ブログ

アーカイブ

検索


フィード


管理

2015年12月9日

MS-Excelで学会タイマーをつくってみた

いやー、「学会タイマー」って、ほんと、大学教員にとって重要なツールですよね。

学会や研究会などで時間管理が重要なのは当然ですが、学生さんに研究調査を発表してもらうようなゼミ型の講義だと、各学生さんの発表時間を厳格に管理しないと不公平ですし、モタモタしていると時限の終了時刻を過ぎてしまいかねないわけです。昔は終了時刻を過ぎてもよかったのかもしれませんが、いまの忙しい学生さんたちは、次の時限の講義に出席しないといけないかもしれませんし、何はともあれ、よくないわけです。

長年、学会タイマーを活用してきたのですが、実は、某フリーソフトウェアの学会タイマーが、自分のノートPC上で大問題を起こして以来、安心して使えない日々が続いてきました。というのも、某国際学会で自分が司会だったとき、そのフリーウェアーの学会タイマーを使ったものの、どうやら誤作動を起こしてしまい、実際の残り時間よりも大幅に短い残り時間を表示していた(かなり早いペースで残り時間が減っていった)ため、本当はみんな20分くらい発表時間があったのに、10分強で発表を強制終了させてしまっていたという悲惨なことがあったのです。誤作動というよりは、そのフリーウェアーのバグのような気もしますが・・・無料ソフトなわけですから、文句を言うわけにもいきません。使った自分が悪いのです。

で、困っていたのですが、結局、自作することにしました。下にソースコードを貼っておきます。アイディアは以前から頭のなかにあったので、制作自体は40分ほどで終わりました。MS-ExcelのVBAを用いています。残り時間の表示はExcel上で行います。なお、windowsのみで動作します。Macユーザーのみなさんごめんなさい。最初のDeclareの部分を改造すれば動くと思います。また、いろいろ改造の余地がありますので、ご自由にお試しください。あと、マクロ/Subの呼び出しは、エクセルの「フォーム」で「ボタン」をつくって、クリックで呼び出せるようにしておくと便利ですよ(ここまで読んでいる人ならそんな説明いらないと思いますが・・・)。

timer

【追記】エクセルのファイルもダウンロードできるようにしました。こちらからどうぞ。ただし、VBA/マクロが起動するためにはセキュリティレベルを下げる必要があるかもしれません。また、もちろん自分はウイルスなんて仕込みませんが、マクロが起動できる環境にするということは若干の脆弱性を意味しますので、そこは自己責任でよろしくおねがいします。

Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Declare Function GetAsyncKeyState Lib “User32.dll” (ByVal vKey As Long) As Long
Declare Function BeepAPI Lib “kernel32.dll” Alias “Beep” (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Sub updatetime()

‘–開始音–
Call BeepAPI(500, 400)
‘———————-
‘ Excel上では time という名前をつけたワークシートに残り時間の表示や設定値の入力を行います。
‘ (ワークシートの名前はなんでもかまいません)
‘ セルB2(Cells(2,2))に大きく残り時間を表示します
‘ 自分は400ptのArialが表示されるセルの幅・高さに設定していますが
‘ 利用するノートPCの画面解像度にあわせて適宜調整してください。
‘———————-

‘–表示色を黒色に戻す–
Cells(2, 2).Font.ColorIndex = 1

‘–念のためセルA10に開始時間を表示(代入)します
Sheets(“time”).Cells(10, 1) = Time()

‘–開始時間はStart_timeという変数に格納します
Start_time = Time()

‘———————-
‘ セルA7(Cells(7,1))に発表時間を分単位で記入しておきます
‘ セルA15(Cells(15,1))に、何分前に予鈴を鳴らすか記入しておきます
‘———————-

‘–終了時間はEnd_timeという変数に、DateAdd関数を用いて格納します
End_time = DateAdd(“n”, Sheets(“time”).Cells(7, 1), Start_time)
‘–予鈴を鳴らすタイミングの残り時間をBell1_timeという変数に格納します。
Bell1_time = Sheets(“time”).Cells(15, 1)

‘–念のためセルA12に終了時間を表示(代入)します
Sheets(“time”).Cells(12, 1) = End_time
‘–終了時間になるまでループを繰り返します
Do

‘–残り時間を秒数で計算して、分部分と秒部分に分離します
Remain_time = DateDiff(“s”, Time(), End_time)
Remain_min = Remain_time \ 60
Remain_sec = Remain_time Mod 60

‘–秒が1桁だと見栄えが悪いので1桁の場合は0を追記します
If Len(Remain_sec) = 1 Then Remain_sec = “0” & Remain_sec

‘–セルB2に残り時間を代入します
Sheets(“time”).Cells(2, 2) = Remain_min & “:” & Remain_sec

‘–予鈴を鳴らすタイミングの処理、音を鳴らし色を赤にします
If (Remain_min = Bell1_time) And (Remain_sec = “00”) Then
Call BeepAPI(500, 700)
Cells(2, 2).Font.ColorIndex = 3
End If

‘–無限ループするとCPUを消耗するので500ms待機させます(変更可)
Sleep 500

‘———————-
‘ Shiftキーが押されたらタイマーを止めます
‘ 発表が早く終わったときにはShiftを押しましょう
‘ 別のキーでもかまいませんので下の 16 を適切なASCIIコードに変更してください
‘———————-

If GetAsyncKeyState(16) <> 0 Then End

‘–現時点が終了時刻を越えるまでループします
Loop While End_time >= TimeValue(Time())

‘–終了の警告音を鳴らします
Call BeepAPI(350, 1200)

End Sub


カテゴリ: Computers,University of Tokyo — Masa @ 9:24 PM