アプリ版:「スタンプのみでお礼する」機能のリリースについて

全担当者が退職しているのですがExcelの計算式の意味がわかりません。
どなたか分かる方いらっしゃるでしょうか。
休職期間の期間についての内容です。

IF(([休職区分2]="育児")+([休職区分2]="介護"),IF(datedif([開始日2],[終了日2],"M")=0,0,datedif(if(datedif(1,[開始日2],"YM")+1=12,datedif(1,[開始日2],"Y")+1900+1&"/1/1",datedif(1,[開始日2],"Y")+1900&"/"&datedif(1,[開始日2],"YM")+2&"/1"),[復職日2],"M"))

A 回答 (3件)

=IF(


   ([休職区分2]="育児")+([休職区分2]="介護")
   ,IF(
     datedif([開始日2],[終了日2],"M")=0
     ,0
     ,datedif(
         if(
           datedif(1,[開始日2],"YM")+1=12
           ,datedif(1,[開始日2],"Y")+1900+1&"/1/1"
           ,datedif(1,[開始日2],"Y")+1900&"/"&datedif(1,[開始日2],"YM")+2&"/1"
           )
         ,[復職日2]
         ,"M"
         )
     )

たしかに1つ目のIF関数の閉じ括弧が足りませんね。
数式の最後に足りない閉じ括弧を追加しても良いのですが、そうすると、
1つ目のIF関数の条件不成立時の式が無いことになります。
条件不成立時に ”FALSE” と表示されることになりますが、それで問題ないでしょうか。


・[休職区分2]が ”育児” または ”介護” なら、次の処理、違えば ”FALSE” を表示。
・[開始日2]と[終了日2]が同じ月なら、「0」、違えば次の処理。
・[開始日2]と[復職日2]までの月を返す。
  ただし、
   [開始日2]が12月なら~
   [開始日2]が12月以外なら~
  のように[開始日2]を設定して計算する。

……ですね。

”ただし” と曖昧に回答した ”12月なら~” や ”12月以外なら~” の処理は、日付に年数を含んだシリアル値で計算すれば済むことなので、普通にDATE関数で日付に直してからDATEDIF関数に入れてやれば最後のIF関数は不要なんで、簡略化した説明になりました。
(DATEDIF関数を覚えてうれしくて使っているとしか思えない、マジで無駄な事やってる)

・・・

そもそも Excel が日付を【シリアル値】で管理していることを理解していない人が作った数式だろうと推測されます。
    • good
    • 1

>Excelの計算式の意味がわかりません。


とのことですが、ご質問者がお示しになった数式は、左右の括弧が不一致です。このままではエラーになってしまいます。
')'が一つ足りないので、末尾に付加することにします。するとこの数式は、

(1)休職区分2が「育児」または「介護」であるかどうかを判定する
(2)上記(1)に該当する場合、開始日2と終了日2との日付差分の月数が1か月未満(つまり0)なら0を返す
(3)上記(2)が0で無かったら開始日2の翌月初日の年月日を算出しこれを計算開始日として復帰日2までの月数を算出することにする
(4)上記(3)を計算するため開始日2の月が12月かどうか判定する
(5)上記(4)の判定で12月だったら開始日2の年数に1加えて1月1日の年月日を算出し、これを計算開始日とする
(6)上記(5)の判定で12月以外だったら開始日2の年数はそのままで翌月の1日の年月日を算出し、これを計算開始日とする
(7)上記(1)~(6)で算出した計算開始日と復帰日2までの月数をDATEDIF関数で求める

という数式になっていることが判ります。

計算開始日を翌月初日とする理由は全く判りませんが、どうやら、育児休業(あるいは育児休暇)や介護休業(あるいは介護休暇)の取得月数を計算する数式のようです。

しかし、そもそも(1)の休職区分2が「育児」または「介護」であるかどうかを判定した結果、どちらにも該当しなかった場合は、どうするのかの指定がありません。このため、休職区分2が「育児」でも「介護」でもないとき、この数式は「FALSE」を返すことになります。

また、(2)の開始日2と終了日2との日付差分の月数が1か月未満(つまり0)なら0を返すのですが、開始日2と終了日2との日付差分の月数が1か月未満という状況は現実にあるのでしょうか?
もしかすると、これは「未入力」つまり、開始日2も終了日2も「未入力」のときは0を返すという意図かも知れません。

(3)~(7)までは上記説明のとおりなのですが、これをDATEDIF関数のみで算出しようとしているので計算式が冗長になっている気がします。
(1)の判定でFALSEではなく「空白」となる様に修正し、同じ意味になるような数式として、

=IF(([休職区分2]="育児")+([休職区分2]="介護"),IF(DATEDIF([開始日2],[終了日2],"M")=0,0,DATEDIF(EOMONTH([開始日2],0)+1,[復職日2],"M")),"")

とすれば、大分短くなります。

なお、DATEDIF関数での月数計算には「くせ」がありますので、注意が必要です。例えば「2023/1/31~2023/2/28」は「月末日~翌月末日」ですので常識的には1か月ですが、=DATEDIF(2023/1/31,2023/2/28,"M")の結果は0です。確かに日数は28日しかありません。

では同じ28日しかない、「2023/2/28~2023/3/28」は「月末日~翌月末日より前」なので1か月未満ですから常識的には0か月ですが、=DATEDIF(2023/2/28,2023/3/28,"M")の結果は1です。

このような「くせ」を理解した上で利用する必要があります。
    • good
    • 2

元のシートを見ないと「何を」かはわからないのですが、デイテッドイフ関数を使っているので、例えば入社日から今までの期間などを求めている数式だと思います。


この関数、正式にサポートされていないので、あまり使わないほうがいいみたいですね。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!