Hello~! ミョウガです!
今回はVBA(Visual Basic Application)を使って、Excelのワークシートにカレンダーを出力してみようと思います。
1. VBAでカレンダーを出力してみよう
VBAには日付を扱うためのDate型があります。これを使ってコーディングしてみます。基本的に前回のをベースにしています。
Sub Calendar()
' 現在の日付を取得します。
Dim now As Date
now = Date
' 当月1日を表すインスタンスを生成します。
Dim iday As Date
iday = DateSerial(Year(now), Month(now), 1)
' セルの位置を指定するための変数です。
Dim seq As Integer
' 1日の位置に合わせてオフセットします。
seq = Weekday(iday) - 1 ' 日曜日が1、月曜日が2、・・・となっています。
' 文字色を日曜日では赤、土曜日では青に設定します。
Range("A1", "A6").Font.ColorIndex = 3
Range("G1", "G6").Font.ColorIndex = 5
Do
' 日付を出力します。
Cells(seq \ 7 + 1, seq Mod 7 + 1).Value = day(iday)
' idayの日付を1日分進めます。
iday = DateAdd("D", 1, iday)
' seqをインクリメントします。
seq = seq + 1
' idayの月が変わるまで繰り返します。
Loop While Month(iday) = Month(now)
End Sub
※1 : VBAでは++演算子でインクリメントすることができません。
※2 : VBA(というよりはVisual Basic系)で他の言語のような整数の割り算をする時の演算子は「/」でなく「\」を使います。「/」では結果が小数となり、整数型変数に代入すると小数点以下が四捨五入されます。
なお、プログラムはhttps://gist.github.com/Nia-TN1012/bf5a19a2502d0280fa077d5027a4b211でも公開しています(※GitHubアカウントの統合のため、ニア側のGistに移動しました)。
コンテストにはこのプログラムで応募しました。
Cellsに指定する行・列の値はそれぞれ1から始まります。そのため、行は7で割った値(小数点以下切り捨て)に1を加算した値、列は7の余剰に1を加算したものを指定すると、Figure-1.1に示すようにA1からG6の範囲にカレンダーが出力されます。
セルの位置を直接指定しているため、1日の曜日に合わせてオフセットする処理が不要になる上、土曜日の出力後の改行も不要になります。また、ワークシートのセル上では数値はデフォルトで右揃えになるので、1~9日もそのまま出力して大丈夫です。
2. おわりに
今回のプログラムでは当月分のカレンダーだけを出力していました。これにセルの大きさを変えたり、罫線を引いたりして、あなただけのオリジナルカレンダーを作成してみてはいかがでしょうか。
[END]
コメント