Excelは1900年2月29日を加算する「うるう年バグ」があるので1日減算が必要

Excelの1900年2月29日の「うるう年バグ」とは

Excelには1900年2月29日をうるう年とみなすバグがあるため、1900年2月29日が含まれる日数を算出する式がある場合、日数が1日多くなってしまいます。

これはLotus 1-2-3という表計算ソフトに1900年をうるう年とするバグがあるため、互換性のためにExcelにも導入されたバグ(仕様)です。

例えば、下図のように開始日(A2)に1900/01/01、終了日(B2)に2025/12/31を入れて「B2 - A2」で日数を算出した場合はGoogleスプレッドシートだと46020日になりますが、Excelだと1900年2月29日が存在するバグがあるため、46021日になってしまいます。

Excelは1900年2月29日を加算する「うるう年バグ」があるので1日減算が必要

試しにGoogleスプレッドシートのサンプルから「ファイル → ダウンロード → Microsoft Excel (.xlsx)」でダウンロードしたものをExcelで開いてみてください。

Excelでも正しい日数を算出する方法

Excelは1900年をうるう年としているため、「B2 - A2 - 1」にすれば正しい日数になりますが、逆にGoogleスプレッドシートのときに1日少ない日数になってしまいます。

そのため、関数でGoogleスプレッドシートかどうか判定して、Googleスプレッドシートなら「B2 - A2 」、Googleスプレッドシート以外なら「B2 - A2 - 1」で算出する条件分岐が必要になります。

※ Numbersやその他のOffice互換ソフトについては対象外

Googleスプレッドシートかどうかを直接判定する関数はありませんが、GoogleスプレッドシートにはGOOGLEFINANCEという独自関数があります。

ExcelではGOOGLEFINANCE関数は使えないので、ISERRORを併用すればGoogleスプレッドシートとExcelを判別できます。

=IF(ISERROR(GOOGLEFINANCE("GOOG","price")), "Excelです", "Googleスプレッドシートです")

GOOGLEFINANCE関数でGoogleスプレッドシートか判定したサンプル

これを「B2 - A2 」、「B2 - A2 - 1」に置き換えると以下のようになります。

=IF(ISERROR(GOOGLEFINANCE("GOOG","price")), B2 - A2  - 1, B2 - A2)

さらにセルの期間にうるう年の1900年2月29日が含まれているかの判定も付け加えると、以下の式になります。

=IF(ISERROR(GOOGLEFINANCE("GOOG","price")), B2 - A2 - IF(COUNTIF(A2:B2, DATE(1900, 2, 29)) > 0, 1, 0), B2 - A2)

1900年が含まれる期間をExcelで扱うことはほとんどないですが、これを知らないと1900年2月29日が含まれる式を関数で作成した際に正しい結果にならないので注意が必要です。