2020/05/14

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です。ここでは、主に設定する項目について説明します。
  1. '========== ⇩① フォーム準備 ============
  2. Private Sub UserForm_Initialize()
  3.  MonthView1.MonthRows = 1   '←カレンダーの表示数(縦列)
  4.  MonthView1.MonthColumns = 1  '←カレンダーの表示数(横列)
  5.  MonthView1.Font.Size = 9    '←カレンダーの文字サイズ
  6.  MonthView1.ShowToday = True  '←カレンダー下に「Today:・・・」を表示する
  7.  Me.Width = MonthView1.Width + (Me.Width - Me.InsideWidth) '←カレンダーに合わせてUserFormサイズを決める
  8.  Me.Height = MonthView1.Height + (Me.Height - Me.InsideHeight) '←カレンダーに合わせてUserFormサイズを決める
  9. End Sub
図3-4

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」はクリックした日付です。
  1. '========== ⇩② カレンダーをクリックした時の処理 ============
  2. Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
  3.  Selection.Value = DateClicked
  4.  Me.Hide
  5. End Sub
図3-7

13行目では、現在選択しているセルに、クリックした日付を記入します。
14行目では、セルに日付が記入された後、カレンダーを隠し(Hide)ます。


3-3.Worksheetのコード

特定のセルに日付を入力する場合は、シートの「SelectionChange」イベントで選択セル位置を取得し、そのセル位置が目的の場所であるかを判定した後、カレンダーを立ち上げます。
  1. '========== ⇩③ 特定のセルをクリックした時にカレンダーを表示する =========
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3.  If Target.Column = 3 Then
  4.   If Target.Row = 5 Or Target.Row = 8 Then
  5.    UserForm1.Show
  6.   End If
  7.  End If
  8. End Sub
図3-8

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月より切替開始)
解除の方法については「ダウンロードファイルのブロック解除方法」を参照下さい。