名簿などで、氏名のよみがなや入社年月日から勤続年数を、大量に入力しなければならない時、どうしてますか?
計算式やExcelの関数を使えばこれらは簡単にできます。しかし、計算式はそのつど計算結果が更新されます。たとえば日付がかわれば年齢は更新されます。
日付に限らず、計算結果を更新したくないとき、つまり、計算式を入力した時の結果だけがほしいときはどうしますか?
答えは簡単、計算式を入力し、その結果をコピーして、値を貼り付けすればいいのです。
そて、ここからが本題です。
シート上では、2 つの指定した日付の時間間隔を計算するために[datedif関数]を使用しています。この関数がいわゆる[満年齢]を計算していることがお分かりいただけると思います。
VBAでも同様の関数に[datediff関数](こちらはfがふたつ)があります。似たような名前なので似たような機能だと考えて(期待して)しまいますが、文字通り[似たような機能]なんです。[同じではありません]。
daqtediff関数を使用して、同様に計算してみると、右図のようになります。
プログラムはこちら。
Public Function myDatedif(fromDate As Variant, toDate As Variant)
myDatedif = DateDiff("yyyy", fromDate, toDate)
End Function
引数の並び順、時間間隔の指定もシート関数とは異なります。
Public Sub setMyDatedif()
Dim idx As Long
With ActiveSheet
For idx = 10 To 13
.Cells(idx, 6).Value = myDatedif(.Cells(idx, 4).Value, .Cells(8, 2).Value)
Next idx
End With
End Sub
の計算結果からわかるように、VBAのDatediff関数では、"yyyy"(年)を指定すると[年差]が計算されます。月/日は関係ありません。したがって、たとえば年齢でいえば[満年齢]は計算してくれません。
そこで、満年齢を計算するようにしたのが次のプログラムです。
Public Function myDatedif2(fromDate As Variant, toDate As Variant)
myDatedif2 = DateDiff("yyyy", fromDate, toDate)
If Format(Month(fromDate) & "/" & Day(fromDate), "mm/dd") _
<= Format(Month(toDate) & "/" & Day(toDate), "mm/dd") Then
'そのまま
Else
'月/日 を超えていないので-1する
myDatedif2 = myDatedif2 - 1
End If
End Function
このプログラムで計算すると、次の通り、きちんと[満年齢]を表示しています。