VBAで自動化 VBA一覧 日付・時刻 配列・データ操作

【VBA】Hour・Minute・Second関数の使い方|時分秒を取得する方法

Excel VBAで日付や時刻を扱っていると、「日時から時だけを取得したい」「分が30を超えているか判定したい」「秒単位で処理を分岐したい」といった場面があります。

日時全体をそのまま扱うこともできますが、業務上必要なのが「時」「分」「秒」の一部分だけであれば、それぞれを取り出した方が条件判定などを組み立てやすくなります。

そこで利用できるのが、Hour関数・Minute関数・Second関数です。

Hourは「時」、Minuteは「分」、Secondは「秒」を取得するため、それぞれの役割は明確です。ただし、これらは現在時刻を取得したり、文字列を時刻へ変換したりする関数ではありません。

この記事では3つの関数の基本から、セルや日時データから時分秒を取得する方法、実務で使うときの考え方まで順番に解説します。

✅ VBAのHour・Minute・Second関数とは?時分秒を取り出す仕組み

Hour・Minute・Secondは似た書き方をするため、3つをセットで覚えると便利ですが、それぞれの役割を曖昧にすると時刻処理が分かりにくくなります。特に誤解しやすいのが、これらの関数自体が「現在の時刻を取得する」わけではない点です。あくまで渡された日時や時刻から、必要な構成要素を取り出すために使用します。

また、取得結果は日時そのものではなく、「時」「分」「秒」を表す数値です。この違いを理解しておかないと、後から時刻の比較や計算を追加するときに不要な変換が増えることがあります。まずは3つの関数が何を返すのかを整理しておきましょう。

・Hour関数で「時」を数値として取得する構文

Hour関数は、指定した時刻から「時」に該当する部分を取得します。

基本構文は次のとおりです。

Hour(time)

たとえば、14時35分20秒から「14」を取得する場合は次のように記述できます。

Sub GetHourValue()

    Dim targetTime As Date
    Dim hourValue As Integer

    targetTime = #2:35:20 PM#

    ' 指定した時刻から「時」を取得する
    hourValue = Hour(targetTime)

    MsgBox hourValue

End Sub

実行結果は次のようになります。

14

ここで重要なのは、Hour関数が返しているのは「14:00」という時刻ではなく、時を表す数値の14だということです。

そのため、

If hourValue >= 17 Then

のように、時間帯を基準に条件分岐させる処理にも利用できます。

・Minute関数で「分」を数値として取得する構文

Minute関数は、指定した時刻から「分」の部分を取得します。

Minute(time)

たとえば14時35分20秒であれば、取得結果は35です。

Sub GetMinuteValue()

    Dim targetTime As Date
    Dim minuteValue As Integer

    targetTime = #2:35:20 PM#

    ' 指定した時刻から「分」を取得する
    minuteValue = Minute(targetTime)

    MsgBox minuteValue

End Sub

結果は次のようになります。

35

Hourと同様、取得されるのは「35分」という時間量ではなく、時刻を構成している分の値です。

たとえば14時35分から30分を取得して「経過時間が30分」と判断する、といった使い方は適切ではありません。

Minuteはあくまで指定した日時・時刻の「分」の部分を取り出す関数と理解しておきましょう。

・Second関数で「秒」を数値として取得する構文

Second関数は、時刻から「秒」の部分を取得します。

Second(time)

14時35分20秒なら20が返されます。

Sub GetSecondValue()

    Dim targetTime As Date
    Dim secondValue As Integer

    targetTime = #2:35:20 PM#

    ' 指定した時刻から「秒」を取得する
    secondValue = Second(targetTime)

    MsgBox secondValue

End Sub

Hour・Minute・Secondの関係をまとめると、次のようになります。

元の時刻関数取得結果
14:35:20Hour14
14:35:20Minute35
14:35:20Second20

このように、3つの関数は日時・時刻を構成要素に分解して利用したい場合に適しています。


