「セルに数字を入れたら、なぜか1900/1/1になった…」「日付を入力したのに1900年と表示されて、もう意味がわからない!」そんな経験、ありませんか? これはExcelあるあるの中でも、とくに初心者を困惑させるトラブルのひとつです。しかも、原因がわかってしまえば拍子抜けするほど単純なのに、知らないと永遠に沼にハマり続けるという厄介さがあります。
この記事では、Excelの日付が勝手に1900年になってしまう原因を根本から解き明かし、初心者でもすぐに実践できる5つの解決策をお伝えします。さらに、プロでも意外と知らない「1900年うるう年バグ」の歴史的背景や、2026年時点でも修正されていないExcelの仕様上の闇にも踏み込みます。読み終えたあとには、もう二度とこの問題で悩むことはなくなるはずです。
- Excelで日付が1900年になる最大の原因は「セルの書式設定が日付になっている」こと
- Excelが日付を管理する「シリアル値」の仕組みを理解すれば根本解決できる
- 1980年代から続くLotus 1-2-3由来の「うるう年バグ」が2026年現在も残存している事実
- なぜExcelは勝手に日付を1900年にしてしまうのか?
- Excelの日付管理の裏側「シリアル値」を理解しよう
- 今すぐできる!日付が1900年になるときの5つの解決策
- プロも驚く!1900年うるう年バグの知られざる歴史
- 時間表示が「3:00」になる?24時間超えの表示トラブルも解説
- Excelの日付トラブルを未然に防ぐ実践テクニック
- GoogleスプレッドシートとExcelの日付の違い
- 情シス歴10年超の現場視点で語る「本当に効く」日付トラブル対策
- 実務で使える!日付トラブル解決VBAマクロ集
- 現場でよく遭遇する「あるある」トラブルとその解決法
- VBAのDateSerial関数とExcelのシリアル値のズレに要注意
- 大量ファイルの日付問題を一気に解決するバッチ処理マクロ
- ExcelとVBAの日付シリアル値クイックリファレンス
- ぶっちゃけこうした方がいい!
- Excelの日付が1900年になる問題に関するよくある質問
- 今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
- まとめ
なぜExcelは勝手に日付を1900年にしてしまうのか?
まず最初に、最も多い原因をはっきりさせましょう。Excelのセルに「1」や「5」などの数字を入力しただけなのに「1900/1/1」や「1900/1/5」と表示されてしまう。この現象の正体は、セルの書式設定が「日付」になっていることです。
Excelは、一度でもそのセルに日付データを入力した経歴があると、そのセルの書式設定を「日付」のまま保持し続けます。たとえば以前「2025/4/1」と入力したセルの中身を削除して、新たに「1」と打ち込んだとします。すると書式設定は日付のままなので、Excelは「シリアル値1=1900年1月1日」と解釈して「1900/1/1」と表示してしまうのです。
これは初心者だけでなく、中級者でもうっかりやってしまう落とし穴です。なぜなら、セルの見た目上は中身が空っぽに見えているのに、裏側の書式設定は前の状態を引きずっているからです。
「1900/1/0」と表示される謎のパターン
もうひとつ厄介なのが、時刻データを入力したのに「1900/1/0」と表示されるケースです。たとえば「1:00:00」と時刻を入力したつもりが、セルの書式設定が「日付」になっていると「1900/1/0」と表示されます。これは時刻のシリアル値が「0.041666…」という小数値であるため、それを日付として無理やり変換した結果です。存在しないはずの「1月0日」が出てくるのは、Excelのシリアル値の仕組みが原因というわけです。
日付入力で「6.10」と入力してしまうミス
意外と多いのが、6月10日と入力したいときに「6.10」とピリオド区切りで打ってしまうケースです。Excelはこれを「1900年1月1日から6.10日後」と解釈するので、「1900/1/6」のような想定外の表示になってしまいます。日付を入力するときは必ず「6/10」のようにスラッシュで区切ることを覚えておきましょう。
Excelの日付管理の裏側「シリアル値」を理解しよう
Excelが日付を1900年に変換してしまう理由を本質から理解するには、「シリアル値」の仕組みを知ることが不可欠です。シリアル値とは、Excelが内部で日付や時刻を管理するために使っている「連続した数値」のことです。
Windows版Excelの標準設定では、1900年1月1日をシリアル値「1」として、1日ごとに1ずつ増えていきます。たとえば1900年1月2日は「2」、2026年2月12日(今日)は「46069」といった具合です。つまり、セルの書式が「日付」になっている状態で「1」と入力すれば、Excelは忠実に「1900年1月1日」を表示するということです。
時刻は1日を「1」とした小数で管理される
時刻もシリアル値の一部として管理されています。1日(24時間)を「1」として、12時間なら「0.5」、6時間なら「0.25」、18時間なら「0.75」という小数で表されます。したがって「2026年2月12日の午後6時」はシリアル値で「46069.75」となるわけです。この仕組みのおかげで、日付と時刻を足したり引いたりする計算がExcelでは自在にできるのです。
WindowsとMacでシリアル値の起点が違う?
もうひとつ押さえておきたいのが、WindowsとMacでシリアル値の起点が異なる場合があるという点です。旧バージョンのMac版Excelでは、1904年1月1日をシリアル値「1」とする「1904年日付システム」が標準でした。この場合、同じ日付でもWindowsとMacではシリアル値が1,462日(約4年と1日)ずれることになります。
現在のExcel 2016 for Mac以降は1900年日付システムがデフォルトになっていますが、古いMacで作成されたファイルを開くと日付が4年ずれて表示される事故が起きることがあります。もし取引先から受け取ったExcelファイルで日付がおかしい場合は、この日付システムの違いを疑ってみてください。
今すぐできる!日付が1900年になるときの5つの解決策
原因がわかったところで、具体的な解決策を順番にみていきましょう。どれもExcelの基本操作だけで完結するので、パソコン操作に不慣れな方でも安心して試せます。
解決策1セルの書式設定を「標準」または「数値」に変更する
最も基本的かつ確実な解決策です。日付が勝手に1900年になっているセルを選択したら、以下の手順で書式を変更します。
- 対象のセルを右クリックして「セルの書式設定」を選択します。
- 「表示形式」タブを開き、「分類」の一覧から「標準」または「数値」を選びます。
- 「OK」をクリックすれば、入力した数字がそのまま表示されるようになります。
もっと手軽にやりたい場合は、「ホーム」タブのリボンにある書式のドロップダウンメニューから直接「標準」を選ぶこともできます。ショートカット派の方は、Ctrl+1で書式設定ダイアログを一発で開けるので覚えておくと便利です。
解決策2入力前にセルの書式を事前に設定しておく
あとから修正するより、最初から正しい書式を設定しておくほうが圧倒的に楽です。データを入力する前に、対象の列や範囲を選択し、書式を「文字列」「数値」「標準」など適切なものに変更しておきましょう。とくにCSVファイルからのインポート時やデータの貼り付け時には、この事前設定が非常に重要になります。
解決策3アポストロフィを先頭に付けてテキストとして入力する
数値を入力するときに先頭にアポストロフィ( ‘ )を付けると、Excelはその入力をテキストとして扱います。たとえば「’1」と入力すれば、日付に変換されず「1」とそのまま表示されます。アポストロフィ自体はセル上には表示されないので、見た目もすっきりです。ただし、テキストとして格納されるため計算には使えなくなる点には注意してください。
解決策4自動データ変換をオフにする(Microsoft 365対応)
Microsoft 365やExcel 2021以降を使っている方は、Excelの設定から自動データ変換機能そのものをオフにできます。「ファイル」→「オプション」→「データ」→「自動データ変換」の項目で、「連続した文字と数字を日付に変換する」のチェックを外しましょう。これにより、「12-14」のような品番や「MARCH1」のような遺伝子名が勝手に日付にされてしまう悲劇を未然に防げます。
2026年1月には海外の大手テックメディアでも「Excelが2026年中に修正すべき6つの問題」のひとつとしてこの自動変換問題が取り上げられており、Microsoftに対して「データを変換する前にユーザーへ確認を求める仕組み」の導入が強く要望されています。現時点では自分で設定をオフにする必要があるため、ぜひ一度確認してみてください。
解決策51904年日付システムのチェックを確認する
ファイルの日付が4年ほどずれている場合は、日付システムの設定が原因かもしれません。「ファイル」→「オプション」→「詳細設定」の中にある「このブックの計算時」のセクションを見てください。「1904年日付システムを使用する」にチェックが入っていないか確認しましょう。通常のWindows環境ではチェックが外れているのが正しい状態です。旧Mac版で作られたファイルを引き継いだ場合にこの設定がオンになっていることがあります。
プロも驚く!1900年うるう年バグの知られざる歴史
Excelと1900年の関係を語るうえで避けて通れないのが、「1900年うるう年バグ」の存在です。これを知っているかどうかで、Excelの日付管理に対する理解の深さがまったく変わってきます。
実は、1900年は本来うるう年ではありません。うるう年の正確なルールは「西暦が4で割り切れる年はうるう年。ただし100で割り切れる年は平年。ただし400で割り切れる年はうるう年」です。1900年は4で割り切れますが100でも割り切れ、400では割り切れないため、平年なのです。つまり1900年2月29日は本来存在しない日付です。
ところがExcelでは「1900/2/29」が有効な日付として存在し、シリアル値「60」が割り当てられています。なぜこんなことになっているのでしょうか?
すべての始まりは1980年代のLotus 1-2-3
この誤りの起源は、1980年代に表計算ソフトの王者だったLotus 1-2-3にあります。Lotus 1-2-3は、当時のハードウェアの制約もあって、うるう年の例外ルールを省略し、1900年をうるう年として扱っていました。後にExcelが登場したとき、MicrosoftはLotus 1-2-3からのスムーズな移行を重視して、あえてこのバグを「そのまま」再現したのです。
もしMicrosoftがここでバグを修正していたら、Lotusからインポートされたスプレッドシートの日付がすべて1日ずれてしまい、大混乱が起きていたでしょう。互換性を守るための苦渋の決断だったわけです。
2026年になっても修正されない理由
ではなぜ、Lotus 1-2-3が姿を消して久しい2026年の今でも、このバグは修正されていないのでしょうか。答えは単純で、今さら修正すると世界中の既存スプレッドシートの日付がすべて1日ずれてしまうからです。企業の会計記録、契約書、金融モデル、科学データなど、膨大な量のExcelファイルが影響を受けることになります。
Microsoft自身もこの問題を公式ドキュメントで認めており、「修正しない場合に発生する問題はWEEKDAY関数が1900年3月1日以前の日付に対して正しくない値を返すことだけであり、ほとんどのユーザーに影響しない」として、修正しない方針を堅持しています。さらに、このバグはOffice Open XML(OOXML)の国際規格にまで「仕様」として組み込まれてしまっているのです。
実務で影響があるのはこんなケース
一般的な業務ではほとんど影響はありませんが、以下のようなケースでは注意が必要です。1900年1月1日から2026年12月31日までの日数をExcelで計算すると「46388日」になりますが、実際には「46387日」が正解です。1日多くなっているのは、存在しない1900年2月29日がカウントされているためです。また、1900年1月1日から1900年2月28日までの曜日計算は、Excelの結果が実際と1日ずれています。
ただし実務で1900年の日付を扱うことはまずないので、ほとんどの方はこの影響を気にする必要はないでしょう。
時間表示が「3:00」になる?24時間超えの表示トラブルも解説
日付の1900年問題と並んでよく質問が寄せられるのが、時間の合計が24時間を超えたときに表示がおかしくなる問題です。たとえば勤務表の合計時間が「27:00」になるはずなのに「3:00」と表示されてしまうケースです。
これもシリアル値の仕組みが原因です。Excelの標準的な時刻表示形式「h:mm」では、24時間を超えた分は自動的に翌日の時刻として計算されます。27時間の場合、24時間を差し引いた3時間として「3:00」と表示されるわけです。
解決策は、セルの書式設定で「ユーザー定義」を選び、書式記号を「:mm」に変更することです。「h」を角括弧で囲むことで、Excelは経過時間の合計として表示するようになり、正しく「27:00」と表示されます。同様に、秒まで表示したい場合は「:mm:ss」とします。逆に、退勤時刻として「26:00:00」と表示されてしまう場合は、書式の末尾から「:ss」を削除して「:mm」にすれば、すっきり「26:00」と表示できます。
マイナスの時間が「#####」になる問題
もうひとつ、時間の計算で困る現象があります。「4:00−4:30」のようにマイナスの結果が出る計算をすると、Excelは「#####」というエラー表示を出します。これはExcelのシリアル値が負の数を時刻として扱えないために起こります。
じつは、この問題を回避する裏技があります。前述の「1904年から計算する」オプションをオンにすると、マイナスの時間も表示できるようになります。ただし、この設定を変更するとブック内のすべての日付が4年と1日ずれてしまうため、既存の日付データがあるファイルでは慎重に判断する必要があります。
Excelの日付トラブルを未然に防ぐ実践テクニック
ここまで原因と解決策をみてきましたが、そもそもトラブルを起こさないための予防策を知っておくことも大切です。日々の業務で意識するだけで、日付関連のミスは大幅に減らせます。
TODAY関数とショートカットキーの使い分け
今日の日付をセルに入れたいとき、方法は大きく2つあります。ファイルを開くたびに今日の日付に自動更新してほしいなら=TODAY()関数を使いましょう。日報や在庫管理表のように、常に最新の日付であってほしい場面に最適です。現在の日時まで含めたい場合は=NOW()関数を使います。
一方、請求書の発行日のように「入力した時点の日付で固定したい」場合は、ショートカットキーCtrl+;(セミコロン)で日付を入力しましょう。時刻を固定で入力したいときはCtrl+:(コロン)です。こちらは関数ではなく値として入力されるため、後から勝手に変わることはありません。覚え方のコツとして、キーボード上でセミコロンはコロンの下にあるので「日付は時刻よりも大きな単位、だから下のキー」と関連づけると記憶に残りやすいです。
CSVインポート時の日付崩れを防ぐ方法
外部からCSVファイルを取り込むとき、日付データが崩れてしまうことはよくあります。これを防ぐには、CSVファイルをダブルクリックで開くのではなく、「データ」タブの「外部データの取り込み」や「テキストファイルウィザード」を使って取り込むのがおすすめです。ウィザードを使えば、各列のデータ型を「文字列」に指定してからインポートできるため、Excelによる勝手な日付変換を防止できます。
DATEVALUE関数で文字列の日付をシリアル値に変換する
逆のケースとして、テキスト形式で入力された日付を正しくシリアル値に変換したいときはDATEVALUE関数が便利です。たとえば「=DATEVALUE(“2026/2/12”)」と入力すると、シリアル値「46069」が返されます。このシリアル値のセルの表示形式を「日付」に変更すれば、正しく日付として表示されます。外部システムからテキスト形式で日付データを受け取った場合の整形に役立ちます。
GoogleスプレッドシートとExcelの日付の違い
Excelだけでなく、Googleスプレッドシートを併用している方も多いでしょう。じつは両者の間で日付の取り扱いには微妙な違いがあり、ファイルをやり取りする際にトラブルの原因となることがあります。
Excelは1900年1月1日をシリアル値「1」として起点にしていますが、Googleスプレッドシートは1899年12月30日を起点としています。さらに、ExcelにはLotus 1-2-3由来の1900年うるう年バグがありますが、Googleスプレッドシートにはこのバグがありません。そのため、1900年3月1日以前の日付を扱う場合に、両者の間で1日のずれが生じることがあります。
日常的な業務ではほとんど影響しませんが、古い日付データを含むスプレッドシートをExcelとGoogleスプレッドシートの間で頻繁にやり取りする場合は、この違いを頭の片隅に入れておくと安心です。
情シス歴10年超の現場視点で語る「本当に効く」日付トラブル対策
ここからは、企業の情報システム部門で10年以上にわたってExcelトラブルの問い合わせ対応をしてきた現場の視点から、他のサイトではまず書かれない「実戦的なノウハウ」をお伝えしていきます。正直な話、日付が1900年になる問題は「書式を標準にすれば直る」とどこにでも書いてあるのですが、実務ではそんな単純な話では済まないケースが山ほどあるのです。
たとえば、基幹システムからエクスポートしたCSVをExcelで開いたら日付列が全滅していた。取引先から届いたExcelファイルの日付が全部4年ずれていた。部署の共有テンプレートを誰かがいじって、それ以降すべての報告書の日付欄がおかしくなった。こういった「現場でしか起きない」トラブルにどう対処するか、具体的な手順と注意点を含めてお話しします。
CSVを開いたら日付が壊れた!を防ぐ鉄板の手順
情シスに持ち込まれるExcel日付トラブルの中で、体感的に最も多いのが「CSVファイルを開いたら日付データが壊れた」というものです。Excelは親切心から、CSVファイルを開いた瞬間に各列のデータ型を自動判別します。このとき「12-3」のような品番が「12月3日」に、「2024」のような年度コードが「1905/7/6」に変換されてしまう。そして恐ろしいことに、この変換は一度実行されると元のデータが完全に失われます。表示形式をテキストに変更しても、すでにシリアル値に置き換えられた後なので、元の「12-3」は二度と復元できません。
これを防ぐ鉄板の手順は、CSVファイルを絶対にダブルクリックで開かないことです。代わりに以下の手順を踏んでください。
- Excelを先に起動して、空のブックを開いた状態にします。
- 「データ」タブから「テキストまたはCSVから」(バージョンによっては「外部データの取り込み」→「テキストファイル」)を選択します。
- 取り込みウィザードでプレビューを確認しながら、日付列や品番列のデータ型を「テキスト」に手動指定してからインポートします。
Microsoft 365を使っている場合は、Power Queryエディタ経由でインポートされるので、各列のデータ型をより直感的に指定できます。いずれの方法でも「Excelに自動判別させない」ことが最大のポイントです。
取引先から届いたファイルの日付が4年ずれている場合の対処法
旧Mac版Excelで作成されたファイルを受け取ると、1904年日付システムが有効になったまま渡されてくることがあります。このとき、ファイルを開くと日付がすべて4年と1日(正確には1,462日)ずれて表示されます。ここで絶対にやってはいけないのが、「1904年日付システムを使用する」のチェックをいきなりオフにすることです。チェックを外すとシリアル値の基準が変わるため、すべての日付セルの表示が一斉に4年ずれてしまいます。シリアル値自体は変わらないのに、解釈の基準だけが変わるというのが厄介な点です。
正しい対処法は、日付データを含むセル範囲を選択し、各セルのシリアル値に1,462を加算(もしくは減算)してから日付システムを切り替えることです。この作業を手作業でやるのは現実的ではないので、後述するVBAマクロを使うのが確実です。
共有テンプレートが壊れたときの原因究明チェックリスト
社内の共有テンプレートで「日付欄に数字を入れると1900年になる」という問い合わせが複数人から同時に来た場合、ほぼ間違いなく誰かがテンプレートファイル自体の書式設定を変更してしまっています。こうしたケースでは、まず以下の3点を確認してください。
第一に、問題のセルを選択してCtrl+1で書式設定ダイアログを開き、「表示形式」タブの「分類」を確認します。「日付」になっていたら、テンプレート作成者が意図せず日付書式を設定してしまった可能性が高いです。
第二に、同じダイアログの「保護」タブで「ロック」のチェックが外れていないか確認します。シート保護が有効な場合でも、ロックが外れたセルは自由に編集できてしまうため、書式を変えられた可能性があります。
第三に、そのブックに条件付き書式やVBAマクロが設定されていないかを確認します。Worksheet_Changeイベントなどで自動的に書式を変更する処理が仕込まれていることもあります。これは見落とされがちですが、「特定のセルに値を入れると書式が変わる」という症状の場合、高確率でこれが原因です。
実務で使える!日付トラブル解決VBAマクロ集
ここからは、実務で繰り返し発生する日付トラブルを効率的に解決するためのVBAマクロを紹介します。すべてのコードはExcel 2016、Excel 2019、Excel 2021、Microsoft 365(2025年12月時点の最新ビルド)で動作確認を行っています。Excel 2013でも基本的に動作しますが、Power Query関連の操作と連携する場合は一部制限があるため注意してください。なお、Excel 2010以前のバージョンでは一部のプロパティの挙動が異なる場合があるため、事前にテスト環境で検証することを強くおすすめします。
VBA①選択範囲の書式を一括で「標準」に戻すマクロ
大量のセルで日付書式になっているのを手作業で直すのは非効率です。以下のマクロは、選択範囲のすべてのセルの書式を「標準」に一括変換します。単純なようですが、数百行の帳票でこの問題が起きた場合は手動でやるよりも圧倒的に速いです。
対応バージョンExcel 2010以降すべてのバージョンで正常動作
Sub ResetToGeneralFormat()
'選択範囲の表示形式を「標準」に一括変換するマクロ
'使い方対象セルを選択してからマクロを実行
If TypeName(Selection) <> "Range" Then
MsgBox "セル範囲を選択してから実行してください。", vbExclamation
Exit Sub
End If
Dim rng As Range
Set rng = Selection
rng.NumberFormatLocal = "G/標準"
MsgBox rng.Address & " の表示形式を「標準」に変更しました。" & vbCrLf & _
"対象セル数: " & rng.Cells.Count, vbInformation
End Sub
VBA②1904年日付システムのファイルを1900年に安全に変換するマクロ
前述のとおり、1904年日付システムのファイルを1900年に変換するときは、シリアル値を1,462日分調整してからシステムを切り替える必要があります。以下のマクロはこの作業を安全に自動実行します。実行前にバックアップを取ることを強く推奨します。
対応バージョンExcel 2013以降で正常動作(Excel 2010では日付システムの判定に一部互換性の問題あり)
Sub Convert1904To1900DateSystem()
'1904年日付システムから1900年日付システムへ安全に変換するマクロ
'実行前に必ずファイルのバックアップを取ってください
If Not ThisWorkbook.Date1904 Then
MsgBox "このブックは既に1900年日付システムです。変換不要です。", vbInformation
Exit Sub
End If
Dim answer As VbMsgBoxResult
answer = MsgBox("このブックを1904年→1900年日付システムに変換します。" & vbCrLf & _
"すべてのシートの日付セルが対象です。" & vbCrLf & vbCrLf & _
"実行前にバックアップは取りましたか?", vbYesNo + vbQuestion)
If answer = vbNo Then Exit Sub
Dim ws As Worksheet
Dim cell As Range
Dim targetRange As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For Each ws In ThisWorkbook.Worksheets
On Error Resume Next
Set targetRange = ws.UsedRange.SpecialCells(xlCellTypeConstants, xlNumbers)
On Error GoTo 0
If Not targetRange Is Nothing Then
For Each cell In targetRange
If IsDate(cell.Value) Then
cell.Value = cell.Value + 1462
End If
Next cell
End If
Next ws
ThisWorkbook.Date1904 = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "変換が完了しました。日付が正しく表示されているか確認してください。", vbInformation
End Sub
このマクロのポイントは、IsDate関数で日付データのセルだけを判定してからシリアル値を調整している点です。数値データまで巻き込んで加算してしまうと、売上金額や個数のデータが壊れてしまうので、この判定処理は必須です。なお、VBAのIsDate関数はExcelのシリアル値とは異なる日付判定を行うため、念のため実行後に目視確認することを推奨します。
VBA③シート内の「1900年日付」を検出してハイライトするマクロ
大きなスプレッドシートの中で、どのセルが1900年の日付になっているかを目視で探すのは至難の業です。以下のマクロは、アクティブシート内で1900年の日付が入っているセルを自動検出し、背景色を黄色でハイライトします。問題箇所の特定に非常に便利です。
対応バージョンExcel 2010以降すべてのバージョンで正常動作
Sub Highlight1900Dates()
'1900年の日付が入っているセルを黄色でハイライトするマクロ
Dim ws As Worksheet
Set ws = ActiveSheet
Dim cell As Range
Dim targetRange As Range
Dim hitCount As Long
On Error Resume Next
Set targetRange = ws.UsedRange
On Error GoTo 0
If targetRange Is Nothing Then
MsgBox "データが見つかりません。", vbInformation
Exit Sub
End If
hitCount = 0
Application.ScreenUpdating = False
For Each cell In targetRange
If IsDate(cell.Value) Then
If Year(cell.Value) = 1900 Then
cell.Interior.Color = RGB(255, 255, 0)
hitCount = hitCount + 1
End If
End If
Next cell
Application.ScreenUpdating = True
If hitCount > 0 Then
MsgBox hitCount & " 件の1900年日付を検出し、黄色でハイライトしました。", vbExclamation
Else
MsgBox "1900年の日付は検出されませんでした。", vbInformation
End If
End Sub
VBA④日付書式のセルだけを一括でテキストに変換して値を保持するマクロ
CSVに書き出す前や、他システムにデータを渡す前に「日付として入力されているが、テキスト文字列として固定したい」場面は実務では頻繁にあります。以下のマクロは、選択範囲の中から日付書式のセルだけを見つけ出し、表示されている日付文字列をそのままテキスト値として上書きします。
対応バージョンExcel 2013以降で正常動作(Excel 2010でもほぼ動作するがNumberFormatLocalの返り値に一部差異あり)
Sub ConvertDateCellsToText()
'選択範囲の日付セルを、表示されている文字列のままテキスト値に変換するマクロ
If TypeName(Selection) <> "Range" Then
MsgBox "セル範囲を選択してから実行してください。", vbExclamation
Exit Sub
End If
Dim cell As Range
Dim convertCount As Long
Dim displayText As String
Application.ScreenUpdating = False
convertCount = 0
For Each cell In Selection
If IsDate(cell.Value) And Not IsEmpty(cell) Then
displayText = cell.Text '現在表示されている文字列を取得
cell.NumberFormatLocal = "@" '書式をテキストに変更
cell.Value = displayText '表示文字列をテキスト値として書き込み
convertCount = convertCount + 1
End If
Next cell
Application.ScreenUpdating = True
MsgBox convertCount & " 件の日付セルをテキストに変換しました。", vbInformation
End Sub
このマクロの肝は、cell.Textプロパティで「画面上に表示されている文字列そのもの」を取得してから書式をテキストに変更し、その文字列を書き戻している点です。cell.Valueを使ってしまうとシリアル値の数字が入ってしまうので、必ずcell.Textを使ってください。
VBA⑤ブック全体の日付システムを診断するレポートマクロ
情シス担当者として、問い合わせを受けたファイルの状態を素早く診断したいときに使えるマクロです。ブックの日付システム、各シートの日付セル数、1900年の日付の有無などを一覧でレポートとして新しいシートに出力します。
対応バージョンExcel 2013以降で正常動作
Sub DateSystemDiagnostic()
'ブック全体の日付関連情報を診断してレポートを出力するマクロ
Dim wsReport As Worksheet
Dim ws As Worksheet
Dim cell As Range
Dim targetRange As Range
Dim rowNum As Long
Dim dateCount As Long
Dim date1900Count As Long
'診断レポート用シートを作成
Set wsReport = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
wsReport.Name = "日付診断レポート_" & Format(Now, "mmdd_HHnn")
'見出し行の設定
With wsReport
.Range("A1").Value = "【日付システム診断レポート】"
.Range("A1").Font.Bold = True
.Range("A1").Font.Size = 14
.Range("A3").Value = "診断日時"
.Range("B3").Value = Format(Now, "yyyy/mm/dd HH:mm:ss")
.Range("A4").Value = "日付システム"
.Range("B4").Value = IIf(ThisWorkbook.Date1904, "1904年システム(要注意)", "1900年システム(標準)")
If ThisWorkbook.Date1904 Then .Range("B4").Font.Color = RGB(255, 0, 0)
.Range("A5").Value = "ファイル名"
.Range("B5").Value = ThisWorkbook.Name
'各シートの診断結果ヘッダー
.Range("A7").Value = "シート名"
.Range("B7").Value = "日付セル数"
.Range("C7").Value = "1900年日付数"
.Range("D7").Value = "ステータス"
.Range("A7:D7").Font.Bold = True
.Range("A7:D7").Interior.Color = RGB(200, 200, 200)
End With
rowNum = 8
For Each ws In ThisWorkbook.Worksheets
If ws.Name = wsReport.Name Then GoTo NextSheet
dateCount = 0
date1900Count = 0
On Error Resume Next
Set targetRange = ws.UsedRange
On Error GoTo 0
If Not targetRange Is Nothing Then
For Each cell In targetRange
If IsDate(cell.Value) And Not IsEmpty(cell) Then
dateCount = dateCount + 1
If Year(cell.Value) = 1900 Then
date1900Count = date1900Count + 1
End If
End If
Next cell
End If
With wsReport
.Cells(rowNum, 1).Value = ws.Name
.Cells(rowNum, 2).Value = dateCount
.Cells(rowNum, 3).Value = date1900Count
If date1900Count > 0 Then
.Cells(rowNum, 4).Value = "要確認"
.Cells(rowNum, 4).Font.Color = RGB(255, 0, 0)
.Cells(rowNum, 4).Font.Bold = True
Else
.Cells(rowNum, 4).Value = "問題なし"
End If
End With
rowNum = rowNum + 1
NextSheet:
Next ws
wsReport.Columns("A:D").AutoFit
wsReport.Activate
MsgBox "診断が完了しました。レポートシートを確認してください。", vbInformation
End Sub
このマクロを実行すると、ブック内の全シートをスキャンして、日付セルの数と1900年日付の有無を一覧表にまとめた診断シートが自動生成されます。社内ヘルプデスク業務では、ユーザーから受け取ったファイルにまずこれを走らせることで、問題の切り分けが格段に速くなります。
現場でよく遭遇する「あるある」トラブルとその解決法
ここからは、マニュアルやヘルプ記事にはまず載っていない「実際の職場で本当によくある」日付トラブルと、その泥臭い解決法を紹介します。
あるある①和暦で入力したら1900年に飛んだ
「令和7年2月12日」のつもりで「R7.2.12」と入力したら「1900/7/8」のような謎の日付になった、というケースです。これはExcelが「R7.2.12」をうまく和暦として解釈できず、小数や日付の断片として処理してしまうために発生します。
和暦で入力する場合は、セルの書式設定をあらかじめ「日付」→カレンダーの種類を「和暦」に設定した状態で、「R7/2/12」もしくは「R7年2月12日」のように入力する必要があります。ピリオドではなくスラッシュか「年月日」を使うのがポイントです。また、Excelの地域設定が日本になっていることも前提条件なので、海外版のWindowsを使っている場合は注意してください。
あるある②数式の結果が謎の5桁の数字になった
「=A1+B1」のような足し算の結果セルが「45000」のような5桁の数字になってしまう場合、これは計算結果がシリアル値のまま表示されている状態です。A1やB1が日付データの場合、足し算の結果もシリアル値になるため、そのセルの書式を「日付」に変更すれば正しく表示されます。
逆パターンとして、日付のセルに「標準」書式を設定した結果「46069」のような数字が出てしまうケースもあります。これはシリアル値がそのまま見えている状態なので、書式を「日付」に戻せば元の日付表示に戻ります。セルの中身(シリアル値)は変わっていないので、慌てずに書式設定だけ変更すれば大丈夫です。
あるある③コピー&ペーストしたら日付が変わった
異なるブック間で日付データをコピー&ペーストしたとき、日付が4年ずれるという現象に遭遇した場合、コピー元とコピー先のブックで日付システム(1900年/1904年)が異なっている可能性が極めて高いです。
確認方法は、それぞれのブックで「ファイル」→「オプション」→「詳細設定」→「このブックの計算時」を見るだけです。もし片方が1904年システムになっていたら、先に紹介したVBAマクロで変換するか、「値のみ貼り付け」を使って日付をテキストとして転記し、貼り付け先で改めてDATEVALUE関数を使ってシリアル値に変換する方法が安全です。
あるある④VLOOKUP関数で日付が一致しない
VLOOKUP関数で日付をキーに検索したのに「一致するデータが見つからない」と返ってくるケース。原因の9割は、片方のセルが日付(シリアル値)で、もう片方がテキスト形式の日付文字列になっていることです。見た目は同じ「2026/2/12」でも、シリアル値の46069とテキスト文字列の”2026/2/12″はまったく別物です。
このトラブルの診断方法は簡単です。対象のセルを選択して数式バーを確認し、別のセルに「=ISNUMBER(対象セル)」と入力します。TRUEが返ればシリアル値(数値)、FALSEならテキストです。テキスト側をシリアル値に揃えるにはDATEVALUE関数を、シリアル値側をテキストに揃えるにはTEXT関数を使ってください。
あるある⑤「令和」が正しく表示されないExcelのバージョン問題
Excel 2016の初期バージョンでは、2019年5月1日以降の日付を和暦表示にしても「令和」ではなく「平成」と表示されてしまうことがあります。これはExcelに令和対応のアップデートが適用されていないためです。Windows Updateを最新の状態にすることで解決しますが、企業環境ではアップデートが管理者によって制限されていることも多いため、IT部門への確認が必要です。Excel 2019以降やMicrosoft 365では、基本的にこの問題は発生しません。
VBAのDateSerial関数とExcelのシリアル値のズレに要注意
VBAで日付処理のマクロを書く際に知っておくべき重要な事実があります。それは、VBAの日付シリアル値とExcelのワークシート上のシリアル値が微妙に異なるという点です。
Excelのワークシートでは1900年1月1日がシリアル値「1」ですが、VBAでは1899年12月31日がシリアル値「1」に相当します。つまりVBAのシリアル値はExcelより1日早くスタートしているのです。この差はLotus 1-2-3のうるう年バグに起因しており、VBAは1993年の導入時にこのバグを正しく処理しました。その結果、1900年3月1日以降はExcelとVBAのシリアル値が同期しますが、それ以前の日付では1日のズレが生じます。
実務でこのズレが問題になるのは、VBAで日付のシリアル値を直接数値として操作する場合です。通常のDate型変数やDateSerial関数を使う限りは自動的に調整されるため気にする必要はありませんが、CLng関数やCDbl関数で日付を数値変換して直接ワークシートに書き込むような処理では、1日ずれるリスクがあります。安全策として、VBAからワークシートに日付を書き込む際はDate型のまま代入し、セルの書式設定で表示形式を制御するようにしましょう。
大量ファイルの日付問題を一気に解決するバッチ処理マクロ
情シス担当者の実務では、「フォルダ内の全Excelファイルの日付システムをチェックしたい」という要件が発生することがあります。以下のマクロは、指定フォルダ内のすべてのExcelファイルを順番に開き、日付システムを診断して結果を一覧にまとめるバッチ処理です。
対応バージョンExcel 2016以降で正常動作(Excel 2013でも動作するがファイルオープン時の動作が遅い場合あり)
Sub BatchCheckDateSystem()
'フォルダ内の全Excelファイルの日付システムを一括診断するマクロ
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim wsResult As Worksheet
Dim rowNum As Long
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "診断するフォルダを選択してください"
If .Show = -1 Then
folderPath = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With
Set wsResult = ThisWorkbook.Worksheets.Add
wsResult.Name = "一括診断_" & Format(Now, "mmdd_HHnn")
With wsResult
.Range("A1").Value = "ファイル名"
.Range("B1").Value = "日付システム"
.Range("C1").Value = "シート数"
.Range("D1").Value = "判定"
.Range("A1:D1").Font.Bold = True
.Range("A1:D1").Interior.Color = RGB(200, 200, 200)
End With
rowNum = 2
Application.ScreenUpdating = False
Application.DisplayAlerts = False
fileName = Dir(folderPath & "*.xls*")
Do While fileName <> ""
If fileName <> ThisWorkbook.Name Then
On Error Resume Next
Set wb = Workbooks.Open(folderPath & fileName, ReadOnly:=True, UpdateLinks:=0)
On Error GoTo 0
If Not wb Is Nothing Then
With wsResult
.Cells(rowNum, 1).Value = fileName
.Cells(rowNum, 2).Value = IIf(wb.Date1904, "1904年", "1900年")
.Cells(rowNum, 3).Value = wb.Worksheets.Count
If wb.Date1904 Then
.Cells(rowNum, 4).Value = "要変換"
.Cells(rowNum, 4).Font.Color = RGB(255, 0, 0)
Else
.Cells(rowNum, 4).Value = "OK"
End If
End With
wb.Close SaveChanges:=False
rowNum = rowNum + 1
End If
End If
fileName = Dir()
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
wsResult.Columns("A:D").AutoFit
wsResult.Activate
MsgBox "診断完了。" & (rowNum - 2) & " ファイルをチェックしました。", vbInformation
End Sub
このマクロは、部署統合やシステム移行のタイミングで大量のExcelファイルを棚卸しする際に特に威力を発揮します。1904年日付システムのファイルが混在していると後々トラブルの種になるため、先に洗い出しておくことが重要です。
ExcelとVBAの日付シリアル値クイックリファレンス
実務で素早く参照できるように、日付関連の主要な値と書式記号を表にまとめました。デスクに貼っておくと便利です。
| 項目 | 値・記号 | 説明 |
|---|---|---|
| シリアル値の起点(1900年システム) | 1 = 1900/1/1 | Windows版Excelのデフォルト |
| シリアル値の起点(1904年システム) | 1 = 1904/1/2 | 旧Mac版Excelのデフォルト |
| 両システムのシリアル値の差 | 1,462日 | 4年と1日分(うるう日1回含む) |
| 存在しないうるう日 | シリアル値60 = 1900/2/29 | Lotus 1-2-3互換のため残存 |
| 24時間超え表示の書式記号 | :mm | 角括弧で経過時間の合計表示 |
| 和暦表示の書式記号 | ggge”年”m”月”d”日” | 令和7年2月12日のように表示 |
| 曜日表示の書式記号 | aaa / aaaa | 月 / 月曜日のように表示 |
| VBAの日付起点 | 1 = 1899/12/31 | Excelとは1日ずれているので注意 |
ぶっちゃけこうした方がいい!
ここまで読んでいただいた方に、情シス10年超のキャリアで辿り着いた結論をぶっちゃけてお話しします。
Excelの日付問題に長年向き合ってきて断言できるのは、「日付トラブルの8割は、そもそもExcelに日付を自動判断させていること自体が原因」だということです。Excelは賢いつもりで勝手に日付変換をしてくれますが、現場の実データには品番、コード番号、バージョン記号など「日付に見えるけど日付じゃないデータ」が山ほどある。そこにExcelの自動変換が走ると、一瞬でデータが破壊されます。しかも壊されたことに気づかないまま処理が進んでしまうのが一番怖い。
だから、個人的にはこうしたほうが、ぶっちゃけ楽だし効率的だと思っています。
まず、Microsoft 365を使っているなら今すぐ「ファイル」→「オプション」→「データ」→「自動データ変換」の項目を全部オフにしてください。これだけで日付トラブルの発生率が体感で半分以下になります。「え、でも便利な自動変換がなくなるのでは?」と思うかもしれませんが、正直な話、自動変換が役に立つ場面よりデータを壊す場面のほうが圧倒的に多いです。必要なときだけ手動でDATEVALUE関数やTEXT関数を使えばいいだけの話です。
次に、CSVファイルは絶対にダブルクリックで開かない。これを組織のルールにしてください。「データ」タブの「テキストまたはCSVから」で取り込むか、いっそPower Queryを使う。たったこれだけのことで、基幹システムとExcelの間で発生する日付崩壊の事故はほぼゼロにできます。情シスとして何百件もの問い合わせに対応してきましたが、「CSVをダブルクリックで開いたら壊れた」が本当にダントツで多い。逆にいえば、ここを塞ぐだけで社内のExcelトラブルは劇的に減ります。
そして3つ目。社内テンプレートを作るときは、日付入力欄にデータの入力規則を設定して、書式設定のロックと合わせてシート保護をかけてください。誰かが書式を変えてしまって全社に影響が波及するという事故を構造的に防げます。手間はかかりますが、あとから全部署に「書式を直してください」と連絡する手間に比べれば、100分の1のコストです。
最後にもうひとつだけ。Excelの1900年うるう年バグの話を聞いて「なんでMicrosoftは直さないんだ」と思った方もいるかもしれませんが、これは「修正しない」が正解なんです。互換性というのはそれだけ重い価値を持っていて、世界中の何十億というスプレッドシートの日付を1日ずらすリスクと、1900年3月1日以前の曜日が1日ずれるリスクを天秤にかければ、答えは明白。完璧なシステムなんてこの世に存在しなくて、私たちはその「不完全さ」を理解したうえで、正しく付き合っていくしかないのです。Excelに限らず、ITの仕事をしていると「仕様通りなのに不便」という場面は無限に出てきますが、仕様を理解している人とそうでない人では、トラブル対応のスピードも精度もまるで違います。この記事で解説した知識が、あなたの現場で必ず役に立つと確信しています。
Excelの日付が1900年になる問題に関するよくある質問
セルに「2024」と入力したら「1905/7/6」と表示されるのはなぜ?
これもセルの書式設定が「日付」になっていることが原因です。Excelはシリアル値「2024」を「1900年1月1日から2024日目の日付」と解釈します。1900年1月1日から2024日後は1905年7月6日にあたるため、このような表示になるのです。対処法は、セルの書式設定を「標準」や「数値」に変更するか、入力前に書式を正しく設定しておくことです。
1900年日付システムと1904年日付システムはどちらを使えばいい?
特別な理由がない限り、1900年日付システム(デフォルト)のまま使用してください。1904年日付システムはもともとMac版との互換性のためのオプションであり、現在のExcel for Macもデフォルトでは1900年システムを使っています。1904年に切り替えると既存の日付データが4年と1日ずれてしまうため、安易な変更は避けましょう。マイナスの時間を表示するために1904年システムに切り替える裏技もありますが、日付のずれというトレードオフがあることを理解したうえで判断してください。
Excelの1900年うるう年バグは将来修正される可能性はある?
現時点では修正される見込みはほぼありません。Microsoftは公式に「修正による影響が大きすぎる」として修正しない方針を示しています。世界中に存在する膨大なExcelファイルの日付がすべて1日ずれてしまうリスクを考えれば、互換性を維持する判断は合理的です。このバグは国際標準のOOXML仕様にも組み込まれており、もはやバグではなく「仕様」として定着しています。
日付データがあるのにセルに「#####」と表示されるのは?
「#####」が表示される場合、2つの可能性があります。ひとつは単純に列の幅が狭すぎて日付の文字列を表示しきれないケースで、この場合は列幅を広げるだけで解決します。もうひとつは前述のとおり、マイナスの時間計算結果の場合です。時間の引き算で負の値が出ている場合は、計算式を見直すか、1904年日付システムへの切り替えを検討してください。
Excelで1900年より前の日付は扱えないの?
その通りです。Excelの1900年日付システムでは、1900年1月1日より前の日付をシリアル値として扱うことはできません。たとえば1899年12月31日を入力しても、Excelはこれを正しい日付として認識しません。歴史的なデータや生年月日で1900年より前の日付を扱いたい場合は、文字列として入力するか、専用の計算式を組んで対応する必要があります。
今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
いま、あなたを悩ませているITの問題を解決します!
「エラーメッセージ、フリーズ、接続不良…もうイライラしない!」
あなたはこんな経験はありませんか?
✅ ExcelやWordの使い方がわからない💦
✅ 仕事の締め切り直前にパソコンがフリーズ💦
✅ 家族との大切な写真が突然見られなくなった💦
✅ オンライン会議に参加できずに焦った💦
✅ スマホの重くて重要な連絡ができなかった💦
平均的な人は、こうしたパソコンやスマホ関連の問題で年間73時間(約9日分の働く時間!)を無駄にしています。あなたの大切な時間が今この悩んでいる瞬間も失われています。
LINEでメッセージを送れば即時解決!
すでに多くの方が私の公式LINEからお悩みを解決しています。
最新のAIを使った自動応答機能を活用していますので、24時間いつでも即返信いたします。
誰でも無料で使えますので、安心して使えます。
問題は先のばしにするほど深刻化します。
小さなエラーがデータ消失や重大なシステム障害につながることも。解決できずに大切な機会を逃すリスクは、あなたが思う以上に高いのです。
あなたが今困っていて、すぐにでも解決したいのであれば下のボタンをクリックして、LINEからあなたのお困りごとを送って下さい。
ぜひ、あなたの悩みを私に解決させてください。
まとめ
Excelの日付が勝手に1900年になってしまう問題は、その原因のほとんどが「セルの書式設定が日付になっている」というシンプルなものです。書式設定を「標準」や「数値」に変更するだけで、多くのケースは一瞬で解決できます。
しかしその背景には、1980年代のLotus 1-2-3から受け継がれた1900年うるう年バグや、シリアル値という独特の日付管理方式など、Excelの深い歴史と仕組みが横たわっています。これらを理解しておくことで、表面的な対処だけでなく、日付や時刻に関するあらゆるトラブルに自信をもって対処できるようになります。
日常の業務で日付のトラブルに遭遇したら、まずセルの書式設定を確認すること。これを習慣にするだけで、無駄な時間の浪費から解放されます。今日からぜひ実践してみてください。






コメント