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
▼ページトップへ