✅ VBAで日時からHour・Minute・Secondをまとめて取得する方法

実務ではHourだけを単独で使うより、一つの日時から時・分・秒をそれぞれ取得するケースがあります。たとえば処理日時を解析したり、入力された時刻を条件別に分類したりする場合です。このとき同じ値を何度もセルから読み込むようなコードにすると、何を基準に処理しているのか分かりにくくなることがあります。

また、途中で参照セルを変更した際に一部だけ修正し忘れる原因にもなります。最初に基準となる日時を変数へ取得し、その値から必要な要素を取り出すと処理の意図が明確になります。小さなコードでも、後から変更される可能性を考えて組み立てることが大切です。

・1つの日時から時・分・秒をそれぞれ取得する例

3つの関数をまとめて使用すると、日時を構成する時分秒を個別に取得できます。

Sub GetTimeParts()

    Dim targetDateTime As Date
    Dim hourValue As Integer
    Dim minuteValue As Integer
    Dim secondValue As Integer

    targetDateTime = #8/28/2026 2:35:20 PM#

    ' 同じ日時から時・分・秒をそれぞれ取得する
    hourValue = Hour(targetDateTime)
    minuteValue = Minute(targetDateTime)
    secondValue = Second(targetDateTime)

    MsgBox "時:" & hourValue & vbCrLf & _
           "分:" & minuteValue & vbCrLf & _
           "秒:" & secondValue

End Sub

処理の流れは次のとおりです。

  1. 基準となる日時をtargetDateTimeへ格納する
  2. Hourで「時」を取得する
  3. Minuteで「分」を取得する
  4. Secondで「秒」を取得する
  5. 必要な処理でそれぞれの値を利用する

ここではHour・Minute・Secondへ直接日時を書き込むのではなく、最初にtargetDateTimeへまとめています。

たとえば、

