MonthViewコントロールを使ったカレンダー
1.背景
少し前に「セルへの日付入力をカレンダー日付クリックで選定する」で、フォーム上にコマンドボタンを並べてカレンダーにするものを紹介しました。これは作るのには少し面倒ですが、自分でレイアウトを工夫したりできます。今回は、ツールボックスのその他のコントロールに入っている「MonthViewコントロール」を使ってカレンダーを表示したいと思います。
尚このコントロールは、どのPCにも入っている訳では無さそうで、且つExcelのバージョンの問題でも無さそうです。
例えば私はOffice2016を2台のノートPCに入れていますが、一方はMonthViewコントロールが使え、もう一方には存在しない という具合です。
2.概要
MonthViewコントロールを使って表示させたのが、図2-1になります。(図2-1は、後で説明するUserFormのサイズ調整はしていない状態です。)
図2-1
使い方としては、カレンダーの日付をクリックするとイベントが発生し、その処理をする(例えばセルに日付を入力など)というものです。
3.プログラム
3-1.フォーム上の配置
「MonthViewコントロール」は、ツールボックスの既定コントロールではないので、ツールボックス上で右クリックをし「その他のコントロール」を選びます。そのリストの中の「Microsoft MonthView Control 6.0」を選択(左端の□枠に印をつける)し、「OK」をクリックする。
図3-1
すると、ツールボックスに「MonthViewコントロール」が追加されます。
図3-2
ツールボックスの「MonthViewコントロール」をクリックし、UsersFormにMonthViewを配置します。
図3-3
3-2.フォームのコード
3-2-1.フォームの起動
フォームとMonthViewのプロパティを設定します。もちろん、フォーム配置の際にプロパティを直接変更してもOKです。ここでは、主に設定する項目について説明します。
- '========== ⇩① フォーム準備 ============
- Private Sub UserForm_Initialize()
- MonthView1.MonthRows = 1 '←カレンダーの表示数(縦列)
- MonthView1.MonthColumns = 1 '←カレンダーの表示数(横列)
- MonthView1.Font.Size = 9 '←カレンダーの文字サイズ
- MonthView1.ShowToday = True '←カレンダー下に「Today:・・・」を表示する
- Me.Width = MonthView1.Width + (Me.Width - Me.InsideWidth) '←カレンダーに合わせてUserFormサイズを決める
- Me.Height = MonthView1.Height + (Me.Height - Me.InsideHeight) '←カレンダーに合わせてUserFormサイズを決める
- End Sub
3行目は、行方向(=縦方向)のカレンダー表示数です。また4行目は、列方向(=横方向)のカレンダー表示数です。
この値を変更すると、図3-5のように表示されます。
図3-5
5行目は、カレンダーの表示文字のサイズ設定です。この値を変更すると、図3-6の様に表示されます。
図3-6
「MonthView」コントロールには「Height」「Width」のプロパティがあります。通常のコントロールであれば、マウス操作でサイズを拡大縮小したり、このHeight・Widthプロパティでサイズを設定するのですが、「MonthView」に於いては「取得のみ」ですので、「MonthViewのサイズは文字サイズで変更」をします。
6行目はカレンダー下側の「Today:2020/05/14」などの「今日の日付を表示するか」の設定です。これをFalseにして文字を消しても、カレンダー内の赤丸(=今日の日付の意味)はそのまま残ります。
8~9行目は、「MonthViewのサイズに合わせてUserFormのサイズを変える」ものです。
通常は、フォーム配置時に目視でサイズ調整をするのが一般的ですが、フォームの内側(コントロールを配置できるエリア)のサイズから外サイズを求める方法を紹介します。
(なぜか、フォーム作成画面のプロパティ欄には載っていません。また、読取専用のプロパティです。)
フォーム内側のWidth : UserForm.InsideWidth
フォーム内側のHeight : UserForm.InsideHeight
つまり横の枠線の太さは「(Width - InsideWidth)/2」という事になり、5~6ポイント(PCの環境で異なるようです)となります。また下の枠線太さが横枠線と同じとすると「(Height - InsideHeight)-(Width - InsideWidth)/2」が上部のタイトル部高さということになり、約22ポイントと分かります。
このような設定することで、コントロールピッタリのフォームになります。(意味があるか否かは別として)
3-2-2.カレンダーの日付をクリックした時の動作
カレンダーが表示された後、その日付をクリックした時には「DateClick」イベントが発生します。引数として渡される「DateClicked」はクリックした日付です。- '========== ⇩② カレンダーをクリックした時の処理 ============
- Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
- Selection.Value = DateClicked
- Me.Hide
- End Sub
13行目では、現在選択しているセルに、クリックした日付を記入します。
14行目では、セルに日付が記入された後、カレンダーを隠し(Hide)ます。
3-3.Worksheetのコード
特定のセルに日付を入力する場合は、シートの「SelectionChange」イベントで選択セル位置を取得し、そのセル位置が目的の場所であるかを判定した後、カレンダーを立ち上げます。- '========== ⇩③ 特定のセルをクリックした時にカレンダーを表示する =========
- Private Sub Worksheet_SelectionChange(ByVal Target As Range)
- If Target.Column = 3 Then
- If Target.Row = 5 Or Target.Row = 8 Then
- UserForm1.Show
- End If
- End If
- End Sub
18~19行目のIF文で列・行を特定します。
20行目で、UserFormを起動しカレンダーを表示させます。
アプリとは言えませんが、以上のマクロを使うことで図3-9のように、C5セル・C8セルを選択するとカレンダーが表示され、日付クリックにより日付がセルに記入されます。
図3-9
4.最後に
もしあなたのPCでMonthViewが使用できるようであれば、一度試してみる価値はあると思います。とは言え、こんなに簡単にカレンダーが活用できるのに、使えるExcelと使えないExcelがあるのは少し残念です。一方「その他のコントロール」には、まだ未知のものが埋もれているでしょうから、楽しみながら捜していきたいと思います。
MonthViewコントロールを使ったカレンダー(it-027.xlsm)
セキュリティ向上を目的として「インターネット経由でダウンロードしたOfficeファイル(Excel等)のマクロは、既定でブロック」されるようにOfficeアプリケーションの既定動作が変更になりました。(2022年4月より切替開始) 解除の方法については「ダウンロードファイルのブロック解除方法」を参照下さい。 |