VBAでカレンダープログラミング

Myoga-SB-SDF-A2

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の範囲にカレンダーが出力されます。

CalendarVBA
Figure-1.1: 実行結果

セルの位置を直接指定しているため、1日の曜日に合わせてオフセットする処理が不要になる上、土曜日の出力後の改行も不要になります。また、ワークシートのセル上では数値はデフォルトで右揃えになるので、1~9日もそのまま出力して大丈夫です。

2. おわりに

今回のプログラムでは当月分のカレンダーだけを出力していました。これにセルの大きさを変えたり、罫線を引いたりして、あなただけのオリジナルカレンダーを作成してみてはいかがでしょうか。

[END]

コメント

タイトルとURLをコピーしました