hourValue = Hour(#8/28/2026 2:35:20 PM#)
minuteValue = Minute(#8/28/2026 2:35:20 PM#)
secondValue = Second(#8/28/2026 2:35:20 PM#)

としても結果は同じです。

しかし実務では、対象日時が変更されたときに複数箇所を修正する必要があります。

基準値を変数へまとめておけば、「どの日時を分解しているのか」が明確になり、変更箇所も減らせるため、処理が大きくなるほど管理しやすくなります。


✅ VBAでセルの時刻からHour・Minute・Secondを取得する方法

実際のExcel業務では、コード内に固定した時刻よりも、ワークシートに入力された日時を処理するケースの方が多くなります。勤怠データ、受付時刻、処理日時など、セルにはさまざまな時間情報が保存されています。ただし、セルに「9:30」と表示されているからといって、すべてのデータが同じ状態とは限りません。文字列として保存された値や空白、不正なデータが混ざる可能性もあります。

正常なデータだけを想定したコードは簡潔ですが、データ量が増えるほど想定外の入力によって処理が停止する可能性も高まります。まずは正常な時刻データを取得する基本を理解し、そのうえで入力チェックを加えることが重要です。

・セルに入力された日時を分解する実務的な例

セルA2に日時が入力されている場合は、次のように取得できます。

Sub GetTimePartsFromCell()

    Dim targetDateTime As Date
    Dim hourValue As Integer
    Dim minuteValue As Integer
    Dim secondValue As Integer

    ' セルから基準となる日時を一度だけ取得する
    targetDateTime = Range("A2").Value

    hourValue = Hour(targetDateTime)
    minuteValue = Minute(targetDateTime)
    secondValue = Second(targetDateTime)

    Range("B2").Value = hourValue
    Range("C2").Value = minuteValue
    Range("D2").Value = secondValue

End Sub

この例では、

  • A2:元となる日時
  • B2:時
  • C2:分
  • D2:秒

という形で分解しています。

セルをそれぞれの関数から直接参照することもできますが、今回はtargetDateTimeへ一度取得しています。

これにより、後から入力値のチェックを追加したり、取得元のセルを変更したりするときにも修正しやすくなります。

また、Hour・Minute・Secondは時刻を表示形式として分割しているわけではなく、値として時分秒を取り出している点も重要です。

「14:35:20」という表示文字列を単純に文字位置で切り分けるより、日時・時刻として正しく認識されているデータならHour・Minute・Secondを使う方が、表示形式の違いに依存しにくい処理を作れます。


✅ VBAのHour・Minute・SecondとNowを組み合わせて現在の時分秒を取得する

Hour・Minute・Secondを調べていると、「現在の時刻を取得する関数」と考えてしまうことがあります。しかし、この3関数だけでは現在時刻そのものを取得しているわけではありません。現在の日時を調べたい場合はNowなどで基準となる値を取得し、そこから必要な部分をHour・Minute・Secondで取り出します。この役割分担を理解しておくと、現在時刻の取得と時刻の分解を混同せずに済みます。

また、同じ処理の中でNowを何度も呼び出すより、一度取得した日時を基準にした方が処理の意図も明確です。特に秒単位を扱うコードでは、取得タイミングの違いも意識しておきたいポイントです。

・Nowから現在の時・分・秒を取得する例

現在日時を基準として時分秒を取得する場合は、次のように記述できます。

Sub GetCurrentTimeParts()

    Dim currentDateTime As Date
    Dim currentHour As Integer
    Dim currentMinute As Integer
    Dim currentSecond As Integer

    ' 判定基準となる現在日時を一度だけ取得する
    currentDateTime = Now

    currentHour = Hour(currentDateTime)
    currentMinute = Minute(currentDateTime)
    currentSecond = Second(currentDateTime)

    MsgBox "現在時刻:" & _
           currentHour & "時" & _
           currentMinute & "分" & _
           currentSecond & "秒"

End Sub

ここでNowを一度だけcurrentDateTimeへ格納しているのには理由があります。

次のように書くことも可能です。

currentHour = Hour(Now)
currentMinute = Minute(Now)
currentSecond = Second(Now)

通常は大きな問題になりませんが、それぞれが別のタイミングでNowを評価します。

たとえば処理が59秒から次の分へ切り替わる瞬間に実行された場合、取得タイミングによって値の組み合わせがずれる可能性を完全には排除できません。

同一時点の日時を分解したいのであれば、基準となるNowを一度だけ取得し、その値をHour・Minute・Secondへ渡す方が設計意図が明確です。

Hour・Minute・Secondは、このように現在日時やセルの値などから必要な要素を取り出すことで、時間帯による処理分岐にも発展させられます。

Hour・Minute・Secondは現在時刻を取得する関数ではないため、現在の時刻を基準に処理する場合はTimeやNowとの役割の違いを理解しておくことが大切です。現在時刻・現在日時の取得方法については、「【VBA】現在時刻を取得する方法|Time・Nowの違いと使い分け」で詳しく解説しています。

✅ VBAのHour・Minute・Secondを条件判定に活用する方法

Hour・Minute・Secondの実務的な使い道として代表的なのが、時刻の一部分を取り出して処理条件に利用する方法です。ただし、「17時以降」を判定するときにHourだけを見ればよいのか、それとも時刻全体を比較すべきなのかは、業務条件によって変わります。ここを曖昧にすると、「17時30分以降」のように条件が細かくなったときにコードを作り直すことになります。

また、Minuteは経過した分数を求める関数ではなく、時刻の「分」を取り出す関数であることにも注意が必要です。Hour・Minute・Secondは、時刻を分解した結果そのものに意味がある場合に向いています。業務上の条件と関数の役割を合わせて使うことが重要です。

・Hour関数で時間帯によって処理を分岐する例

たとえば、セルA2に記録された日時について、17時以降かどうかを判定するとします。

Sub CheckBusinessHour()

    Dim targetDateTime As Date
    Dim targetHour As Integer

    targetDateTime = Range("A2").Value

    ' 対象日時から「時」だけを取得する
    targetHour = Hour(targetDateTime)

    If targetHour >= 17 Then
        MsgBox "17時以降のデータです。"
    Else
        MsgBox "17時より前のデータです。"
    End If

End Sub

処理の流れは次のとおりです。

  1. セルA2から対象日時を取得する
  2. Hour関数で「時」を取り出す
  3. 取得した数値と17を比較する
  4. 条件に応じて処理を分岐する

この方法は、「17時台を含めて17時以降」のように時間単位で分類したい場合には分かりやすい書き方です。

一方、「17:30以降」のように分まで含めた正確な時刻で判定する場合は、HourとMinuteを複雑に組み合わせるより、時刻そのものを比較した方が分かりやすい場合があります。

Hour・Minute・Secondを使うかどうかは、「時刻を分解する必要があるか」で判断するとよいでしょう。

Hour・Minute・Secondは時刻の構成要素を取り出す関数であり、経過時間そのものを求める関数ではありません。開始時刻と終了時刻の差などを計算したい場合は、「【VBA】時間の計算ができる仕組みとは?シリアル値を理解して日付・時刻を正しく扱う方法」で、Excel・VBAにおける時刻計算の仕組みも確認してみてください。


 

✅ VBAのHour・Minute・SecondとTimeValueを組み合わせる方法

セルから取得した値が常にDate型の日時とは限らない点は、実務で特に注意したいポイントです。「9:30」のような文字列を扱う場合、時刻として適切に変換してからHourなどへ渡した方が、処理の目的を明確にできるケースがあります。ただし、TimeValueとHourは同じ種類の処理をする関数ではありません。

TimeValueは時刻として扱える値を取得し、Hour・Minute・Secondはその時刻をさらに分解する役割を持ちます。この違いを理解せずに関数を重ねると、不要な変換が増えてコードが読みにくくなります。「変換」と「分解」を別工程として考えるのがポイントです。

・文字列の時刻を変換してから時分秒を取り出す例

文字列として受け取った時刻を処理する例を見てみましょう。

Sub GetPartsFromTimeText()

    Dim sourceTimeText As String
    Dim convertedTime As Date
    Dim hourValue As Integer
    Dim minuteValue As Integer
    Dim secondValue As Integer

    sourceTimeText = "14:35:20"

    ' 文字列を時刻として扱える値へ変換する
    convertedTime = TimeValue(sourceTimeText)

    ' 変換した時刻から必要な要素を取り出す
    hourValue = Hour(convertedTime)
    minuteValue = Minute(convertedTime)
    secondValue = Second(convertedTime)

    MsgBox hourValue & "時" & _
           minuteValue & "分" & _
           secondValue & "秒"

End Sub

このコードでは、

  1. 元となる文字列を取得する
  2. TimeValueで時刻へ変換する
  3. Hourで「時」を取得する
  4. Minuteで「分」を取得する
  5. Secondで「秒」を取得する

という役割分担にしています。

処理を1行にまとめるなら、

hourValue = Hour(TimeValue(sourceTimeText))

とすることも可能です。

しかし、実務では変換後の値を別の判定でも利用したり、変換前に入力チェックを追加したりする可能性があります。

そのため、処理が発展する場合はconvertedTimeのような変数を設け、文字列→時刻→必要な要素を取得という流れがコードから読み取れるようにしておくと保守しやすくなります。

セルや外部データから取得した「14:35:20」のような文字列を時刻として扱う場合は、TimeValueの役割も理解しておくと処理を組み立てやすくなります。「【VBA】TimeValue関数の使い方|文字列を時刻に変換する方法と注意点」では、文字列を時刻へ変換する方法や入力値を扱う際の注意点を詳しく解説しています。


✅ VBAでHour・Minute・Secondを使うときの入力値に注意する

Hour・Minute・Secondは簡単に使える関数ですが、セルのデータが常に正しい日時とは限りません。特に利用者が手入力するシートでは、空白や文字列、入力ミスなどが混在する可能性があります。正常値だけでテストしたマクロが本番データで停止するのは、実務で起きやすい失敗の一つです。だからといって、すべてのエラーを無条件に無視すると原因調査が難しくなります。

重要なのは、関数を実行する前に「この値を日時として扱ってよいか」を確認することです。入力データを扱う処理では、正常系だけでなく異常系も意識して設計しましょう。

・IsDateで確認してから時分秒を取得する例

セルの値が日時として扱えるか分からない場合は、IsDateによる事前確認を組み合わせられます。

Sub GetTimePartsSafely()

    Dim sourceValue As Variant
    Dim targetDateTime As Date

    sourceValue = Range("A2").Value

    ' 日付または時刻として認識できる場合のみ処理する
    If IsDate(sourceValue) Then

        targetDateTime = CDate(sourceValue)

        Range("B2").Value = Hour(targetDateTime)
        Range("C2").Value = Minute(targetDateTime)
        Range("D2").Value = Second(targetDateTime)

    Else

        MsgBox "A2セルを日付・時刻として処理できません。"

    End If

End Sub

このコードでは、いきなりHour関数へセルの値を渡さず、まずsourceValueへ取得しています。

その後、

If IsDate(sourceValue) Then

によって判定し、日時として解釈できる場合だけ後続処理を行います。

さらにCDateによってDate型へ変換してから3つの関数へ渡すことで、入力確認→型変換→時刻の分解という処理の役割を明確にしています。

ただし、IsDateがTrueだからといって、その値が業務上正しいデータとは限りません。

たとえば業務ルールとして「8:00~20:00のみ許可する」のであれば、日時として認識できるかを確認した後、さらに許可する時間帯かを判定する必要があります。

関数によるデータ型の確認と、業務上の入力チェックは分けて考えることが大切です。

セルから取得した値をHour・Minute・Secondへ渡す前に確認する場合は、IsDateだけでなくCDateやVarTypeなどの違いも理解しておくと、入力データに応じた処理を設計しやすくなります。詳しくは「【VBA】日付かどうか判定する方法|IsDate・CDate・DateValue・VarTypeの使い分け」も参考にしてください。

また、文字列やセルの値をDate型へ明示的に変換する場合は、CDateを含む型変換関数の特徴を理解しておくことも重要です。「【VBA】型変換(CInt/CLng/CStr/CDate)の使い分けと注意点|実務のデータ処理」では、データ型に応じた変換方法を整理しています。


✅ VBAのHour・Minute・SecondとFormat関数の違い

Hour・Minute・SecondとFormatは、どちらも日時の一部分を扱えるため、使い分けに迷いやすいところです。たとえば「14:35」から「14」を取り出すだけなら、見た目上は似た結果を作ることもできます。

しかし、取得後のデータを計算や条件判定に使うのか、表示用の文字列として使うのかによって適切な方法は変わります。この違いを意識せずにFormatを多用すると、後から数値として比較したいときに再変換が必要になる場合があります。反対に、画面表示だけが目的なのに時分秒を一つずつ結合するとコードが長くなります。最終的な利用目的から関数を選ぶことが重要です。

・計算や判定ならHour、表示ならFormatを検討する

たとえばHourを使用すると、

hourValue = Hour(targetDateTime)

のように「時」を数値として取得できます。

一方、日時を表示用の文字列に整えるなら、

formattedTime = Format(targetDateTime, "hh:mm:ss")

のようにFormatを使えます。

目的を整理すると、次のようになります。

やりたいこと適した方法
「時」を数値として取得するHour
「分」を数値として取得するMinute
「秒」を数値として取得するSecond
時分秒を使って条件判定するHour・Minute・Secondなど
「14:35:20」のように表示を整えるFormat
現在日時を取得するNow
文字列を時刻へ変換するTimeValue

たとえば、

If Hour(targetDateTime) >= 17 Then

のような判定ではHourの役割が明確です。

一方、帳票へ「14:35:20」のような文字列を出力したいだけなら、Hour・Minute・Secondを個別に取得して連結するよりFormatを利用した方が簡潔になる場合があります。

値を分解して処理したいのか、表示形式を整えたいのかを基準に選ぶと、不要な型変換を減らせます。

日時から時・分・秒を数値として取り出すのではなく、「09:05:03」のように表示形式を整えた文字列が必要な場合はFormat関数が適しています。日付や時刻を含む値の書式変換については、「【VBA】Format関数で文字列に変換する方法|日付・数値・表示形式を完全整理」で詳しく解説しています。


 

✅ VBAでHour・Minute・Secondを実務利用するときの設計ポイント

実務コードでは、Hour・Minute・Secondを使えること以上に、どの段階で使うかが重要です。日時の取得、入力チェック、型変換、時分秒の抽出、業務条件の判定を一度に書くと、最初は短くても仕様変更によって複雑になりやすくなります。

また、「時刻を取得する処理」と「時刻を分解する処理」を混同すると、TimeやNow、TimeValueとの役割も分かりにくくなります。後から別の担当者が修正する可能性があるコードでは、処理の段階が読み取れる構成にしておくことが大切です。必要以上に変数を増やす必要はありませんが、業務上意味のある値には分かりやすい名前を付けましょう。小さな時刻処理でも、この考え方が保守性につながります。

・時刻処理を役割ごとに分けて考える

Hour・Minute・Secondを利用する処理では、次のように段階を分けると整理しやすくなります。

  1. セルや変数から元データを取得する
  2. 日付・時刻として扱える値か確認する
  3. 必要に応じてDate型や時刻へ変換する
  4. Hour・Minute・Secondで必要な要素を取得する
  5. 取得した数値を業務条件の判定に使用する
  6. 必要であれば結果をセルやメッセージへ出力する

たとえば「Hourが17以上なら処理する」というコードだけを見れば簡単です。

しかし、実際の業務では「セルが空白ならどうするのか」「文字列として時刻が入っていたらどうするのか」「17:30以降という条件へ変わったらどうするのか」といった仕様が後から追加されることがあります。

そのため、Hour・Minute・Secondにすべての役割を持たせようとせず、取得・変換・分解・判定を分けることが重要です。

また、単純に現在時刻そのものが必要ならTimeやNow、文字列を時刻へ変換するならTimeValue、表示用の文字列を作るならFormatというように、目的に適した機能を組み合わせることでコードを読みやすくできます。


✅ まとめ:VBAのHour・Minute・Secondで時分秒を正しく取得しよう

Hour・Minute・Secondは、日時や時刻から必要な要素だけを数値として取得できるVBA関数です。

  • Hour関数は「時」を取得する
  • Minute関数は「分」を取得する
  • Second関数は「秒」を取得する
  • 3つの関数は現在時刻そのものを取得する機能ではない
  • Nowなどで取得した日時をHour・Minute・Secondで分解できる
  • 同一時点の現在日時を分解するなら、Nowを一度変数へ取得すると分かりやすい
  • セルの日時から時分秒を個別に取り出すこともできる
  • Hourを使えば時間帯を基準とした条件分岐にも活用できる
  • 文字列の時刻は、必要に応じてTimeValueで時刻へ変換してから分解する
  • 入力データを扱う場合はIsDateなどによる事前確認も検討する
  • Hour・Minute・Secondは値の取得、Formatは主に表示用の整形という違いを意識する
  • 時刻の取得・変換・分解・判定を分けて設計すると保守しやすい

Hour・Minute・Secondは構文だけなら非常にシンプルですが、重要なのは「時刻を取得する関数」ではなく「日時・時刻から必要な構成要素を取り出す関数」として理解することです。

現在日時ならNow、文字列から時刻へ変換するならTimeValue、時分秒を取り出すならHour・Minute・Secondというように役割を分ければ、時刻を扱うVBAコードをより分かりやすく設計できます。

    -VBAで自動化, VBA一覧, 日付・時刻, 配列・データ操作