前回は、万年カレンダーにスピンボタンを設置して、年月をクリックすることによって移動させる記事を紹介しました。
しかし、マクロ(VBA)を利用しないとこれが限界です。
今回は、エクセル上にボタンを配置し、非常に簡単なマクロを実行し、年月を自由に移動できる万年カレンダーを作成してみたいと思います。
ベースとなる、万年カレンダーの記事はこちらです。マクロは利用していません。
マクロ(VBA)記述の前の準備
実際にマクロ(VBA)を記述する前にしておく準備の紹介からです。
Excel マクロ有効ブック(*.xlsm)形式で保存
今回はマクロを記述しますので、まず始めにファイルをマクロ有効ブック形式で保存しておく必要があります。
拡張子は「xlsm」となります。
エクセルのシート上にコントロールボタンを配置するセルを準備
続いて、エクセルのシート上にコントロールボタンを配置するスペースを準備します。
そのために、年月を表示するセルをC1~E2に移動する必要があります。
一旦、結合されたセルA1~G1の結合を解除し、C2~E2セルに数式を移動し、改めてセルを結合した状態が下図です。
エクセルシート上にフォームコントロールボタンを配置する
マクロ記述の準備の最後に、上図のA1・B1・F1・G1セルにフォームコントロールのボタンを配置します。
「開発」タブの「挿入」「フォームコントロール」「ボタン」をクリックします。
「開発」タブが表示されていない方は、こちらの記事を参考にしてください。
今回は、F1セルにフォームコントロールのボタンを配置します。
ボタンを配置するとき、キーボードの「Alt」キーを押しながらドラッグするとセル内にぴったりと配置できます。
配置が完了すると、「マクロの登録」画面が出ますが、一旦「キャンセル」ボタンをクリックしてください(ボタン名は下図とは異なっている場合があります)。
あとでまとめてマクロ(VBA)を記述します。
ボタンがうまく設置できたでしょうか。1つ目のボタンが設置された状態が下図となります。
ボタンの表示名を変更する
コントロールボタンの表示名を変更します。コントロールボタンをクリックするとカーソルが点滅しますので、変更可能になります。
ここでは先に進むという意味の「▶」に変更しました。
同様にA1・B1・G1セルにコントロールボタンを配置します。いずれもマクロの記述は後で一気に記述しますので「マクロの登録」はキャンセルします。
また、A1セルから順にボタンの表示を左から「◀◀」「◀」「▶▶」と変更します。
下図が、マクロを登録する前の準備が完成した状態です。
いよいよマクロ(VBA)の記述
今回は、フォームコントロール「ボタン」を配置し、「ボタン」を押すことによってマクロを動作させる例となります。
それでは、さっそくマクロを記述していきましょう。
F1セルにあるフォームコントロール「ボタン」を右クリックして、「マクロの登録」をクリックします。
すると、下記のダイアログボックスが開きます。
右側の「新規作成」をクリックします。
すると、「Microsoft Visual Basic for Application」が開きます。
さらに自動的に下のような文字列が表示されます。
Sub ボタン3_Click() End Sub
この空白行の間にマクロを記述していきます。
今回は、その空白に下のように記述します。
myMonth = Range("c1").Value Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, 1)
記述したマクロの解説
それでは、今回のマクロの意味を解説をいたします。
非常にシンプルなマクロとなっています。
日付を格納する変数を用意する
次の記述では、「myMonth」という変数(数字を格納する箱のようなもの)に、C1セルの数値を一旦格納しています。
myMonth = Range("c1").Value
エクセルの関数をVBAで利用する
さらに、次の一文で、C1セルの1ヶ月後の数値を求め、C1セルに上書きしています。
Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, 1)
「EDATE」関数とは、ある日付の1ヶ月先や2ヶ月先などの正確な日付を求めるエクセルの関数です。
VBAの関数「DateAdd関数」もありますが、普段エクセルで利用している関数がVBAでも利用可能ですから、こちらの方が理解がしやすいですね。
エクセルで利用している関数をVBAで利用するには「Application.WorksheetFunction.」を先頭につけることで利用が可能になります。
ここでは、変数「myMonth」の1ヶ月後の日付データをセルC1に設定しているという意味です。
非常に単純で簡単なマクロですね。
実際の動作を確認してみる
実際に、F1セルに配置した「1ヶ月後」のボタンをクリックしてください。
下図のようにカレンダーが1ヶ月後に移動しましたでしょうか。
1ヶ月前、1年後、1年前のマクロも追加
それでは、1ヶ月前、1年後、1年前のマクロもフォームコントロールボタンに記述してみましょう。ほぼ、コピペで完成しますよ。
まずは「1ヶ月前」の動作をするB1セルに配置されたボタンを右クリックして「マクロの登録」をクリックします。
先ほどと同様に「新規作成」ボタンをクリックし、Visual Basic Editorを開きます。
1ヶ月前に移動するマクロは簡単ですね。
「EDATE関数」の最後の引数を「-1」にするだけです。
myMonth = Range("c1").Value Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, -1)
マクロの記述が終了したら、エクセルの画面に戻って「1ヶ月前」のボタンをクリックしてみてください。
うまく1ヶ月前に戻ることができたでしょうか。
それでは、「1年後」ボタンにマクロを記述しましょう。
G1セルを右クリックして「マクロの登録」「新規作成」です。
マクロの内容はもうお分かりでしょうか。EDATE関数の最後の引数に12(1年後)を設定するだけです。
myMonth = Range("c1").Value Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, 12)
「1年後」ボタンをクリックすると、ちゃんと1年後のカレンダーになります。
まだ、2021年の祝日は登録していませんので祝日は表示されませんが。
最後に「1年前」ボタンの登録です。
もうマクロの記述はお分かりですね。
myMonth = Range("c1").Value Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, -12)
ちゃんと「1年前」に戻る動作を確認してみてください。
次はカレンダーに予定を入れても記録される万能カレンダーの作成
今回のマクロは比較的簡単だったと思います。
ただ日付や曜日を確認するだけのカレンダーですから、予定を書き込んだりすることはできません。
この記事のシリーズ当初から考えていた構想は、予定を書き込み、年月を移動しても予定が表示される、本当の意味での「万能カレンダー」です。
それを実現するには、複雑なマクロを利用しなければなりません。
次のカレンダー記事は大作になりますが、後日記事にしたいと思います。
お盆中くらいにはアップしたいと思います。
追記:アップしました。
コメント