家の中でのこだわりスペースはどこですか?

エクセルで従業員の勤続日数を数式を入れて自動でだしたいのですが、どうやって良いのかわかりません。

例えば
今日がH17.11.3
入社日/H16.10.29
の方であれば
「1年0ヶ月4日」という感じで出る式を
教えていただけませんでしょうか?
よろしくお願い致します。

A 回答 (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

参考URL:http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips05.htm
    • good
    • 0
この回答へのお礼

ものすごく丁寧な解説まで書いていただきわかりやすくよかったです。

お礼日時:2005/11/04 22:33

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日余分です)
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2005/11/04 22:36

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)))

参考URL:http://hp.vector.co.jp/authors/VA016119/kitan01. …
    • good
    • 0
この回答へのお礼

ありがとうございました。とてもわかりやすかったです。

お礼日時:2005/11/04 22:34

それぞれ単一のセルに入っているのなら、datedif関数でOKです。

廃止予定なのか、最近のエクセルにはヘルプすら出ませんが計算はできます。

=datedif(a1,b1,"Y")&"年"&datedif(a1,b1,"YM")&"ヶ月"&datedif(a1,b1,"MD")&"日

参考URL:http://kokoro.kir.jp/excel/datedif.html,http://o …
    • good
    • 0
この回答へのお礼

早急な対応ありがとうございました。

お礼日時:2005/11/04 22:31

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


おすすめ情報