連載
» 2015年06月08日 05時00分 UPDATE

VBA/マクロ便利Tips:Excelにおける時間の計算や変換に役立つ6つの関数――TimeValue、TimeSerial、Hour、Minute、Second、Timerの使い方

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、TimeValue、TimeSerial、Hour、Minute、Second、Timerという時刻の計算や変換に役立つ6つの関数の使い方について。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回のTipsも関数の使い方について解説する。今回は、「TimeValue」「TimeSerial」「Hour」「Minute」「Second」「Timer」という時間の計算や変換に関する6つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。


時刻を表す文字列式を、バリアント型の時刻の値に変換するTimeValue関数

 「TimeValue」は、時刻を表す文字列式を、バリアント型の時刻の値に変換する関数だ。

TimeValue関数の書式

TimeValue(time)


 「time」には、「0:00:00」(12:00:00 AM)〜「23:59:59」(11:59:59 PM)の時刻を表す文字列式を指定する。

 「TimeValue」シートを作成し、その中に「実行」ボタンと時刻を表示するセルを用意する(図1)。

TimeValuezu_01.png 図1 「実行」ボタンをと時刻を表示するセルを用意する

 VBE(Visual Basic Editor)を起動して「挿入」から「標準モジュール」を選択し、プロジェクト内に追加されるModule1内にコードを記述する。

 TimeValue関数を用いて、時刻表示するコードはリスト1になる。

Sub TimeValue関数の使い方()
  Dim 時刻 As String
  時刻 = InputBox("時刻を入力してください。(hh:mm:ss)")
  Range("B6").Value = TimeValue(時刻)
End Sub
リスト1  TimeValue関数を用いて、時刻を表示するコード

 文字列型の「時刻」変数を宣言し(1行目)、InputBox関数で指定した形式で時刻を入力させる(2行目)。セル「B6」に、入力された時刻をTimeValue関数を用いて表示した(3行目)。

 リスト1のコードを「実行」ボタンに関連付け、実行すると図2のようになる。

TimeValuezu_02.png 図2 時刻に「11:15:30 PM」と入力して「OK」ボタンをクリックした

 「実行」ボタンをクリックすると、時刻を入力するダイアログボックスが表示されるので、例えば、「11:15:30 PM」と入力する。「PM」は午後を表すので、「23時15分30秒」と表示される。「11:15:30 AM」と入力すると、「AM」は午前を表すので、「11時15分30秒」と表示される。

引数に指定された時、分、秒に対応する時刻を含むバリアント型の値を返すTimeSerial関数

 「TimeSerial」は、引数に指定された時、分、秒に対応する時刻を含むバリアント型の値を返す関数だ。

TimeSerial関数の書式

TimeSerial(hour,minute,second)


 「hour」には、「時」を表す数式を指定する。「minute」には、「分」を表す数式を指定する。「second」には、「秒」を表す数式を指定する。

 シートに図3のように時、分、秒を入力するセルと、「実行」ボタンを配置しておく。

ExcelVBA12Tips_05.png 図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
リスト2 「TimeSerial」関数を使って時、分、秒を時刻に直して表示するコード

 セル「C2」「C3」「C4」が未入力だった場合は警告メッセージを発して処理を抜ける(2〜4行目)。それ以外は6〜11行目の処理を行う。

 セル「C2」「C3」「C4」に数値以外の値が入力された場合は、警告メッセージを発して処理を抜ける(9〜10行目)。それ以外は、セル「D6」に「TimeSerial」関数を使って、入力された値を元に時刻を表示する(7行目)。

 「時を入力」に「23」を入力した場合は、「分」には最大で「59」しか入力できない。「60」のように、時間の変わる値を入力すると間違った時刻が表示されるため、注意が必要だ。

 このリスト2のマクロを「実行」ボタンに関連付ける、実行すると図4のようになる。

ExcelVBA12Tips_06.png 図4 「TimeSerial」関数で入力された値を元に時刻を表示した

 中央の図で、「分」に「-15」を入力すると60分から15分をマイナスして「45分」が表示される。

 一番下の図で、「分」に「70」を入力すると、「1時間10分」を表す。そして「秒」に「65」を入力すると、「1分5秒」を表す。このため、最終的に「9時11分05秒(9:11:05)」を表すことになる。

時刻の“時”を0〜23の整数で返すHour関数

 Hourは時刻の“時”を0〜23の整数で返す関数だ。

Hour関数の書式

Hour(time)


 「time」には、時刻と、認識の可能な日付式または数式、文字列式を指定する。

 シートに図5のような「現在の時刻のみを表示」するセルと、「実行」ボタンを用意しておく。この場合、時刻のみを表示するセルC4には、必ずセルのプロパティから「標準」を指定しておく必要がある。

vba15zu_03.png 図5 「実行」ボタンをと時刻のみを表示するセルを用意する

 Hour関数を用いて、時刻のみ表示するコードはリスト3になる。

Sub Hour関数の使い方()
  Range("C4").Value = Hour(Now)
