業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、TimeValue、TimeSerial、Hour、Minute、Second、Timerという時刻の計算や変換に役立つ6つの関数の使い方について。
今回のTipsも関数の使い方について解説する。今回は、「TimeValue」「TimeSerial」「Hour」「Minute」「Second」「Timer」という時間の計算や変換に関する6つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。
「TimeValue」は、時刻を表す文字列式を、バリアント型の時刻の値に変換する関数だ。
TimeValue(time)
「time」には、「0:00:00」(12:00:00 AM)〜「23:59:59」(11:59:59 PM)の時刻を表す文字列式を指定する。
「TimeValue」シートを作成し、その中に「実行」ボタンと時刻を表示するセルを用意する(図1)。
VBE(Visual Basic Editor)を起動して「挿入」から「標準モジュール」を選択し、プロジェクト内に追加されるModule1内にコードを記述する。
TimeValue関数を用いて、時刻表示するコードはリスト1になる。
Sub TimeValue関数の使い方() Dim 時刻 As String 時刻 = InputBox("時刻を入力してください。(hh:mm:ss)") Range("B6").Value = TimeValue(時刻) End Sub
文字列型の「時刻」変数を宣言し(1行目)、InputBox関数で指定した形式で時刻を入力させる(2行目)。セル「B6」に、入力された時刻をTimeValue関数を用いて表示した(3行目)。
リスト1のコードを「実行」ボタンに関連付け、実行すると図2のようになる。
「実行」ボタンをクリックすると、時刻を入力するダイアログボックスが表示されるので、例えば、「11:15:30 PM」と入力する。「PM」は午後を表すので、「23時15分30秒」と表示される。「11:15:30 AM」と入力すると、「AM」は午前を表すので、「11時15分30秒」と表示される。
「TimeSerial」は、引数に指定された時、分、秒に対応する時刻を含むバリアント型の値を返す関数だ。
TimeSerial(hour,minute,second)
「hour」には、「時」を表す数式を指定する。「minute」には、「分」を表す数式を指定する。「second」には、「秒」を表す数式を指定する。
シートに図3のように時、分、秒を入力するセルと、「実行」ボタンを配置しておく。
「実行」ボタンをクリックして、時、分、秒を時刻に直して表示するコードはリスト2になる。
Sub TimeSerial関数の使い方() If Range("C2").Value = "" Or Range("C3").Value = "" Or Range("C4").Value = "" Then MsgBox "未入力か所があります。" Exit Sub Else If IsNumeric(Range("C2").Value) = True And IsNumeric(Range("C3").Value) = True And IsNumeric(Range("C4").Value) = True Then Range("D6").Value = TimeSerial(Range("C2").Value, Range("C3").Value, Range("C4").Value) Else MsgBox "入力された値が不正です。" Exit Sub End If End If End Sub
セル「C2」「C3」「C4」が未入力だった場合は警告メッセージを発して処理を抜ける(2〜4行目)。それ以外は6〜11行目の処理を行う。
セル「C2」「C3」「C4」に数値以外の値が入力された場合は、警告メッセージを発して処理を抜ける(9〜10行目)。それ以外は、セル「D6」に「TimeSerial」関数を使って、入力された値を元に時刻を表示する(7行目)。
「時を入力」に「23」を入力した場合は、「分」には最大で「59」しか入力できない。「60」のように、時間の変わる値を入力すると間違った時刻が表示されるため、注意が必要だ。
このリスト2のマクロを「実行」ボタンに関連付ける、実行すると図4のようになる。
中央の図で、「分」に「-15」を入力すると60分から15分をマイナスして「45分」が表示される。
一番下の図で、「分」に「70」を入力すると、「1時間10分」を表す。そして「秒」に「65」を入力すると、「1分5秒」を表す。このため、最終的に「9時11分05秒(9:11:05)」を表すことになる。
Hourは時刻の“時”を0〜23の整数で返す関数だ。
Hour(time)
「time」には、時刻と、認識の可能な日付式または数式、文字列式を指定する。
シートに図5のような「現在の時刻のみを表示」するセルと、「実行」ボタンを用意しておく。この場合、時刻のみを表示するセルC4には、必ずセルのプロパティから「標準」を指定しておく必要がある。
Hour関数を用いて、時刻のみ表示するコードはリスト3になる。
Sub Hour関数の使い方() Range("C4").Value = Hour(Now) 'Range("C4").Value = Hour(Now) & "時" & Minute(Now) & "分" & Second(Now) & "秒" End Sub
「C4」のセルに現在の時刻の“時”のみを表示させた。「C4」のセルに「時分秒」で表示させるには、3行目のようにと記述すればいい。今回は、このコードはコメントアウトしている。
リスト3のコードを「実行」ボタンに関連付け、実行すると図6のように実行される。
5時の「5」の部分のみが取得された。セル「C4」の「セルの書式設定」には、「標準」が設定されていなければ、時刻が表示されないので注意してほしい。
「Minute」は、時刻の“分”を表す0〜59の整数を返す関数だ。
Minute(time)
「time」には、時刻を表す式を指定する。
シートに図7のように「現在の時刻」と「現在の分」を表示させるセルを用意しておく。
各セルにはExcelのメニューから「書式」を設定している。読者の皆さんが好きなデザインにしても構わない。
「現在の時刻」と「現在の分」に値を表示させるコードはリスト4になる。
Option Explicit Sub Minute関数の使い方() Range("C2").Value = Now Range("C3").Value = Minute(Now) End Sub
セル「C2」にNow関数で現在の日付と時刻を表示し、セル「C3」に「Minute」関数を使って現在の「分」だけを表示させている。
このプロシージャ内にフォーカスを移し、VBEメニューの「実行」→「Sub/ユーザーフォームの実行」と選択して実行する。
「Second」は、時刻の“秒”を表す0〜59の整数を返す関数だ。
Second (time)
「time」には、時間を表す任意の式を指定する。
シートに図9のように「現在の日時」を表示させるセルと、「現在の秒」を表示させるセルを用意しておく。
各セルにはExcelのメニューから書式を設定している。読者の皆さんが好きなデザインにしても構わない。
「現在の日時」と「現在の秒」に値を表示させるコードはリスト5になる。
Option Explicit Sub Second関数の使い方() Range("C2").Value = Date & "-" & Time Range("C3").Value = Second(Time) End Sub
セル「C2」に、DateとTimeを「-」で連結して現在の日付と時刻を表示する。セル「C3」にTime関数の値を引数にSecond関数を使って、現在の「秒」を表示する。
リスト5の中にフォーカスを移し、VBEメニューの「実行」→「Sub/ユーザーフォームの実行」と選択して実行する(図10)。
Timerは、午前0時からの経過秒数を表す単精度浮動小数点数型(Single)の値を返す関数だ。Microsoft Windowsでは、Timer関数は秒の小数部を返す。
シートに図11のように値をカウントするセルと、「実行」ボタンを配置する。
「実行」ボタンをクリックすると、「カウント」の「C2」のセルに、0〜10万までの値がカウントされ表示される。10万までの値のカウントにかかった秒数が、ダイアログボックスで表示される。コードはリスト6だ。
Sub Timer関数の使い方() Dim myTimer As Single Dim i As Long myTimer = Timer For i = 0 To 100000 Range("C2").Value = i Next myTimer = Timer - myTimer MsgBox ("所要時間は" & CInt(myTimer) & "秒です。") End Sub
Single型の変数「myTimer」とLong型の変数「i」を宣言する(1〜2行目)。「myTimer = Timer」で時間の計測を開始する(3行目)。
変数iを0から10万まで繰り返し、「C2」のセルに表示する(4〜6行目)。10万までのカウントが終了すれば、「myTimer=Timer-myTimer」で、10万回カウントしたのに要した秒数を求める(7行目)。
CInt関数を使って、整数部分のみを取り出して所要時間をMsgBox関数で表示する(8行目)。
このリスト6のマクロを「実行」ボタンに関連付け、実行すると図12のように表示される。
「TimeValue」関数は、時刻のいろいろなパターンの表示ができる。フォームで、データの入力時間などを記録する場合に便利ではないだろうか。
「TimeSerial」関数は、自動的に「時」「分」の繰り上げ/繰り下げを行って、該当する時刻を表示してくれる便利な関数だ。「今から、何時間何分後には何時になるのか?」ということを知りたい場合に使えるのではないだろうか。
ただし、先にも書いておいたように、日付の変わる「時」「分」、例えば「時」に「23」と入力し、「分」に「70」と入力し、「秒」に「0」と入力すると、本来なら「0:10:00 AM」と表示されるべきだが、「1900/1/10:10」と表示される。この原因究明には至っていない。
「Hour」関数に関しては、コメントアウトしているコードのように、「Minute」や「Second」と組み合わせて使用することはあるかもしれない。
「Timer」に関しては、日常業務の中で使用することは“まれ”ではないだろうか。ただ、Excelでゲームなどを作る強者には必要な関数だろう。読者の皆さんで、有効な利用法を考えていただきたい。
次回も引き続き、関数について解説する予定だ。お楽しみに。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.