名簿などで、氏名のよみがなや入社年月日から勤続年数を、大量に入力しなければならない時、どうしてますか?

計算式や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

このプログラムで計算すると、次の通り、きちんと[満年齢]を表示しています。