本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[ACC2]日付/時刻型の時間計算

文書番号: 402099

最終更新日: 2003/05/28


この資料は以下の製品について記述したものです。

この記事は、以前は次の ID で公開されていました: JP402099

概要

日付/時刻型のデータは、Access の内部において倍精度浮動少数点型で処理をしており、 任意の日付を起点にした現在までの差分によって時刻を表示しています。そのため、日付 /時刻型のデータを直接合計してしまうと、思いどうりの結果を得ることができません。 したがって、日付/時刻型のデータをいったん、テキスト型に変換し、時、分、秒をそれ ぞれ別々に計算します。ここでは、日付/時刻型のデータの合計を hh:mm:ss の形で算出 するサンプル プロシージャを紹介します。

現象

操作 方法

一般的に時間計算は、時、分、秒単位で繰り越し処理が必要になります。たとえば 35 分と 45 分を足した結果は 80 分ですが、これを 1 時間 20 分と表示する場合です。
次のサンプルではこの点を考慮し、タイム カードの日付/時刻型データの出社時間と退社 時間から就業時間を算出し、1 ケ月間の就業時間を合計する方法を紹介します。なお、こ こでは [タイムカード 1] テーブルが作成されていることを前提として説明します。

■ 操作 手順

  1. [タイムカード 1] テーブルを以下のように作成します。
    [GRAPHIC: ]
  2. 次に、後述の『サンプル プロシージャ』を参考にして [タイムカード 1] テーブルの [就業時間]フィールドのデータを合計するモジュールを作成します。
  3. [タイムカード 1] テーブルを元にフォームを新規作成します。 データベース ウィンドウ上で、フォーム オブジェクトボタンを選択し、次に <新規作成> ボタンを選択します。
  4. [フォームの新規作成] ダイアログ ボックス上で、[テーブル/クエリーの選択] リストから "タイムカード 1"を選択し、続けてフォーム ウィザードを起動します。 なお、Access 2.0 では、オート フォーム ウィザードを利用すると、以下 5 の手順を省略することができます。
  5. フォーム ウィザードの手順にしたがって、すべてのフィールドを対象に表形式のフォームを作成してください。ここでは、フォームのタイトルを "タイムカード 1" と 入力します。
  6. デザイン ビューで、フォーム フッター セクションに非連結のテキスト ボックスを 追加します。ツールボックスを表示されていない場合には、[表示] - [ツール ボックス] コマンドを選択してください。
  7. 非連結のテキスト ボックスのプロパティシートを開き、[コントロール ソース]プロパティに、作成したプロシージャー名を入力します。 コントロール ソース: =AddTimes() 以下に示すフォームデザインにしたがって作成してください。
    [GRAPHIC: ]
  8. <フォーム ビュー> ボタンを押してフォームを開くと、[就業時間の合計] テキスト
    [GRAPHIC: ]

サンプル プロシージャ

プロシージャ内で行の右端にある_ (アンダースコア) は、次の行に続くことを示します。
実際にプロシージャにコードを入力する場合は、_ (アンダースコア) を消して 継続して 入力してください。
  Function AddTimes()
  '変数 Totalhrs、Totalmin、Totalsec、h、m を整数型に定義し、MyDB は Database
  'オブジェクト型変数、MyTable は Table オブジェクト型変数に定義します。
  'MyDB は、カレント データベースを参照します。
      Dim Totalhrs As Integer, Totalmin As Integer, Totalsec As Integer
      Dim h As Integer, m As Integer
      Dim MyDB As Database, MyTable As Recordset
      Set MyDB = DBEngine(0)(0)
  '[タイムカード 1] テーブルを開き、レコードを MyTable に書き込みます。
  ' Totalhrs、Totalmin、 Totalsec を初期化します。
      Set MyTable = MyDB.OpenRecordset("タイムカード 1" , DB_OPEN_TABLE)
      Totalhrs = 0
      Totalmin = 0
      Totalsec = 0
  'While から Wend に定義されたプロシージャーは、最終行のレコードでない限り
  '繰り返します。
  '[タイムカード 1] テーブルの [就業時間] のデータをバリアント型の日付/時刻型に
  '定義し、Hour 関数で時刻をもとにした整数にします。同様に Totalmin は分、
  'Totalsec は秒をもとにした整数にします。
  'その結果をそれぞれの時間単位の変数に加算します。すべての処理が終ったら、
  '次のレコードに移動します。
      While Not MyTable.EOF
          Totalhrs = Totalhrs + Hour(CVDate(MyTable!就業時間))
          Totalmin = Totalmin + Minute(CVDate(MyTable!就業時間))
          Totalsec = Totalsec + Second(CVDate(MyTable!就業時間))
          MyTable.MoveNext
      Wend
  '秒数の合計値を 60 で除算し、整数部分とその余りを分けて単位ごとに調整します。
      m = Int(Totalsec / 60)
      Totalsec = Totalsec Mod 60
      Totalmin = Totalmin + m
  '分数の合計値を 60 で除算し、整数部分とその余りに分けて単位ごとに調整します。
      h = Int(Totalmin / 60)
      Totalmin = Totalmin Mod 60
      Totalhrs = Totalhrs + h
  'プロシージャの戻り値を代入し、テキスト型に設定します。1 時間 1 分 1 秒ならば
  '01:01:01 という形式で表示されます。
      AddTimes = Format(Totalhrs, "00") & ":" & Format(Totalmin, "00") &       _
                  ":" & Format(Totalsec,"00")
  End Function

Keywords: KBHOWTO KB402099
Technology: kbAccess200 kbAccessSearch

inserted by FC2 system