毎日暑い日が続いていますね。体調を崩さないようにご注意ください。
さて、今日はカレンダーを作成します。
方法はたくさんあるでしょうが、今回は、VBAを使って作ってみましょう。
せっかくですから、年と月を自由に指定できるようにしますよ。
下の図が、今回のカレンダーです。
年と月を指定し、作成ボタンを押すと、カレンダーが自動的に作成されます。
あらかじめ、1行目の曜日の見出しと枠線は、作りこんでおいてください。
それでは、VisualBasicEditorを起動します。
Altキーを押しながらF11キーを押すと起動します。
挿入メニューから「標準モジュール」をクリックします。
これでコードを書く準備が整いました。
べたなプロシージャ名ですが、「カレンダー作成」とし、コードを記述してください。
Sub カレンダー作成()
Range("A2:G7").Value = ""
MakeCalendar
End Sub
画像も載せておきます。
処理内容としては、日付をクリアして、MakeCalendarというプロシージャを呼び出すだけです。
つまり、カレンダー作成のメインプログラムは、MakeCalendar なのです。
それでは、その MakeCalendar のコードを書きましょう。
Sub MakeCalendar()
'条件分岐を使ったプロシージャ
Dim nen As Integer, tsuki As Integer
nen = Range("J1").Value
tsuki = Range("L1").Value
Dim FirstDay As Date
'ユーザーが指定した年月の1日目を日付として生成
FirstDay = DateSerial(nen, tsuki, 1)
Dim lastDay As Integer
lastDay = Day(DateSerial(nen, tsuki + 1, 1) - 1)
Dim RowNo As Integer
Dim ColumnNo As Integer
RowNo = 2
ColumnNo = Weekday(FirstDay, vbSunday)
Dim i As Integer
For i = 1 To lastDay
Cells(RowNo, ColumnNo).Value = i
If ColumnNo = 7 Then
ColumnNo = 1
RowNo = RowNo + 1
Else
ColumnNo = ColumnNo + 1
End If
Next
End Sub
繰り返し処理と条件分岐を駆使します。
列番号が7になると、次の行の1列目に移動する点がポイントです。
これでめでたしめでたし、といきたいところですが、これでは、短すぎて、ケンさんに怒られてしまうので、
もう少し、お付き合い下さい。
カレンダーのように、一定の周期で繰り返されるデータに関しては、工夫すると条件分岐を使わないで済む場合があります。
少しばかり、頭を使いますが、これもパズルのようで楽しいもんです。
周期のある場合、よく使うのが割り算です!
それも、余り(剰余)が大活躍します。
今回も、基本的には、7で割った余りをうまく使います。これが列を特定するのに役立ちます。
行は、割り算の商を活用します。
それでは、MakeCalendar1 という名前でプロシージャを書いてみましょう。
Sub MakeCalendar1()
'条件分岐を使用しないでカレンダーを作成
Dim nen As Integer, tsuki As Integer
nen = Range("J1").Value
tsuki = Range("L1").Value
Dim FirstDay As Date
'ユーザーが指定した年月の1日目を日付として生成
FirstDay = DateSerial(nen, tsuki, 1)
Dim k As Integer
'ユーザーが指定した年月の1日目の曜日を取得
'日曜:1 月曜:2 火曜:3 ・・・
k = Weekday(FirstDay, vbSunday)
Dim lastDay As Integer
'ユーザーが指定した年月の末日を取得
'翌月1日の前日が、当月の末日
lastDay = Day(DateSerial(nen, tsuki + 1, 1) - 1)
Dim i As Integer
Dim r As Integer, c As Integer
For i = k To k + lastDay - 1
'行番号を算出
'7で割った商に補正係数の2を加算
r = Int((i - 1) / 7) + 2
'列番号を算出
'7で割った余りに1を加算
c = (i - 1) Mod 7 + 1
'上記の行列番号の番地のセルに数字の1から順番に代入
Cells(r, c).Value = i - k + 1
Next
End Sub
解説は、コードに書いておきました。
行も列も、商や剰余を使って、どうやったらカレンダーができるか、考えてみると面白いですよ。
ループのカウンター変数iの設定を
For i= 1 to 31
にして、
Cells(r, c).Value = i
にしてから実行すると、仕組みが分かりやすいでしょう。
なお、このMakeCalendar1 を使ってカレンダーを作成するには、ボタンにこのプロシージャを登録してください。
ちなみに、今日から50年後の2061年7月のカレンダーを作成してみました。
なんと!今年と同じ曜日でした!!
だい