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でプログラム文をつくってみてもいいのかもしれません。