t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA イミディエイトウインドウを使って簡単にカレンダーを作る方法

Excelでは色んな方法でカレンダーを作ることができるが、割と面倒くさい。

今回はイミディエイトウインドウを使って、以下のようなカレンダーをサクっと作る方法を紹介。
f:id:t-hom:20190301021717p:plain

まず、曜日を描きたい場所を範囲選択しておく。
f:id:t-hom:20190301022034p:plain

そしてイミディエイトウインドウで次のコードを順に実行する。

n = 1
for each r in selection:r.value = format(n,"aaa"):n=n+1:next

これで曜日の出来上がり。
f:id:t-hom:20190301022934p:plain

次に、下図のように選択する。(選択を開始する位置は、その月の1日の曜日)
f:id:t-hom:20190301023151p:plain

やり方は、Ctrlキーは選択がすべて終わるまで押しっぱなしで、各行をマウスドラッグすればOK。
このときに選択する順は必ず上からになるように注意。
f:id:t-hom:20190301023935p:plain

そして先ほどイミディエイトウインドウに書いたコードを少しだけ修正する。

n = 1
for each r in selection:r.value = n:n=n+1:next

n = 1にカーソルを合わせてEnterで実行し、次の行もEnterで実行すると、ほぼ完成。
f:id:t-hom:20190301024326p:plain

最後に、余分な日付を手動削除しておしまい。

解説

イミディエイトウインドウでは変数宣言こそできないものの、変数への代入は普通にできる。宣言も特に必要ない。
別のプロシージャが実行されるか、明示的にリセットボタン(下図)が押されるまでは有効なので、イミディエイトウインドウでコマンドを入れ続ける間は変数が保持される。
f:id:t-hom:20190301022638p:plain

また、VBAのFormat関数では、format(日付, "aaa")で曜日を取り出すことができる。VBAにおける日付型はDouble型で表され、その整数部が日付、小数部が時刻である。

数値1は1899年12月31日(日)なので、Format(1, "aaa")は日曜日を返す。

?cdate(1)
1899/12/31 
?format(1,"aaa")
日

イミディエイトウインドウでは、一度実行したコードでもカーソルを合わせると編集でき、Enterで再実行できる。実行時はカーソルが行内のどこにあっても構わない。Enterは改行ではなくコード実行になるので注意。改行したい場合はCtrl + Enter。
(マルチラインコードの実行ができるわけではないので改行という表現は微妙。改ステートメントと言ったほうが実態に近い。そんな言葉ないけど。)

For EachにSelectionを渡した場合、セルの選択順に実行される。
セル範囲の場合は1ドラッグを1範囲とみなし、選択した範囲順になる。ただし範囲内の順は左上から右下へ向かう。

分かりやすくテストしたのが以下。
f:id:t-hom:20190301025910p:plain

今これを書きながら気づいたんだけど、以下のように選択しても同じ結果になる。
f:id:t-hom:20190301030255p:plain

こっちの方が楽だ。

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。