Microsoft Excel VBA - 閏年を判定する関数

◆ Excel 2019動作確認済

閏(うるう)年とは、西暦年が4で割り切れる年のことです。ただし、100で割り切れる年は、その年がさらに400で割り切れる場合のみ、閏年となります。
C#には、閏年を判定するIsLeapYearメソッドがありますが、Excelにはそういう関数はないので、VBAでユーザー定義関数を作成する必要があります。

次のマクロは、で2000年から2120年までのうち、閏年をメッセージボックスに表示します。これでわかるように、2100年は閏年ではないようです。私は生きていないでしょうが(笑)。

Function IsLeapYear(年 As Integer) As Boolean
'機能:引数で与えられた年がうるう年かどうか判定するユーザー定義関数
'引数:年
'うるう年のときはTrueを返す

   Dim Leap As Boolean

    If ((年 Mod 4) = 0 And (年 Mod 100) <> 0 Or (年 Mod 400) = 0) Then
        Leap = True
    Else
        Leap = False
    End If
    
    IsLeapYear = Leap

End Function

Sub GetLeapYear()
    Dim i As Integer        '整数型変数
    Dim strYear As String   'うるう年を格納する文字列変数
    Dim ret
    
    strYear = ""    'strYearを初期化
    
    For i = 2000 To 2120 Step 1 '2000年から2120年までを調べる
        If IsLeapYear(i) Then       'iがうるう年なら
            'iは整数型変数なのでCstr関数で文字列にする必要がある
            strYear = strYear + CStr(i) + "年" + vbLf
        End If
    Next i
    
    'メッセージボックスに表示する
    ret = MsgBox("2000年から2120年までのうち、うるう年は以下のとおりです。" _
        + vbLf + vbLf + strYear, vbOKOnly + vbInformation, _
        "うるう年判定プログラム")
End Sub

なお、MsgBoxに表示するメッセージを蓄積する部分をクラスにして次のようにもできます。


[挿入]-[クラスモジュール]でクラスを追加します。追加したクラスのオブジェクト名を「clsUtility」にし、次のコードを入力します。

Public Sub AddToMsg(ByRef rstrMsg As String, rstrStringToAdd As String)
    'MsgBox関数による表示を書式化するために
    '変数に文字列を追加する
    
    If rstrMsg = "" Then
        rstrMsg = rstrStringToAdd
    Else
        rstrMsg = rstrMsg & vbLf & rstrStringToAdd
    End If
End Sub

標準モジュールの宣言部に次のコードを追加します。

Private Utility As New clsUtility

GetLeapYearプロシージャを次のように修正します。

Sub GetLeapYear()
    Dim i As Integer        '整数型変数
    Dim strYear As String   'うるう年を格納する文字列変数
    Dim strMsg As String
    Dim ret
    
    strYear = ""    'strYearを初期化
    
    For i = 2000 To 2120 Step 1 '2000年から2120年までを調べる
        If IsLeapYear(i) Then       'iがうるう年なら
            'iは整数型変数なのでCstr関数で文字列にする必要がある
            strYear = CStr(i) + "年"
            Utility.AddToMsg strMsg, strYear
        End If
    Next i
    
    'メッセージボックスに表示する
    ret = MsgBox("2000年から2120年までのうち、うるう年は以下のとおりです。" _
        + vbLf + vbLf + strMsg, vbOKOnly + vbInformation, _
        "うるう年判定プログラム")
End Sub

◆実行結果

実行結果



▼ページトップへ

◆Excelの日付関数を利用する方法

閏年は2月が29日まであることを利用して、引数に与えられた年の2月28日に1日加えた日が2月であれば、 その年は閏年と判定することができます。
新しいBookの標準モジュールに次のコードを記載します。

Function 閏年判定(年 As Integer) As Boolean
'機能:引数で与えられた年がうるう年かどうか判定するユーザー定義関数
'引数:年
'うるう年のときはTrueを返す
'引数で与えられた年の2月28日に1日を加えた日が2月ならその年は閏年
    Dim Leap As Boolean
    If (Month(DateSerial(年, 2, 28) + 1)) = 2 Then
        Leap = True
    Else
        Leap = False
    End If
    
    閏年判定 = Leap
    
End Function
Sub GetLeapYear2()
    Dim i As Integer        '整数型変数
    Dim strYear As String   'うるう年を格納する文字列変数
    Dim ret
    
    strYear = ""    'strYearを初期化
    
    For i = 2000 To 2120 Step 1 '2000年から2120年までを調べる
        If 閏年判定(i) Then       'iがうるう年なら
            'iは整数型変数なのでCstr関数で文字列にする必要がある
            strYear = strYear + CStr(i) + "年" + vbLf
        End If
    Next i
    
    'メッセージボックスに表示する
    ret = MsgBox("2000年から2120年までのうち、うるう年は以下のとおりです。" _
        + vbLf + vbLf + strYear, vbOKOnly + vbInformation, _
        "うるう年判定プログラム")
End Sub


▼ページトップへ