シリアル値
提供: ExcelPedia
目次 |
概要
シリアル値とは
Excelにおける、日付や時刻を表現する数値。整数部分を日付、小数部分を時刻に割り当てることによって、一つの数値で日付と時刻を同時に表現することができる。
日付
日付のシリアル値
1900 年 1 月 1 日 を基点(=1)として、1日経過ごとに1加算される、日付の連番(serial number)を日付のシリアル値(serial values)と表現する。Windows版の規定の設定では 1900 年 1 月 1 日 を 数値の1として表現し、例えば、2009 年 11 月 10 日は 数値の 40,127 で表現される。これは1900 年 1 月 1 日 を1日目としたときに 40,127 日目であることを表現している。
扱える日付の範囲
次のような範囲で扱うことが可能。
| A | B | C | D | E | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 |
| ||||||||||||||||||||||||||||||||||
| 2 | |||||||||||||||||||||||||||||||||||
| 3 | |||||||||||||||||||||||||||||||||||
| 4 | |||||||||||||||||||||||||||||||||||
| 5 | |||||||||||||||||||||||||||||||||||
| 6 | |||||||||||||||||||||||||||||||||||
表のセル部分のみコピーし、ワークシートに貼り付けて、試すことが出来ます。
Internet Explorer 普通に貼り付け / FireFox [ 形式を選択して貼り付け ] - [ テキスト ]
値と表示の関係
「1900 年 1 月 1 日が表示されているセルには 1 というシリアル値が入力されている」と言うような、セルに返っている数値そのものををシリアル値と表現するのは厳密には正しくない。
- セルに返っている値自体は数値である。
- シリアル値はエクセルの内部で「 日付 に対して割り当てられている 連番 」である。
- 書式設定の表示形式はセル及び数式バーへの「数値の表示の仕方」を変更するものである。
つまり、表示が時刻や日付だからと言って、セルに返されている数値が特別な性格の数値に変化するということではない。「数値」と「シリアル値」の二つを「表示形式」が取り持って日付が表示されている。しかしながら、関数のHelpをはじめ、多くの文献では、日付や時刻に関係する数値をシリアル値と表現しているので、混乱を避けるために、以下の解説では日付・時刻に関連する数値のことをシリアル値と呼ぶこととする。
日付システムの問題点
1900年1月1日以前の日付が入力できない
エクセルの仕様として、1899年1月1日 以前の日付を日付として入力することが出来ない。同様に、9999年12月31日より未来の日付も日付として入力できない。これらの仕様外の入力は、文字列として確定される。また、仕様外の範囲の数値が日付表示形式のセルに返っている場合には、エラー:#######表示となる。
実在しない日付
エクセルの日付システムの中には、実際には存在しない日付、「1900年2月29日」が存在する。グレゴリオ暦では
- 4で割り切れる年は閏年とする
- 100で割り切れる年は閏年ではないが、400で割り切れる年は閏年とする
という概ね上記のようなルールで閏年を判定している。ここで、1900年は本来閏年ではないが、「エクセルでは」閏年として扱っている。このため、1900年1月1日から起算した場合、1900年3月1日以後の日付連番は実際の日数よりも 1 大きい数値となる。これに対し、Excel VBA では、平年扱いとなっており、ユーザー定義関数(UDF)を作成して計算する場合には、この点を考慮して設計する必要がある。
[参考/エクセルの学校] 20030916180306『シリアル値について』 20040109220943『平成壱五年壱弐月参壱日と表示させるには』
時刻
時刻のシリアル値
日付が整数の数値として表現されるなら、時刻は 1900 年 1 月 1 日から起算して n 日目から (n + 1)日目 までの途中経過部分と言う意味で、小数値の部分として表現される。
日付と時刻を数値として表現すると、次のような関係になる。
- 1900 年 1 月 1 日 00:00:00 = 1.000
- 1900 年 1 月 1 日 12:00:00 = 1.500
- 1900 年 1 月 2 日 12:00:00 = 2.500
- ・
- ・
- ・
- 2009 年 11 月 10 日 00:00:00 = 40,127.000
- 2009 年 11 月 10 日 03:00:00 = 40,127.125
- 2009 年 11 月 10 日 06:00:00 = 40,127.250
- 2009 年 11 月 10 日 12:00:00 = 40,127.500
- 2009 年 11 月 10 日 23:59:59 = 40,127.9999884259
また、ある時点から時間が経過した場合は次のように数値が増加する。
- 「1時間経過」すると「1/24」増加する(1日は24時間)
- 「1分間経過」すると「1/1440」増加する(1日は1440分間)
- 「1秒間経過」すると「1/86400」増加する(1日は86400秒間)
扱える時刻の範囲
次のような範囲で扱うことが可能。
| A | B | C | D | E | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 |
| ||||||||||||||||||||||||||||||||||
| 2 | |||||||||||||||||||||||||||||||||||
| 3 | |||||||||||||||||||||||||||||||||||
| 4 | |||||||||||||||||||||||||||||||||||
| 5 | |||||||||||||||||||||||||||||||||||
| 6 | |||||||||||||||||||||||||||||||||||
表のセル部分のみコピーし、ワークシートに貼り付けて、試すことが出来ます。
Internet Explorer 普通に貼り付け / FireFox [ 形式を選択して貼り付け ] - [ テキスト ]
値と表示の関係
タテマエ上、シリアル値は「1」からスタートしていることになっているが、24時間未満の時刻計算に対応する為、「0」からスタートする仕様となっている。 0:00 ~ 23:59:59.9 ( 0 ~ 0.999998842592593 )のシリアル値は、セルの書式設定 の 表示形式 を 日付形式 の 「yyyy/m/d h:mm:ss.0」 に設定した場合、日付部分は「1900/1/0」と表示される。
時刻形式で入力された文字列は、入力確定時にシリアル値に基づいて数値に変換される。また、入力された時刻文字列にもとづいて自動的に表示形式が選択される。入力結果が数値に変換されるので、時刻は計算が可能となる。セルの書式設定の表示形式を時刻カテゴリから選択している場合には、24時間を超える部分については「日付」のシリアル値に繰上げされる形となり、1日未満の時刻部分のみが表示される。(【参考】「24時間以上の時刻表示」)
24時間以上の表示方法を時刻表示形式から選択できないという点は、初心者にはやや不親切な仕様となっている。
時刻計算の問題点
マイナス時刻が表示できない
セルにマイナス値が返っている場合は時刻の表示形式を選択している場合、通常エラー:#######表示となる。これはエクセルの仕様である。エラー表示となっていても、マイナスの数値としては有効なので、計算にはそのまま使用することが出来る。
計算時の誤差
時刻(時間)を扱う計算をエクセルで行った場合、次のような場合に、結果が意図しないものとなるときがある。
- 「日付と時刻を含んだシリアル値からある時刻を加算(減算)したもの」と、「直接入力の日付や時刻」とを比較した場合。
- 「複数の時刻を加算(減算)したもの」と、「直接入力の時刻」とを比較した場合。
つまり、[計算結果としてのシリアル値] = [定数シリアル値] などのような比較演算を行ったときに、論理的には「等しい」と判断されるべきものが「等しくない」と判断されるケースがある。これは次のようなことが原因となっている。
- 小数計算に精度の限界がある。
- 時刻入力によってセルに確定される小数値が概算値である。
- エクセルが扱うことの出来る数値の有効桁数が 15 桁である。
1. については浮動小数点演算の誤差の問題であり、純粋に技術上の問題である。
2. については、エクセルの内部処理の問題である。既出のように、「1時間=1/24」「1分間=1/1440」「1秒間=1/86400」として定義されているが、これらはそれぞれ割り切れない小数となる。
- 時刻 T1 が時刻 T2 の 1 秒後であるときの 時刻の差 T1 - T2
- 時刻 T3 が時刻 T4 の 1 秒後であるときの 時刻の差 T3 - T4
これら A と B の時刻の差は論理的にはともに 1 秒間であるが、エクセル上で比較すると、「等しくない」と判断されるケースが存在する。 1 / 86400 が割り切れない少数である為に、86400 秒の、時刻間隔の全てを 等差 とすることが出来ない。ゆえに、時刻入力によってセルに保持されるシリアル値は概算値であり、その概算値と、概算値同士の計算結果とを比較しても期待する比較結果を得られないことが発生する。
3. については、日付と時刻を含むシリアル値同士の演算時に問題となる。次の簡単な例で検証できる。
| A | B | C | D | E | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 |
| ||||||||||||||||||||||||||||||||||
| 2 | |||||||||||||||||||||||||||||||||||
| 3 | |||||||||||||||||||||||||||||||||||
| 4 | |||||||||||||||||||||||||||||||||||
| 5 | |||||||||||||||||||||||||||||||||||
| 6 | |||||||||||||||||||||||||||||||||||
表のセル部分のみコピーし、ワークシートに貼り付けて、試すことが出来ます。
Internet Explorer 普通に貼り付け / FireFox [ 形式を選択して貼り付け ] - [ テキスト ]
上記のワークシートで、A3の計算結果と、A4の直接入力の時刻とは概念的には同じ時刻となるはずだが、B3セルでの比較演算の結果はFALSE(虚偽)となる。これは、先の 1. 2. の問題もからんでおり、さらに、日付が進んで整数部分の桁が大きくなると演算上の誤差が拡大する。以上の結果から、時間計算においてはあまり高い精度の計算結果を求めることは出来ず、また、計算結果に対して、これら小数誤差を解消する為の丸め処理が必要になる。
[参考]時刻計算誤差の解消方法
24時間以上の時刻表示
結果が24時間以上の時刻となるような時刻計算の場合、セルへの表示が 24時間 で割ったあまりの時刻の表示となる場合がある。これはエクセルが「24時間以上(数値の整数部分)は『日付』、24時間未満(数値の小数部分)を『時刻』として表示」する仕様のためである。この現象はセルの表示上の問題である為、セルの書式設定の表示形式を「シリアル値の日付部分を時刻として表示」するようにユーザー定義することで解決することが出来る。
- 24時間以上の時間表示の手順(h:mm:ss形式)
- 表示形式のユーザー定義での方法
- 対象セルを選択し、メニュー[書式]-[セルの書式設定]-[表示形式]タブ選択
- [分類]で[ユーザー定義]を選択し、[種類]の欄へ [h]:mm:ss と入力
- [OK]ボタンクリック。
- セルへの直接入力による方法
- 対象セルを選択し、 25:00 などと24時間を越える時刻を入力
- 25:00:00 と表示されるので、Deleteキー などで値クリア
- h:mm形式に変更する場合は [セルの書式設定]-[表示形式]-[分類]で[ユーザー定義]を選択し、[種類]の欄を [h]:mm に編集
1904年日付システム
日付と時刻の関数
| この「シリアル値」はExcelの仕様に関連した書きかけ項目です。この記事を加筆・訂正などして下さる協力者を求めています。 |
