HOME > 即効テクニック > AccessVBA > 日付・文字列操作・演算 > 日付/時刻型のデータから経過時間を算出する

即効テクニック

日付・文字列操作・演算

日付/時刻型のデータから経過時間を算出する

(Access 97)
● 概要 ●
日付/時刻型データの有効範囲は、0:00:00〜23:59:59です。2つのデータの経過時間を算出した場合23:59:59以上のときには日付/時刻型では表示することができません。
ここでは、日付/時刻型データ間の経過時間を算出し、結果の値をテキスト型で表示させるサンプルを説明します。

● 準備 ●
(1) 新規標準モジュールを用意し、以下のプロシージャを記述します。
(2) [経過時間]テーブルを作成します。
    フィールド名   データ型
    -------------  -----------
    開始時刻       日付/時刻型
    終了時刻       日付/時刻型
    経過時間       テキスト型

● サンプルコード ●

'【引数説明】
'Time1  :開始時刻
'Time2  :終了時刻
'Term   :0=経過時間を最大とする 1=経過日数を使う 2=経過週数を使う
'戻り値  :テキスト型の経過時間
Public Function PassTime(Time1 As Date, _
                         Time2 As Date, _
                         Optional Term As Integer = 0 _
                       ) As String
    '初期設定
    Dim dt As Long      '総経過秒数
    Dim h  As String    '経過時間
    Dim m  As String    '経過分数
    Dim s  As String    '経過秒数
    Dim d  As String    '経過日数
    Dim w  As String    '経過週数
    Dim h2 As String    '日数・週数を使う場合の経過時間
    Dim d2 As String    '週数を使う場合の経過日数
    
    On Error GoTo Func_Err:

    '経過時間計算
    '引数の差を秒数で取得
    dt = Abs(DateDiff("s", Time1, Time2))
    '時間を取得
    h = Format(dt \ 60 ^ 2, "00")
    '分を取得
    m = Format((dt Mod 60 ^ 2) \ 60 ^ 1, "00")
    '秒を取得
    s = Format(((dt Mod 60 ^ 2) Mod 60 ^ 1) \ 60 ^ 0, "00")
    
    '日数を取得
    d = CStr(h \ 24) & "日"
    '週数を取得
    w = CStr(h \ 24 \ 7) & "週"
    '経過時間2を取得
    h2 = Format(h Mod 24, "00")
    '経過日数2を取得
    d2 = CStr(h \ 24 Mod 7) & "日"

    '引数によって経過日・経過週の使用を判断
    Select Case Term
        Case 0
            PassTime = h & ":" & m & ":" & s
        Case 1
            PassTime = d & h2 & ":" & m & ":" & s
        Case 2
            PassTime = w & d2 & h2 & ":" & m & ":" & s
        End Select

Func_Exit:
    Exit Function

Func_Err:
    MsgBox "Error Number : " & Err.Number & vbCrLf & Err.Description
    GoTo Func_Exit:
End Function

'実行プロシージャ
Private Sub SetPassTime()
    Dim Rst As DAO.Recordset
    Set Rst = CurrentDb.OpenRecordset("経過時間")
    
    Do Until Rst.EOF
        Rst.Edit
        Rst![経過時間] = PassTime(Rst![開始時刻], Rst![終了時刻], 2)
        Rst.Update
        Rst.MoveNext
    Loop
    
    Rst.Close
    Set Rst = Nothing
End Sub


● 動作確認 ●
  [経過時間テーブル]の[開始時刻]と[終了時刻]に適当なデータを入力し、サンプルプロシージャSetPasTimeを実行して下さい。
  サンプルではPassTime関数の第3引数を設定しているので、経過週数と経過日数も表示されます。
  この時、入力データが9:00:00のような時刻のみだとエラーが発生します。
第3引数を設定する場合には、処理データに日付が含まれることを確認して下さい。

● 詳細 ●
日付/時刻型データは時刻を表わします。20:15:00ならば、20時間15分00秒という「時間」ではなく、20時15分00秒という「時刻」を表わします。
よって2つの日付/時刻型データから算出した経過時間は、日付/時刻型フィールドには格納できませんので、プロシージャの戻り値の経過時間はテキスト型データにします。
サンプルでは、まず2つの時刻の差を秒数で取得し、それを時間・分・日・週といった別の単位に変換していきます。第3引数が設定されている場合には、日・時間が上位の単位によって変わってきますので注意が必要です。