8/09/2025

Excel。VBA。万年カレンダーを関数で作ると大変なのでVBAでつくってみました。【calendar】

Excel。VBA。万年カレンダーを関数で作ると大変なのでVBAでつくってみました。

<Excel VBA>

Excelで、万年カレンダーをつくりたい場合、色々考えなければいけません。

万年カレンダー

A1には年。


B1には月。


その値をつかった万年カレンダーの場合、1日を、該当する曜日から始めなければいけません。


その判断をする必要があります。


土曜日になったら、次の行に移動して、土曜日に+1するか、前の週に+7するなど考える必要があります。


最終週も4行でいいのか、5行必要なのか。


そして、月末日も考えなければいけません。


このように色々考えるならば、Excel VBAで考えてみたらどうなのでしょうか。


次のような構文をつくってみました。

Sub 万年カレンダー()

    Dim yearVal As Integer

    Dim monthVal As Integer

    Dim startDay As Integer

    Dim lastDay As Integer

    Dim rowOffset As Integer

    Dim colOffset As Integer

    Dim i As Integer

    

    yearVal = Range("A1").Value

    monthVal = Range("B1").Value

    Range("A4:G9").ClearContents

    

    startDay = Weekday(DateSerial(yearVal, monthVal, 1))

    lastDay = Day(DateSerial(yearVal, monthVal + 1, 0))

    

    rowOffset = 4

    colOffset = startDay

    

    For i = 1 To lastDay

        Cells(rowOffset, colOffset).Value = i

        

        If colOffset = 7 Then

            rowOffset = rowOffset + 1

            colOffset = 1

        Else

            colOffset = colOffset + 1

        End If

    Next i

End Sub


これで、実行すると、A4を起点とした、万年カレンダーをつくることができます。

もっといい方法があるとは思いますが、プログラム文を確認しておきましょう。


お馴染みの関数宣言です。

Dim yearVal As Integer   年をいれます

Dim monthVal As Integer  月をいれます

Dim startDay As Integer  1日が何曜日なのかという曜日番号をいれます

Dim lastDay As Integer  末日をいれます

Dim rowOffset As Integer 先頭行などの行番号をいれます

Dim colOffset As Integer  土曜日になったら改行したいのでそのために使用します

Dim i As Integer  繰り返し処理でつかいます


yearVal = Range("A1").Value

A1の年を代入します。


monthVal = Range("B1").Value

B1の月を代入しています。


Range("A4:G9").ClearContents

前に作った、日付が残っているので、カレンダーをクリアします。


startDay = Weekday(DateSerial(yearVal, monthVal, 1))

Weekday関数をつかって、1日が何曜日からはじまっているのかを求めます。


Weekday関数は、初期設定で、1を日曜日で2を月曜日、7が土曜日というように数値を割り振る関数です。


lastDay = Day(DateSerial(yearVal, monthVal + 1, 0))

28日とか30日とか31日などの、月末日を代入します。


 開始位置のオフセットを決定

rowOffset = 4

A4から開始万年カレンダーが始まりますのでA4の4を代入します。


colOffset = startDay

1日が何曜日なのかに応じて、万年カレンダーの開始列を設定します。


For i = 1 To lastDay Next 文 で、日付を入力します。


Cells(rowOffset, colOffset).Value = i

行と列が代入されています。


1日が入るセルはわかっているので、そこに1をいれます。

その後、2から末日の数値まで繰り返し処理をします。


If colOffset = 7 Then

    rowOffset = rowOffset + 1

    colOffset = 1 ' 次の週の日曜日へ

Else

    colOffset = colOffset + 1

End If

このIf Else End If文で、土曜日になったら、次の行に移動するようにしています。


7列目すなわちG列になったら、次の行に日付を入れる必要があるので、行に+1して、列は1であるA列に戻します。


それ以外は、列方向を+1させます。


これで、万年カレンダーをつくることができます。


関数で同じようなことを考えて作るよりも、Excel VBAでプログラム文をつくってみてもいいのかもしれません。