ExcelのDATEDIF関数の挙動が変と言う話(Excel初心者並感)

こんにちは、こんこんにちは、こんにちは。どうもこんにちはです。

前提

ExcelにはDATEDIF関数というものがあります。DATEDIF関数とはその名の通り、日付(DATE)と日付の差(DIF)を求める関数です。また、

DATEDIF(state_date, end_date, unit)
と3つの引数から出力されるものです。state_dateは日付の始点、end_dateは日付の終点、unitは日付の単位区間(日、月、年)のようなものです。例えば年(Year)の頭文字である「"Y"」を入力すると、他の二つの引数の間の年数が出力されます。他にも日(Day)の頭文字である「"D"」と入力しても同様です。

疑問

DATEDIFの一見不思議な挙動

2行目と3行目の記述式を見ていただくと一見同じに見えますが、与えられる出力が異なります。

まず2行目から見ていきましょう。引数を確認するとstate_date=2022/01/01で、end_date=2023/01/01です。また、3つ目の引数が"D"になっていることから、日にちの差を求める関数であることが分かります。この場合end_dateとstate_dateの日にちの差は365日になります。

次に3行目も見ていきます。引数を確認すると一見2行目と同じに見える一方で、与えられた出力が2行目と異なります。

これは一体どうしてなんだ?????

有能なやつ

私は上記のバグ(?)で悪夢にうなされていました。しかし、それを解決するやつを見つけてしまいました。それが

有能なやつ

この「数式の検証」というやつです。3行目の頭のいかれた出力に対して早速クリックしてみましょう。

数式の検証 in 3行目(1コマ目)

これが、

 

数式の検証 in 3行目(2コマ目)

あれ・・?日が消えた・・?

数式の検証 in 3行目(3コマ目)

月も消えた・・・?

なぜこんなことが起きているんでしょうね。

ネタバレ注意

 

 

これについて語るには「型」について言及しなければなりません。しかし簡単にしかしません(できません)。

型というのは引数の性質のことです。大きく2種類あって、一つは「数字」です。0とか1.5とかπ(円周率)とかですね。もう一つは「文字」です。「asshole」とか「お前ら」とか「나는 거시기를 좋아해!」とかですね。

一般的には(お遊びレベルでプログラミングをしてる私の知る限り)、数字と文字の型はそれぞれ分離していて、引数の型が期待されたものと異なる場合にTypeerrorみたいなやつを吐くはずです。上記のExcelの話だと

実はノーテーションマークつければ解決するって話

2行目は"2022/1/1"(文字)だと認識されていて、3行目は2022/1/1(数字)だと認識されています。ここで今節を踏まえて分からないのがなぜ3行目の記述式でエラーを吐かないのかということです。

実はExcelにおいては(他のプログラミング言語はどうなんですか?)、日付を数字ともみなせるようなのです。日付と整数を対応させる関数が実際にあって、それがDATEVALUE関数です。

DATEVALUE関数で出力される1

このように日付を引数として、数字を出力します。

そして、先ほどの有能なやつを思い出してもらうと、2022/1/1が2022/1になったり2022になったりしましたよね。実はこれは「/」が割り算の記号とみなされて実際に割り算をしていたということですね(2022/3/3とかで試したほうが分かりやすいかもしれません)。日付を引数にしたいときは必ず""をつけろと言われた方もいるかもしれませんが、それがないと日付としてみなしてくれないという背景もあるかもしれません。

ここで最初の疑問に戻ると、DATEDIF(2022/1/1,2023/1/1,"D")=1になるのは、2022/1/1などが数字としてみなされ、DATEDIF(2022,2023,"D")と変形されて、引数が数字としての日付とみなされてエラーも吐かずにそのまま計算されたんだと考えてます。

エラーのありがたみとExcelの柔軟性を痛感した日々でした、ではまた。