日付を入力したはずのセルに「46285」と表示されて、驚いたことはないでしょうか。CSVを開いたら日付の列が数字だらけだった、という場面もあります。
日付が壊れたわけではありません。Excelは日付を「シリアル値」という数字で保存していて、表示形式で日付らしく見せているだけです。この記事では、日付が数字になる仕組みと、VBA・Power Queryで扱うときの違いを整理します。確認はExcel 16.0(Windows、日本語環境)で行いました。他のバージョンやMac版、日本語以外の環境は未検証です。
想定読者
- 日付のセルが急に数字に見えて困った方
- VBAやPower Queryで日付を扱い始めた方
- 日付の計算や変換が合わない原因を知りたい方
まず対処:表示形式を日付に戻す
数字に見えるセルを選び、表示形式を「短い日付形式」などに変えます。VBAなら次の1行です。
Range("A1").NumberFormat = "yyyy/mm/dd"
値は変わらず、見え方だけが変わります。46285が「標準」では数字、「yyyy/mm/dd」では2026/09/20と表示されました。
日付はシリアル値という数字
Excelは日付を、1900年1月1日を1とした通し番号で保存します。2026年9月20日は46285です。上限は9999年12月31日の2958465です。
時刻は1日を1とした小数で表します。0.5は12:00、0.75は18:00です。46285.5なら「2026/09/20 12:00」になります。
表示形式を「標準」にすると数字が見え、「yyyy/mm/dd」にすると日付に見えます。中身は同じ数字です。数字だから、日付どうしの引き算で日数が出ます。

時刻の文字列を変換するときの落とし穴は、TIMEVALUEが24時間以上で誤る原因と対処で書いています。
VBAでの扱い
VBAのDate型も、中身は数字です。CDblで数字に、CDateで日付に変換できます。
Sub DateDemo()
Dim d As Date
d = CDate(46285)
Debug.Print Format(d, "yyyy/mm/dd")
Debug.Print CDbl(d)
Range("A1").Value = d
Range("B1").Value2 = d
End Sub
押さえておきたい点は4つです。
- セルの読み取りは、Valueが日付型、Value2が数値型(Double)で返ります。
- 書き込みは、Valueだと日付の表示形式が付き、Value2だと標準のままです。今回の環境では、A1が
m/d/yyyy、B1が標準で、B1は46285と表示されました。 - Formatの戻り値は文字列です。計算には使えません。
- IsDateは文字列の日付に使います。数値の46285はFalseになり、CDate(“abc”)は実行時エラー13です。文字列からの変換結果はPCの日付設定に左右されるため、日本語以外の環境は未検証です。
なお、1900年1月1日はExcelでは1、VBAでは2です。3月1日以降は、どちらも61で一致します。Excelのシリアル値60は、実在しない「1900/02/29」と表示されます。
Power Queryでの扱い
Power Queryでは、Date.Fromで数字を日付に、Number.Fromで日付を数字に変換できます。
let
Source = Excel.CurrentWorkbook(){[Name = "tblSrc"]}[Content],
ToDate = Table.TransformColumns(Source, {{"Num", Date.From, type date}})
in
ToDate
tblSrcはシートのテーブルで、Num列に46285が入っている前提です。結果は次のとおりです。
- Date.From(46285)は2026/09/20です。
- Date.From(46285.9)も2026/09/20で、時刻部分は切り捨てられます。
- DateTime.From(46285.5)は2026/09/20 12:00:00です。
- Number.From(#date(2026, 9, 20))は46285です。
Power Queryの起点は1899/12/30です。1900/3/1以降はExcelと一致しますが、Date.From(1)は1899/12/31になります。
シートから読み込むと、数字のセルは数値型、文字列の日付は文字列型で届きます。日付の表示形式のセルは、日時型(datetime)で届きました。どれもDate.Fromで日付にできます。型が違う列を結合できない問題は、キーの型がバラバラで結合できない時の対処法で扱っています。
JSONから時刻を取り込むと、9時間ズレて届くことがあります。原因と変換方法は、【Power Query】時刻が9時間ズレる原因とタイムゾーン変換で扱っています。
よくある失敗
1. 見た目だけが日付の文字列
「2026/09/20」と見えても、文字列のことがあります。文字列の日付どうしの引き算は19と計算できるので、気づきにくいのが厄介です。一方でSUMは0になり、MATCHで数値の日付を探すと#N/Aになります。ISNUMBERで数値かどうかを確認し、DATEVALUEでシリアル値に変換します。
検索値と検索範囲で数値と文字列が食い違うと、VLOOKUPやMATCHが #N/A を返します。見えない文字も含めた確認の手順は、【Excel関数】#N/A・#VALUE!・#REF!が出たら最初に確認にまとめています。
2. 数字に日付の表示形式を付けてしまう
商品コードの10001に日付の表示形式を付けると、1927/05/19に見えます。値は10001のままです。
3. 1904年日付システムのブック
ブックによっては、1904年1月1日を起点にした日付システムが使われています。Microsoftの説明では、1900年システムとの差は1,462日です。同じ46285でも、日付が4年と1日ずれて見えます。実機でも、日付システムを切り替えると中身は46285のまま、表示だけが2030/09/21になりました。同じ日付を入れ直すと、シリアル値は44823です。
応用例:日付と時刻を分ける
INTで日付部分、MODで時刻部分を取り出せます。46285.75なら、INTが46285、MOD(46285.75, 1)が0.75です。時刻を15分単位に丸めるときは、丸める順序で結果が変わります。詳しくは時間の丸めは順序で結果が変わる理由と対処を参照してください。
まとめ
- Excelの日付は整数、時刻は小数のシリアル値です。数字に見えるのは表示形式の違いです。
- VBAはValueとValue2、CDateとFormat。Power QueryはDate.FromとNumber.Fromで変換します。
- 文字列の日付と1904年システムに注意します。迷ったらISNUMBERで確認します。


コメント