'Range("C4").Value = Hour(Now) & "時" & Minute(Now) & "分" & Second(Now) & "秒"
End Sub
リスト3 「Hour」関数を用いて、時刻のみを表示するコード

 「C4」のセルに現在の時刻の“時”のみを表示させた。「C4」のセルに「時分秒」で表示させるには、3行目のようにと記述すればいい。今回は、このコードはコメントアウトしている。

 リスト3のコードを「実行」ボタンに関連付け、実行すると図6のように実行される。

vba15zu_04.png 図6 現在の時刻のみが表示された

 5時の「5」の部分のみが取得された。セル「C4」の「セルの書式設定」には、「標準」が設定されていなければ、時刻が表示されないので注意してほしい。

時刻の“分”を表す0〜59の整数を返すMinute関数

 「Minute」は、時刻の“分”を表す0〜59の整数を返す関数だ。

Minute関数の書式

Minute(time)


 「time」には、時刻を表す式を指定する。

 シートに図7のように「現在の時刻」と「現在の分」を表示させるセルを用意しておく。

ExcelVBA8Tips_01.png 図7 「現在の時刻」と「現在の分」を表示させるセルを用意しておく

 各セルにはExcelのメニューから「書式」を設定している。読者の皆さんが好きなデザインにしても構わない。

 「現在の時刻」と「現在の分」に値を表示させるコードはリスト4になる。

Option Explicit
Sub Minute関数の使い方()
 Range("C2").Value = Now
 Range("C3").Value = Minute(Now)
End Sub
リスト4 「現在の時刻」や「現在の分」が表示されるコード

 セル「C2」にNow関数で現在の日付と時刻を表示し、セル「C3」に「Minute」関数を使って現在の「分」だけを表示させている。

 このプロシージャ内にフォーカスを移し、VBEメニューの「実行」→「Sub/ユーザーフォームの実行」と選択して実行する。

 

ExcelVBA8Tips_02.png 図8 Minute関数で現在の「分」が表示された

時刻の“秒”を表す0〜59の整数を返すSecond関数

 「Second」は、時刻の“秒”を表す0〜59の整数を返す関数だ。

Second関数の書式

Second (time)


 「time」には、時間を表す任意の式を指定する。

 シートに図9のように「現在の日時」を表示させるセルと、「現在の秒」を表示させるセルを用意しておく。

ExcelVBA11Tips_01.png 図9 「現在の日時」を表示させるセルと、「現在の秒」を表示させるセルを用意しておく

 各セルにはExcelのメニューから書式を設定している。読者の皆さんが好きなデザインにしても構わない。

 「現在の日時」と「現在の秒」に値を表示させるコードはリスト5になる。

Option Explicit
Sub Second関数の使い方()
  Range("C2").Value = Date & "-" & Time
  Range("C3").Value = Second(Time)
End Sub
リスト5 「Second」関数で現在の「秒」を表示するコード

 セル「C2」に、DateTimeを「-」で連結して現在の日付と時刻を表示する。セル「C3」にTime関数の値を引数にSecond関数を使って、現在の「秒」を表示する。

 リスト5の中にフォーカスを移し、VBEメニューの「実行」→「Sub/ユーザーフォームの実行」と選択して実行する(図10)。

ExcelVBA11Tips_02.png 図10 現在の「秒」が表示されている

午前0時からの経過秒数を表す単精度浮動小数点数型の値を返すTimer関数

 Timerは、午前0時からの経過秒数を表す単精度浮動小数点数型(Single)の値を返す関数だ。Microsoft Windowsでは、Timer関数は秒の小数部を返す。

 シートに図11のように値をカウントするセルと、「実行」ボタンを配置する。

vba15zu_05.png 図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
リスト6 10万までの数をカウントするのにかかった秒数を表示するコード

 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のように表示される。

vba15zu_06.png 図12 10万回カウントをした後、所要時間を表示する

まとめ

 「TimeValue」関数は、時刻のいろいろなパターンの表示ができる。フォームで、データの入力時間などを記録する場合に便利ではないだろうか。

 「TimeSerial」関数は、自動的に「時」「分」の繰り上げ/繰り下げを行って、該当する時刻を表示してくれる便利な関数だ。「今から、何時間何分後には何時になるのか?」ということを知りたい場合に使えるのではないだろうか。

 ただし、先にも書いておいたように、日付の変わる「時」「分」、例えば「時」に「23」と入力し、「分」に「70」と入力し、「秒」に「0」と入力すると、本来なら「0:10:00 AM」と表示されるべきだが、「1900/1/10:10」と表示される。この原因究明には至っていない。

 「Hour」関数に関しては、コメントアウトしているコードのように、「Minute」や「Second」と組み合わせて使用することはあるかもしれない。

 「Timer」に関しては、日常業務の中で使用することは“まれ”ではないだろうか。ただ、Excelでゲームなどを作る強者には必要な関数だろう。読者の皆さんで、有効な利用法を考えていただきたい。

 次回も引き続き、関数について解説する予定だ。お楽しみに。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

kuniyasu.jpg

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。