日付関係のユーザー定義関数


文書番号: ac2002011
動作確認: Access 95/97/2002

◆概要
この資料は、Microsoft Accessで使える日付関係のユーザー定義関数を記載しています。

◆内容

アプリケーションを開発する中で、指定した日付からある特定の関係にある日付を表示したいことがあります。そういうときに使える日付関係のユーザー定義関数をご紹介します。


1.翌月の1日の日付を求める関数
2.月末の日付を求める関数
3.翌年の前月末日を返す関数(閏年対応)
4.指定された日付より前の、一番近い月曜日の日付を返す関数
5.指定された日付から現在の日付までの年数を返す関数
6.指定された日付から現在の日付までの年に満たない月数のみを返す関数
7.使用例

◆1.翌月の1日の日付を求める関数

次の関数は、引数として渡された日付の翌月の 1 日の日付を返します。
標準モジュールに以下のコードを貼り付けます。

Function FirstOfNextMonth(datAny As Date) As Date

    FirstOfNextMonth = DateSerial(Year(datAny), Month(datAny) + 1, 1)

End Function


▼ページトップに戻る

◆2.月末の日付を求める関数

次の関数は、引数dteInputで指定された日の属する月末日を返します。
標準モジュールに以下のコードを貼り付けます。

Function DaysInMonth(dteInput As Date) As Date

    Dim intDays As Integer

    ' 1 か月を加え、日付を引いて、その差を求めます。
    intDays = DateSerial(Year(dteInput), Month(dteInput) + 1, _
        Day(dteInput) + 1) _
        - DateSerial(Year(dteInput), Month(dteInput), Day(dteInput))

    DaysInMonth = DateSerial(Year(dteInput), Month(dteInput), Day(intDays))

End Function


▼ページトップに戻る

◆3.翌年の前月末日を返す関数(閏年対応)

次の関数は、引数dteInputで指定された日の属する月の翌年の前月末日を返します。
標準モジュールに以下のコードを貼り付けます。

Function EndofNextYear(dteInput As Date) As Date

    Dim intDays As Integer

    ' 1 か月を引き、日付を引いて、その差を求めます。
    intDays = DateSerial(Year(dteInput) + 1, Month(dteInput), _
        Day(dteInput) + 1) _
        - DateSerial(Year(dteInput) + 1, Month(dteInput) - 1, Day(dteInput))

    EndofNextYear = DateSerial(Year(dteInput) + 1, Month(dteInput) - 1, _
                    Day(intDays))

End Function


▼ページトップに戻る

◆4.指定された日付より前の、一番近い月曜日の日付を返す関数

次のサンプルは、指定された日付より前の、一番近い月曜日の日付を返す関数です。以下の条件に従って月曜日の日付を判断します。 現在の日付が火曜日から日曜日の場合は、前の月曜日の日付を返します。

現在の日付が月曜日の場合は、現在の日付を返します。

日付が NULL または無効な日付の場合は、NULL を返します。

標準モジュールに以下のコードを貼り付けます。

Function GetMonDate(CurrentDate As Date) As Date

      If VarType(CurrentDate) <> 7 Then
         GetMonDate = Null
      Else
         Select Case Weekday(CurrentDate)
            Case 1       ' Sunday
               GetMonDate = CurrentDate - 6
            Case 2       ' Monday
               GetMonDate = CurrentDate
            Case 3 To 7  ' Tuesday..Saturday
               GetMonDate = CurrentDate - Weekday(CurrentDate) + 2
          End Select
       End If

End Function


▼ページトップに戻る

◆5.指定された日付から現在の日付までの年数を返す関数

標準モジュールに以下のコードを貼り付けます。

Function Age(varBirthDate As Variant) As Integer

      Dim varAge As Variant

      If IsNull(varBirthDate) Then Age = 0: Exit Function
      varAge = DateDiff("yyyy", varBirthDate, Now)

      If Date < DateSerial(Year(Now), Month(varBirthDate), _
                           Day(varBirthDate)) Then
         varAge = varAge - 1
      End If

      Age = CInt(varAge)

End Function


▼ページトップに戻る

◆6.指定された日付から現在の日付までの年に満たない月数のみを返す関数

標準モジュールに以下のコードを貼り付けます。

Function AgeMonths(ByVal StartDate As String) As Integer

      Dim tAge As Double

      tAge = (DateDiff("m", StartDate, Now))

      If (DatePart("d", StartDate) > DatePart("d", Now)) Then
          tAge = tAge - 1
      End If

      If tAge < 0 Then
         tAge = tAge + 1
      End If

      AgeMonths = CInt(tAge Mod 12)

End Function


▼ページトップに戻る

◆7.使用例

今まで紹介した、上記の日付関係のユーザー定義関数を利用した例です。

上記の全てのコードが標準モジュールにあるものとします。


フォームにテキストボックスを7つ配置します。最初のテキストボックスの名前をtxtTodayに、コントロールソースを「=Today()」とします。下から3つめのテキストボックスの名前を「基準日」とします。下図を参考にそのほかのテキストボックスのコントロールソースを設定します。

フォームの設計

フォームのロードイベントハンドラ

Private Sub Form_Load()
    基準日.SetFocus
    基準日.Text = "2000/4/1"
End Sub

◆実行結果

実行結果




▼ページトップに戻る