次の方法で共有

日付(シリアル値)の逆数の再逆数で元に戻すと、EDATE関数の結果が正しく計算されない。

H-ENGINE 0 評価のポイント
2026-06-16T20:32:54.12+00:00

例えば、2068/3/20 のシリアル値は61442です。A1セルに「=1/(1/61442)」として、表示形式を「yyyy/m/d」とすると、「2068/3/20」と表示されます。

続いてB1セルに「=EDATE(A1,60」として、A1セルの5年後の日付を表示させようとすると、何故か「2073/3/19」と1日前の日付が表示されてしまいます。

そこでB1の数式を「=EDATE(INT(A1),60」に修正してみたところ、正しく「2073/3/20」と表示されました。

このような現象の原因はどこにあるのでしょうか?

Microsoft 365 と Office | Excel | ビジネス向け | Windows

3 件の回答

並べ替え方法: 最も役に立つ
  1. motosan 3,230 評価のポイント
    2026-06-19T09:17:04.1866667+00:00

    INT関数は割り算の商を求める関数ではありません。

    INT()の()内の数値の整数を求める関数です。

    ()内の数値は計算式の結果ですが、これは誤差が丸められた数値になるようです。

    ■ 電卓アプリの関数電卓で計算すると次のようになります。

    • 1/61442 -> 1.6275511864848149474300966765405e-5
    • 1/1.6275511864848149474300966765405e-5 -> 61441.999999999999999999999999999

    ■ EXCELで商と余りを求めると下記のようになります。

    ※ 指数表示では D1 と E2が同じになるので小数表示も併記しました。

    • D1 : =1/61442 -> 1.62755E-05 (0.0000162755118648482)
    • D2(商) : =QUOTIENT(1,D1) -> 61441 (2068/3/19)
    • E2(余り) : =MOD(1,D1) -> 1.62755E-05 (0.0000162755118647452)
    • D3(INTを使用) : =INT(1/D1) -> 61442 (2068/3/20)

    EDATEは セルの丸まった値(61442)でなく、1/(1/61442)の日付部分を使用しているようにみえます。

    いずれにしても、日付で誤差が発生する計算式は使用しない方が良いと思います。

    ご参考になれば幸いです。

    この回答は役に立ちましたか?


  2. wanisan 6,080 評価のポイント ボランティア モデレーター
    2026-06-17T22:54:18.81+00:00

    A1セルを日付形式にして[2068/3/20]と入力すれば正しく表示されますし、A1セルにシリアル値[61442]と再入力しても正しく表示されます。
    A1セルを変えられないということであれば、B1セルに[=DATE(YEAR(A1)+5, MONTH(A1), DAY(A1))]と入力すれば応当日になります。

    EDATE関数は応当日を出す関数なので通常であれば正しく表示されると思いますが、1日前になってしまう原因は分かりません。
    異なる日付[例:=1/(1/61432)]では正しく応当日が表示されなど日付によって異なるので、Hendrix-Cさんのアドバイスにあるように浮動小数点演算の影響だと思われますが詳細までは不明です。
    日付はすべてシリアル値で計算されるため思うようにならない場合も多いので、仕様だと割り切って別の方法で対応した方がいいと思います。

    この回答は役に立ちましたか?


  3. Hendrix-C 17,580 評価のポイント Microsoft 外部スタッフ モデレーター
    2026-06-16T21:17:39.55+00:00

    この回答は自動翻訳されたものです。そのため、文法的な誤りや不適切な用語が含まれている可能性があります。

    @H-ENGINE様、

    ご質問の件ですが、原因はExcelの内部数値計算における浮動小数点数の丸め誤差です。バイナリ浮動小数点演算では、多くの小数値や小数値を正確に計算/表現することができません。「浮動小数点演算を使用すると、Excel で不正確な結果が得られます - Microsoft 365 Apps | Microsoft Learn」をご参照ください。ExcelはIEEE-754浮動小数点数を使用しており、数式においてわずかな丸め誤差や切り捨て誤差が生じる可能性があります。

    この場合、セルA1に「=1/(1/61442)」と入力すると、実際の内部値は正確に61442ではなく、61442.0000000000001のような値になる可能性があります。セルをyyyy/m/d形式で書式設定すると、表示される日付は2068/3/20と正しく表示されますが、基となる値にはわずかな浮動小数点の小数点が残ります。

    さらに、EDATE関数は表示されている2068/3/20ではなく、A1セルの浮動小数点の生の値を使用します。この値がわずかにずれているため、内部の日付計算で日付の境界を誤って通過し、2073/3/19という結果が返される可能性があります。INT(A1)関数を使用すると、シリアル値を整数に変換し、隠れた小数点の小数点を取り除くことができるため、EDATE関数は正しい日付シリアル値を受け取り、結果が正しくなります。

    この情報がお役に立てば幸いです。ご質問やさらに詳しい説明が必要な場合は、コメントを残してください。喜んでお手伝いさせていただきます。

    ご理解とご協力に感謝いたします。ご返信をお待ちしております。


    この回答がお役に立ちましたら、「はい」をクリックして高評価をお願いいたします。

    注:このスレッドに関するメール通知を受け取りたい場合は、ドキュメントの手順に従ってメール通知を有効にしてください。

    この回答は役に立ちましたか?


お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "おすすめ" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。