- ベストアンサー
エクセルで実働日数を出す数式を教えて下さい。
エクセルで従業員の勤続日数を数式を入れて自動でだしたいのですが、どうやって良いのかわかりません。 例えば 今日がH17.11.3 入社日/H16.10.29 の方であれば 「1年0ヶ月4日」という感じで出る式を 教えていただけませんでしょうか? よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
わたしもこれをワークシート関数で求めようとして挫折しました。 Datedifという関数もあるのですが、末日計算の端日数処理でバグがあり、いまいち信頼に欠け、使えませんでした。 しかたなく、一般公開されているサンプルコードで下記のようなVBAでユーザー定義関数を用いるしかありませんでした。 使用方法 下記のマクロのコードを標準モジュールに貼り付け、ワークシートのセルに 開始日A1 終了日B1 の場合 =ktDATEDIF(A1,B1,"YMD",FALSE) としてみてください。 最後の引数は初日算入ならTRUE, 初日不算入ならFALSEです。 (民法規定は[初日 不算入]が基本です) 『開始日』『終了日』に対し、民法規定に従って【y年mヶ月d日】を求めるマクロ。 Public Function ktDATEDIF(ByVal StartDate As Date, _ ByVal EndDate As Date, _ ByVal Interval As String, _ ByVal FirstDay As Boolean) As Variant ' [Interval] ' YMD:"yyyy年mヶ月d日"で編集(文字列) ' Y:期間内満年数, M:期間内満総月数 ' YM:端数の月数, MD:端数の日数 ' [FirstDay] ' 初日算入=True, 初日不算入=False (民法規定は[初日 不算入]が基本) Dim dtmFirstDate As Date '起算日 Dim dtmLastDate As Date '満了日 Dim wkDate As Date Dim intMonth As Integer '総月数 Dim intYear As Integer Dim intMonth_in_Year As Integer '年未満の月数 Dim intDay_in_Month As Integer '月未満の日数 If (StartDate > EndDate) Then ktDATEDIF = "Error" Exit Function End If If (FirstDay = False) Then dtmFirstDate = StartDate + 1 '民法規定は[初日 不算入]が基本 Else dtmFirstDate = StartDate 'True:[初日算入]指定 End If dtmLastDate = EndDate '注)[DateDiff関数]自体は初日不算入で処理している If (Day(dtmFirstDate) = 1) Then '起算日が1日(開始日が月末日)の場合、月の大小閏に係わりなく '[月末日]までで『丸Nヶ月』 '月の大小閏に影響されないように「月末日~終了日」を1日分シフトして '「1日~(終了日+1)」で求める。 intMonth = DateDiff("m", dtmFirstDate, (dtmLastDate + 1)) intYear = intMonth \ 12 intMonth_in_Year = intMonth Mod 12 If (Day(dtmLastDate + 1) = 1) Then '満了日(終了日)が月末か? intDay_in_Month = 0 Else intDay_in_Month = Day(dtmLastDate) End If Else '起算日≠1日の場合、「起算日の応答日前日」までで『丸Nヶ月』 intMonth = DateDiff("m", (dtmFirstDate - 1), dtmLastDate) wkDate = DateAdd("m", intMonth, (dtmFirstDate - 1)) If (wkDate > dtmLastDate) Then intMonth = intMonth - 1 wkDate = DateAdd("m", intMonth, (dtmFirstDate - 1)) End If intDay_in_Month = DateDiff("d", wkDate, dtmLastDate) intYear = intMonth \ 12 intMonth_in_Year = intMonth Mod 12 End If Select Case UCase(Interval) Case "YMD" ktDATEDIF = intYear & "年" & intMonth_in_Year & "ヶ月" & intDay_in_Month & "日" Case "Y" ktDATEDIF = intYear Case "M" ktDATEDIF = intMonth Case "YM" ktDATEDIF = intMonth_in_Year Case "MD" ktDATEDIF = intDay_in_Month Case Else ktDATEDIF = "Error" End Select End Function
その他の回答 (3)
- merlionXX
- ベストアンサー率48% (1930/4007)
No2です。 No3さんご紹介の「代わり」の式でDatedif関数のバグが解消できるのなら凄いと思ったのですか・・・。 =DATEDIF(A1,B1,"Y")&"年"&DATEDIF(A1,B1,"YM")&"ヶ月"&IF(A1>B1,#NUM!,IF(DAY(B1)>=DAY(A1),DAY(B1)-DAY(A1),B1-MIN(DATE(YEAR(B1),MONTH(B1)-1,DAY(A1)),B1-DAY(B1))))&"日"でやってみましたが、やはり 2005/2/28 -2005/4/30が0年2ヶ月2日になってしまいます。(2日余分です)
お礼
ありがとうございました。
- OsieteG00
- ベストアンサー率35% (777/2173)
DATEDIF(A1,B1,"MD") の代わりの例です。 =IF(A1>B1,#NUM!,IF(DAY(B1)>=DAY(A1),DAY(B1)-DAY(A1),B1-MIN(DATE(YEAR(B1),MONTH(B1)-1,DAY(A1)),B1-DAY(B1)))) DATEDIF(A1,B1,"YD") の代わりの例です。 =IF(A1>B1,#NUM!,B1-DATE(YEAR(B1)-IF(DATE(YEAR(B1),MONTH(A1),DAY(A1))>B1,1,0),MONTH(A1),DAY(A1)))
お礼
ありがとうございました。とてもわかりやすかったです。
- OsieteG00
- ベストアンサー率35% (777/2173)
それぞれ単一のセルに入っているのなら、datedif関数でOKです。廃止予定なのか、最近のエクセルにはヘルプすら出ませんが計算はできます。 =datedif(a1,b1,"Y")&"年"&datedif(a1,b1,"YM")&"ヶ月"&datedif(a1,b1,"MD")&"日
お礼
早急な対応ありがとうございました。
お礼
ものすごく丁寧な解説まで書いていただきわかりやすくよかったです。