本ページはプロモーションが含まれています。

エクセルの万年カレンダーにコントロールボタンを設置してマクロを動かす&エクセルの関数をVBAで利用 土日でマスター エクセルVBA講座⑤

前回は、万年カレンダーにスピンボタンを設置して、年月をクリックすることによって移動させる記事を紹介しました。

スピンボタンで年月を移動する万年カレンダー
スピンボタンで年月を移動する万年カレンダー

しかし、マクロ(VBA)を利用しないとこれが限界です。

今回は、エクセル上にボタンを配置し、非常に簡単なマクロを実行し、年月を自由に移動できる万年カレンダーを作成してみたいと思います。

ベースとなる、万年カレンダーの記事はこちらです。マクロは利用していません。

目次

マクロ(VBA)記述の前の準備

実際にマクロ(VBA)を記述する前にしておく準備の紹介からです。

Excel マクロ有効ブック(*.xlsm)形式で保存

今回はマクロを記述しますので、まず始めにファイルをマクロ有効ブック形式で保存しておく必要があります。

Excel マクロ有効ブックで保存
Excel マクロ有効ブックで保存

拡張子は「xlsm」となります。

エクセルのシート上にコントロールボタンを配置するセルを準備

続いて、エクセルのシート上にコントロールボタンを配置するスペースを準備します。

そのために、年月を表示するセルをC1~E2に移動する必要があります。

一旦、結合されたセルA1~G1の結合を解除し、C2~E2セルに数式を移動し、改めてセルを結合した状態が下図です。

年月のタイトルを中央に
年月のタイトルを中央に

エクセルシート上にフォームコントロールボタンを配置する

マクロ記述の準備の最後に、上図のA1・B1・F1・G1セルにフォームコントロールのボタンを配置します。

「開発」タブの「挿入」「フォームコントロール」「ボタン」をクリックします。

「開発」タブが表示されていない方は、こちらの記事を参考にしてください。

「挿入」「フォームコントロール」「ボタン」
「挿入」「フォームコントロール」「ボタン」

今回は、F1セルにフォームコントロールのボタンを配置します。

ボタンを配置するとき、キーボードの「Alt」キーを押しながらドラッグするとセル内にぴったりと配置できます。

配置が完了すると、「マクロの登録」画面が出ますが、一旦「キャンセル」ボタンをクリックしてください(ボタン名は下図とは異なっている場合があります)。

あとでまとめてマクロ(VBA)を記述します。

「マクロの登録」は一旦「キャンセル」
「マクロの登録」は一旦「キャンセル」

ボタンがうまく設置できたでしょうか。1つ目のボタンが設置された状態が下図となります。

1つ目のコントロールボタンを配置完了
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年前のマクロもフォームコントロールボタンに記述してみましょう。ほぼ、コピペで完成しますよ。

まずは「1ヶ月前」の動作をするB1セルに配置されたボタンを右クリックして「マクロの登録」をクリックします。

フォームコントロールボタンにマクロを登録
フォームコントロールボタンにマクロを登録

先ほどと同様に「新規作成」ボタンをクリックし、Visual Basic Editorを開きます。

マクロの新規作成でVisual Basic Editorを開く
マクロの新規作成でVisual Basic Editorを開く

1ヶ月前に移動するマクロは簡単ですね。

「EDATE関数」の最後の引数を「-1」にするだけです。

myMonth = Range("c1").Value
Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, -1)
EDATE関数の引数を「-1」にする
EDATE関数の引数を「-1」にする

マクロの記述が終了したら、エクセルの画面に戻って「1ヶ月前」のボタンをクリックしてみてください。

うまく1ヶ月前に戻ることができたでしょうか。

ボタン一つで1ヶ月前に移動

それでは、「1年後」ボタンにマクロを記述しましょう。

G1セルを右クリックして「マクロの登録」「新規作成」です。

「マクロの登録」「新規作成」
「マクロの登録」「新規作成」

マクロの内容はもうお分かりでしょうか。EDATE関数の最後の引数に12(1年後)を設定するだけです。

myMonth = Range("c1").Value
Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, 12)
「1年後に進む」ボタンのマクロ
「1年後に進む」ボタンのマクロ

「1年後」ボタンをクリックすると、ちゃんと1年後のカレンダーになります。

まだ、2021年の祝日は登録していませんので祝日は表示されませんが。

1年後のカレンダーにジャンプ
1年後のカレンダーにジャンプ

最後に「1年前」ボタンの登録です。

もうマクロの記述はお分かりですね。

myMonth = Range("c1").Value
Range("C1").Value = Application.WorksheetFunction.EDate(myMonth, -12)
「1年後に戻る」マクロの記述
「1年後に戻る」マクロの記述

ちゃんと「1年前」に戻る動作を確認してみてください。

カレンダーが1年前に戻った

次はカレンダーに予定を入れても記録される万能カレンダーの作成

今回のマクロは比較的簡単だったと思います。

ただ日付や曜日を確認するだけのカレンダーですから、予定を書き込んだりすることはできません。

この記事のシリーズ当初から考えていた構想は、予定を書き込み、年月を移動しても予定が表示される、本当の意味での「万能カレンダー」です。

それを実現するには、複雑なマクロを利用しなければなりません。

次のカレンダー記事は大作になりますが、後日記事にしたいと思います。

お盆中くらいにはアップしたいと思います。

追記:アップしました。

関連コンテンツ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次