Accessのテーブルに保存した時刻データをExcelへエクスポートすると、「1900/1/0 12:30:00」のように日付部分が勝手に追加されてしまうことがあります。これはAccessとExcelで時刻データを扱う仕組みが異なることが原因です。
特にAccessの日付時刻型は日付と時刻をセットで管理しているため、時刻だけを表示したい場合でもExcel側では日付シリアル値として解釈されることがあります。この記事では、文字列変換ではなくExcel上でも計算可能な時刻データとして扱えるエクスポート方法を解説します。
Accessの時刻データに1900/1/0が付く理由
Accessの日付時刻型は、内部的には日付と時刻を1つの数値として保存しています。整数部分が日付、小数部分が時刻を表す仕組みです。
例えば、Accessで「12:30:00」と表示されているデータも、内部的には「日付シリアル値+時間情報」として管理されています。そのためExcelへ出力すると、Excelが日付情報も含んだ値として認識し、「1900/1/0 12:30:00」のような表示になる場合があります。
これはデータが壊れているわけではなく、Excel側の表示形式が日付を含む形式になっていることが原因です。
方法1:Access側で時刻だけを取得してエクスポートする
最も簡単な方法は、Accessのクエリで時刻部分だけを取り出してからExcelへ出力する方法です。
クエリではFormat関数を使用します。
Format([時刻フィールド],"hh:nn:ss")
例えば、テーブルの「開始時刻」というフィールドをExcelへ出力する場合、以下のようなクエリを作成します。
SELECT Format([開始時刻],"hh:nn:ss") AS 開始時間 FROM テーブル名;
この方法では「12:30:00」のような表示になります。ただし、このままだと文字列になるため、Excel側で時間計算を行う場合は次の方法がおすすめです。
方法2:Excel側で時刻形式として認識させる設定
Excelでは、時刻データは表示形式を変更することで日付部分を非表示にできます。
Accessからエクスポートした後、Excelで対象セルを選択し、セルの書式設定を開きます。
- セルを右クリック
- 「セルの書式設定」を選択
- 「表示形式」から「ユーザー定義」を選択
- 種類に「hh:mm:ss」と入力
この設定を行うと、内部データは日付を含んだままでも、画面上は時刻だけを表示できます。
例えば、Excel内部では「1900/1/0 08:15:30」と保持されていても、表示形式を「hh:mm:ss」に変更すれば「08:15:30」と表示されます。
方法3:AccessのクエリでExcel向けの時刻データを作成する
Excelで合計時間や平均時間を計算したい場合は、文字列ではなく数値形式の時刻として渡すことが重要です。
その場合はFormat関数ではなく、元の日付時刻型フィールドをそのままエクスポートし、Excel側で表示形式だけ変更する方法が適しています。
例えば勤務時間の平均を計算する場合、文字列の「08:30:00」では計算対象になりませんが、Excelの時刻値として保持されていれば、AVERAGE関数などで正しく計算できます。
=AVERAGE(B2:B10)
のような計算式で平均時間を求めることができます。
VBAを使ってエクスポート時に時刻形式を指定する方法
定期的にAccessからExcelへ出力する場合は、VBAでExcel側の表示形式を設定する方法もあります。
例えば、エクスポート後にExcelの対象列へ以下のような書式設定を行います。
Columns("B:B").NumberFormat = "hh:mm:ss"
この方法なら、データの形式を維持したまま、表示だけを時刻形式に変更できます。
業務システムなどで毎日同じ形式の帳票を作成する場合は、VBAによる自動設定が便利です。
時刻データを文字列に変換しないほうがよいケース
時刻を「12:30:00」という文字として保存すると、人間には見やすくなりますが、Excelでは時間計算ができなくなる場合があります。
例えば、勤務時間の集計や作業時間の平均計算を行う場合、文字列ではなくExcelが時刻として認識できる値で保持する必要があります。
そのため、単純な表示目的ならFormat関数、計算目的なら日付時刻型のままエクスポートしてExcelで表示形式を変更する方法がおすすめです。
まとめ
AccessからExcelへ時刻データをエクスポートした際に「1900/1/0」が表示されるのは、Accessの日付時刻型とExcelの日時管理方法の違いによるものです。
Excelで時刻の合計や平均などの計算を行いたい場合は、文字列変換せずにデータを保持し、Excel側で表示形式を「hh:mm:ss」に変更する方法が最も適しています。
一方、表示だけを整えたい場合はAccessのFormat関数で時刻部分だけを取得する方法も利用できます。用途に合わせて、データ形式を維持する方法と表示だけ変更する方法を使い分けることが重要です。


コメント