エクセルVBAのユーザーフォームを使って自作カレンダーを作る方法

祝日対応カレンダー

私自身2017年12月まで使っていたエクセル2007には、標準機能として日付を入力するためのカレンダーコントロールがあり、日付入力が簡単でしたが、現在はなくなっています。

エクセルを使っていて日付を入力する事って多くあり、テンキーなどを使う作業って意外と面倒ですよね。そこでボタンを押したら日付が入力されるようにオリジナルカレンダーを作る方法をご紹介します。

目次

かつての日付入力はカレンダーコントロールが便利だった

カレンダーコントロール
カレンダーコントロール
エクセルのバージョンにより使用できない

左上の画像がエクセル2007で多くの方が便利に使っていたカレンダーコントロールです。

これがエクセル2016になると、左下の画像のような表示が出て全く使えなくなってしまいます。

今まで使っていたカレンダーコントロールを組み込んだエクセルファイルが使えなくなって大パニックなんて状態でした。

まだエクセル2007を使っている方もいるかもしれないので、カレンダーコントロールについて書いていきます。

オフィス2007プロフェッショナルに付いているエクセル2007のみ使えたカレンダーコントロールなので、それ以外のエクセルでは動きません。

アップグレード版のオフィス2013プロフェッショナルやオフィス2016プロフェッショナルをインストールした場合は、現在2024年9月でも動いていますが、使用をおススメはしません。(ネットにつながない状態で確認済)

オフィス自体も当時のバージョンのエクセル自体サポートが終了しているので、セキュリティー上も危険なので使わない方がいいですよ。

そこでカレンダーをユーザーフォームを使って作ってみましょう。

カレンダーを自作しよう

エクセルでカレンダーを作るだけならば、様々な数式を使って作る事はができますが、カレンダーコントロールの代用として作ろうと思うとかなり大変です。

そこで、エクセル🔰でも多少のVBAの知識とエクセル関数を組み合わせることによって、比較的簡単に自作カレンダーを作ることができますよ。

そして多少なりともVBA知識が習得したら追記という形で、VBAコードに置き換えてできる方法を併記しています。

excelvba自作カレンダー
excelvba自作カレンダー

左の画像は自作カレンダーです。

エクセルVBAの初心者には、ちょっと手間になりますが組み合わせればできそう。

  1. エクセルVBA
  2. エクセル関数

エクセルVBAで理解できていない部分はエクセル関数を使ってワークシートに用意しておけば、自作カレンダーができあがりました。

  1. 年・月をリストから選択して【日付表示】を押すと選んだ月のカレンダーが表示される
  2. 表示されたカレンダーから選びたい日をクリックする
  3. 決定ボタンを押すと指定したセルへ転記される
  4. 間違った時は取消ボタンを押すと直前の日付を消去

では、実際にエクセルVBAとエクセル関数を組み合わせて自作カレンダーの作り方をご紹介します。

カレンダー準備(ワークシート上)

初心者がカレンダーを作る為には、ワークシートにカレンダーをエクセル関数を使って作成しておくことで、マクロ上での作業を減らすことができるので難易度が低くなります。

カレンダーといっても基本操作はユーザーフォームで行うので、ワークシートの余白でもどこでもいいので、後から付け足すことも簡単ですよ。

最初にカレンダーの日付リストを作りますので、ここではセルA1からではなく空いていたセルBG1から始まっています。

エクセル関数日付リスト
出来上がっていたエクセルに組み込んだのでセルBGから始まっています

左図の説明をします。(クリックで拡大可)

  • 【セルBG1】セルBG2とセルBG3からカレンダー表示したい年月日表示
  • 【セルBG2】カレンダー表示したい年
  • 【セルBG3】カレンダー表示したい月
  • 【列BI】コンボボックスに表示する為の年・月
  • 【列BJ】コマンドボタンの番号を間違わない為に用意(無くても大丈夫です)
  • 【列BK】関数により計算された日付
  • 【列BL】ユーザーフォームに表示する日付(年・月を除いた日だけにする)
  • 【列BM】当月以外を半透明にするために用意したけど挫折中
  • 【列BO】祝日(振替など)の為に用意したけど挫折中

エクセルVBAの知識がまだまだ🔰の頃は、このようにワークシートに事前準備することで、自作カレンダーを作ることができました。

ちょっとVBAの知識を習得できたら、ここに記載しているワークシート上に日付(年月日)を用意する方法ですが、コンボボックスを利用して西暦を現在日付から自動取得させることもできるようになりました。

話を戻して、緑色のセルに日付に関するエクセル関数が入っていますのでその説明をします。

DATE関数で日付を自動表示

日付を自動的に表示するエクセル関数が【DATE関数】で、「年・月・日」を3つの数字、言い換えれば3か所のセルの値から組み合わせて日付表示をしてくれるエクセル関数です。

その為にセルの値が変われば、自動的に日付が変更されるので便利な関数なので、先ほどの図のようにセルBG2とセルBG3の値が変わればセルBG1が変わるので、列BKも変わり、ユーザーフォームの日付も自動的に変わってくれるよいう仕組みなのです。

ここでは、年・月しか入力しないので、日は常に1日とします。そうすると・・・

「=DATE(年,月,日)」となるので、図を参考にすると「=DATE(BG2,BG3,1)」になります。

WEEKDAY関数で日付と曜日を自動修正

日付自動表示ができたら、次は日付と曜日を【WEEKDAY関数】で自動修正しましょう。

最初、何も考えずシンプルにセルBG1の日付を列BK1から順にコピーしても日付も曜日も思い通りに表示されません。

それもそのはず、2018年6月1日は日曜日ではなく、金曜日なのです。

カレンダーではその前にある「日・月・火・水・木」には5月最終週の日付表示をさせなくてはいけないからです。

このWEEKDAY関数で月が替わればカレンダーも連動して日付表示が変わってくれます。

本来WEEKDAY関数は曜日を教えてくれる関数なので、「=WEEKDAY(BG1)」とすると、2018/6/1ならば、6となります。日曜日から数えると6番目だからです。

最初のワークシートの図で説明するとBK6に2018年6月1日が表示されなくてはいけないので、BK1は2018年5月27日にすればいいのです。

その為に6月1日から引いてあげましょう。

「=BG1-WEEKDAY(BG1)」とすると2018/5/26になります。

正しく表示されませんね。

当たり前で、6月1日から6を引いたからで引き過ぎなのです。

6番目が6月1日なので、本当は5を引けばいいのですがWEEKDAY関数は先ほどもお話しした通り、あくまでも曜日を数値化して返すので無理なんです。

それならば、1引きすぎたので、単純に1を足してあげれば完了です。そこで、こうすればいいのです。

「=BG1-WEEKDAY(BG1)+1」になります。

あとは、BK2からBK42までは、上の数字に1を足すだけでいいので、セルBK2には「=BK1+1」になります。

セルBK3には「=BK2+1」・・・セルBK42には「=BK41+1」です。

ただ、このままだと表示が2018/6/1とカレンダー表示に必要のない年・月があるので、表示を日付だけにします。

セルBK1からBK42を選択して
➡右クリック
➡セルの書式設定
➡表示形式
➡分類で「ユーザー定義」を選び
➡種類を「d」にすると日付のみの表示にできます。

これでワークシートでのエクセル関数【DATE関数】と【WEEKDAY関数】を使ったカレンダー作成の準備は一段落です。

ユーザーフォームの設定

カレンダーの土台はすでに完成したので、次はユーザーフォームを使ってVBAコードを書いていきますが、ユーザーフォームについての詳細はここでは省略します。

excelvba自作カレンダー
excelvba自作カレンダー

左図のようにカレンダーをエクセルVBAのユーザーフォームから作ります。

ユーザーフォームには「コンボボックス」と「ラベル」と「コマンドボタン」で作成していますので順に説明を書いていきます。

また、土日には色を付けていますが、私の知識では祝日には対応できていません。

年・月をコンボボックスで作成

カレンダーで日付選択する時には、年・月はある程度決まっている事が多いので、テキストボックスに数字を毎回入力するよりはリストから選んだ方が確実です。

例えばスケジュールの入力や商品仕入れであれば、過去はあまりないので2018・2019・2020ぐらいでいいでしょうし、まして月は1月~12月と決まっています。

そこでコンボボックスを配置し、データ元(プロパティRowSource)はBI2:BI4が年でBI7:BI18が月で設定するだけなので、年を変えるならばこの部分を変更するだけでいつでも変えることができます。

42個のコマンドボタンを配置

一番面倒で地味な作業ですが、カレンダーで日付表示をする為にコマンドボタンを1週間分×6週で42個並べます。

そしてちょうどいい大きさにして、綺麗に並べて、キャプションを全て消して地味な作業を繰り返します。

完成したカレンダーの画像で説明すると、CommandButton1は一番左上5月27日(日)になり、あとは日付順にCommandbutton2・・・最後一番右下7月7日(土)はCommandButton42となっています。

【日付表示】ボタンを押すことにより、この42個のコマンドボタンの日付表示が自動的に当該月の日付表示になります。

そして、各ボタンにも地味にコードを入れなくてはいけません。

日付取得VBA

Private Sub CommandButton1_Click()
Range(“A1”).Value = Range(“BK1”).Value
End Sub

解説
  1. コマンドボタン1がクリックされたら
  2. セルA1の値はセルBK1の値を取得する
  3. マクロ記録終了

これでCommandButton1を押すとセルA1にセルBK1の値(日付)が転記されます。

面倒なのですが、コマンドボタン2の時はBK2と書き換えて最後のコマンドボタン42までこの作業を行います。

これにより、選んだ日付は必ずA1セルに転記されてくれるので、【決定】ボタンで好きなように指示ができるので、応用範囲が増えます。

カレンダーに表示された日付を押すと指定したセルに日付が転記(表示)されるので完成しました。

この時に、転記するセルやシートによって画面がちらつくのでちらつき防止のVBAコードを書き足しておく方法もありますが、詳細はここでは省略します。

【日付表示】ボタンでカレンダー自動表示

コンボボックスで選んだ年・月をワークシートのセルBG2とBG3に転記して日付をユーザーフォーム上に表示させるコマンドボタンです。

この【日付表示】ボタン(コマンドボタン43)には下記コードが書いてあります。

VBA

Private Sub CommandButton43_Click()
If UserForm6.ComboBox1.Value = “” Or UserForm6.ComboBox2.Value = “” Then
MsgBox “日付が選択されていません”
Else
Range(“BG2”).Value = UserForm6.ComboBox1.Value
Range(“BG3”).Value = UserForm6.ComboBox2.Value
For d = 1 To 42
Cells(d, 64).Value = Day(Cells(d, 63).Value)
Next d
For i = 1 To 42
With UserForm6.Controls(“Commandbutton” & i).Caption = Cells(i, 64)
End With
Next i
End If
End Sub

解説
  1. コマンドボタン43がクリックされたら
  2. もしユーザーフォーム(UserForm6)のコンボボックス(ComboBox1)が空白、またはComboBox2が空白だったら
  3. メッセージで「日付が選択されていません」と表示する
  4. 入力されていたら
  5. セルBG2にUserForm6のComboBox1で選択された年を転記する
  6. セルBG3にUserForm6のComboBox2で選択された年を転記する
  7. 繰り返し処理で変数「d」を宣言し、繰り返し変数「d」に入る数字は1~42とする
  8. セル番号(行はd行目で列64列目)の値は、年月日になっているセル番号(行はd行目で列63列目)の値を日だけにして転記する
  9. 繰り返し1行目から42行目まで行う
  10. 繰り返し処理で変数「i」を宣言し、繰り返し変数「i」に入る数字は1~42とする
  11. UserForm6に配置されたコマンドボタンのキャプションをセル変数i行目の64列目の値を表示する(先ほどの日だけの数字が表示されます)
  12. Withステートメント終了
  13. 繰り返し1行目から42行目まで行う
  14. IFステートメント終了
  15. マクロ終了

繰り返し処理を使わずにRange(“BL1”).Value = Day(Range(“BK1”).Value)を42回繰り返しても可能ですが、面倒で大変なのでFor~Nextを使った方が簡単ですよ。

また、コマンドボタンのキャプションも一緒ですね。

もう少し知識があれば、7・8・9行目の処理が必要なくなるのですが、私の現状レベルでは年月日でWEEKDAY関数で表示だけ日付にしていても、コマンドボタンに転記すると「2018/0601」となってしまうので、やむなくこのコードを入れて、WEEKDAY関数のセルの隣に日だけ取り出した値を記載させてからコマンドボタンに表示させると「2018/6/1」が「1」となってくれました。

日付転記の【決定】ボタン

アレンジの一つです。日付を縦に続けて(例えばセルA3から順番に決定ボタンを押した分入力済み最終セルと取得して最終行の下に)転記するコードを記載してみましょう。

例えば日付を選んだらセルA1に転記されている前提で最終行に追記する方法でセルA2には「日付」と入力されています。

VBA

Private Sub CommandButton44_Click()
If Range(“A1”).Value = “” Then
MsgBox “日付が選択されていません”
Else
Range(“A3”).Select
If Range(“A4”).Value = “” Then
Range(“A4”).Value = Range(“A1”).Value
Else
ActiveCell.End(xlDown).Offset(1, 0).Value = Range(“A1”).Value
End If
End Sub

解説
  1. コマンドボタン44がクリックされたら
  2. もしセルA1が空欄だったら
  3. 「日付が選択されていません」とメッセージ表示をする
  4. そうでなかったら(入力されていたら)
  5. セルA3を選択する
  6. もしセルA4が空欄だったら
  7. セルA4の値はセルA1の値にする
  8. そうでなかったら(入力されていたら)
  9. 入力済み最終行の1行下で同じ列の値はセルA1の値にする
  10. Ifステートメント終了
  11. マクロ終了

間違った時の取消ボタン

アレンジのひとつで、連続して入力した時に間違ってボタンを押してしまったり修正したいときに1行上に戻って再入力する為のVBAコードです。

取消ボタンVBA

Private Sub CommandButton45_Click()
ActiveCell.End(xlDown).Offset.Value = “”
End Sub

解説
  1. コマンドボタン45がクリックされたら
  2. 入力済みセルの最終行の値を空欄にする
  3. マクロ終了

土日に色を付けて完成

本音を言うと祝日設定ができるように自分のエクセルVBAの知識があればいいのだけれど、そこまでのレベルにはまだまだ達していないので、条件におじて日付の色を変更するなんてできません。

そこで、ちょっとだけでもカレンダーっぽくしたいので土日に色を付ける事にしました。

土曜日は青色、日曜日は赤色。

条件が無いので、初歩的なラベルやコマンドボタンのプロパティで簡単に変更できます。

これで多少なりとも見栄え良くなったかな?

こんな感じでエクセルで作った自作カレンダーを利用しています。

祝日対応カレンダーフォーム

自作カレンダーフォームを作ってから約3年、コロナ禍でヒマになってしまいエクセルと向き合う時間が増えたというより、人員カットで一人当たりの作業が倍増してさらに作業時間を短縮しないと回らなくなったという状態。

そういえば、カレンダーフォームが祝日対応していないのでカレンダーをパソコンの横に置いて作業するという手間を解消しようと祝日対応カレンダーフォーム作成に挑戦してみました。

案の定、まだまだ全てをVBAで行うレベルではないので、祝日リストのみワークシートに準備することで祝日対応カレンダーフォームが完成したので、次のページでご紹介します。

ワークシート中心で作成
祝日判定付き自作カレンダーフォーム
祝日判定付き自作カレンダーフォーム

左が先ほどまで紹介していたワークシートに日付取得などエクセル関数を活用して作成した2018年当時作成のカレンダーで、右が今回作成した祝日対応して2月以外の日付は不要なので消去したカレンダーです。

前回と見た目はそんなに変わらないのですが、祝日が赤色で表示できるようになり当月以外の日にちが非表示になった点が改良点です。

そして今回はワークシートには計算式など使わず、ワークシートには祝日リストのみ作成していますが、これも過去・未来の祝日を自動的に取得することは現状のVBA知識レベルではムリなのでリスト化しました。

また、VBAコードをまとめるだけの知識レベルではないので、作業手順ごとにコードを書いていたら長くなってしまいましたが、作業ブロックごとに分かれているのでそんなに難しくないと思います。

祝日対応カレンダーVBA

Private Sub UserForm_Initialize()
Dim i As Long, j As Long
For i = -1 To 121
UserForm5.ComboBox1.AddItem Year(Date) – i
Next i
ComboBox1.ListIndex = 1
For j = 1 To 12
UserForm5.ComboBox2.AddItem (j)
Next j
ComboBox2.ListIndex = Month(Date) – 1
y = ComboBox1.Value
m = ComboBox2.Value
w = DateSerial(y, m, 1)
c = w – Weekday(w) + 1
ds = Weekday(w)
de = DateSerial(y, m + 1, 1) – 1
dc = de – w
For i = 1 To 37
With UserForm5.Controls(“CommandButton” & i)
.Caption = “”
.ForeColor = RGB(0, 0, 0)
.Caption = Weekday(c + i – 1)
End With
Select Case UserForm5.Controls(“CommandButton” & i).Caption
Case Is = 1
UserForm5.Controls(“CommandButton” & i).ForeColor = RGB(255, 0, 0)
Case Is = 7
UserForm5.Controls(“CommandButton” & i).ForeColor = RGB(0, 0, 255)
End Select
With UserForm5.Controls(“CommandButton” & i)
.Caption = “”
.Caption = CDbl(c + i – 1)
End With
Dim syuku As Range
Set syuku = Sheets(“CSV”).Range(“A:A”).Find(what:=UserForm5.Controls(“CommandButton” & i).Caption)
If Not syuku Is Nothing Then
UserForm5.Controls(“CommandButton” & i).ForeColor = RGB(255, 0, 0)
End If
With UserForm5.Controls(“CommandButton” & i)
.Caption = “”
End With
Next i
For i = ds To ds + dc
With UserForm5.Controls(“CommandButton” & i)
.Caption = Day(c + i – 1)
End With
Next i
End Sub

ユーザーフォームを表示した時にカレンダーを表示するVBAコードで、長くて見るのもイヤになるかもしれませんが、ざっくりとした流れは以下の通りです。

  1. UserForm_Initializeで表示した時にVBAコードが働きます
  2. コンボボックスに年・月をリスト化
  3. これから使用する変数を準備
  4. 各コマンドボタンの文字を空欄➡黒色➡当月日付を曜日表示
  5. 日曜は赤文字、土曜は青文字
  6. 各コマンドボタンの文字を空欄➡シリアル値表示
  7. 各コマンドボタンの文字(シリアル値の日付)が祝日リストにあったら赤文字
  8. 再度各コマンドボタンの文字を空欄
  9. 今月だけ各コマンドボタンの文字を日で表示する

そしてこのVBAコードの1番の部分以外を【日付表示】ボタンにコピーして書いておくと、コンボボックスで別の年・月を選ぶと表示も変わります。

それでは、順に祝日対応カレンダーフォーム作成VBAコードの説明をします。

現在の日付から西暦と月をリスト化

ユーザーフォームが開いた瞬間にパソコンの時計機能を利用して、コンボボックスに西暦と月をリスト化して既定値にします。

コンボボックスに西暦と月をリスト化VBA

Private Sub UserForm_Initialize()
Dim i As Long, j As Long
For i = -1 To 121
UserForm5.ComboBox1.AddItem Year(Date) – i
Next i
ComboBox1.ListIndex = 1
For j = 1 To 12
UserForm5.ComboBox2.AddItem (j)
Next j
ComboBox2.ListIndex = Month(Date) – 1

詳しくは「コンボボックスに現在の日付から西暦だけを新しい順に表示する」ページに記載しているので、内容が重複するのでここでは省略します。

祝日判定付き自作カレンダーフォーム
祝日判定付き自作カレンダーフォーム(2021年2月4日作成)

画像のように2つのコンボボックスに、上記VBAコードでユーザーフォームが開いたら、西暦と月が表示されます。

通常はこのように西暦と月が表示されたら同時に画像のように各コマンドボタンに日付と色が表示されるように続けてVBAコードを書きたいものですが、そうすると祝日設定や不要な1月31日・3月1日~8日までも表示されてしまうので、次のブロックでは計算式を変数にして、繰り返し処理で使えるように準備しています。

必要項目を変数に置き換える

日付表示をさせるコマンドボタンは当初は42個用意しましたが、実際には最大37個で足りるので今回は37個に減らしています。

そしてこのコマンドボタンに最初から日だけを取り出して表示させてしまうと、ただの数字になってしまい、日付で曜日・祝日・先月・当月・翌月の判断をすることが難しくなります。

そこで、以下の7つの変数を用意してコマンドボタンのキャプションを利用して、曜日・祝日・先月・当月・翌月を判断できるようにします。

必要項目を変数に置き換える
  • y = ComboBox1.Value
  • m = ComboBox2.Value
  • w = DateSerial(y, m, 1)
  • c = w – Weekday(w) + 1
  • ds = Weekday(w)
  • de = DateSerial(y, m + 1, 1) – 1
  • dc = de – w

ちなみに変数のアルファベットは何でもいいので自分で分かるようにすればいいですよ。

変数「y」

コンボボックス1で選択された西暦(年)を「y」と指定する

変数「m」

コンボボックス2で選択された月を「m」と指定する

変数「w」

DateSerial関数を使用することにより、コンボボックスで選択された西暦(年)、月、1とすることにより、当月1日を取得できる

変数「c」

変数「w」から曜日を表す番号を引いて+1することで、先月末を取得します

変数「ds」

変数「w」の曜日番号を取得して、当月は何曜日が1日なのかを表します。

変数「de」

DateSerial関数を使用することにより、コンボボックスで選択された西暦(年)、月+1、1とすることにより、翌月1日を取得して-1をすることで当月末日を取得できます。

変数「dc」

変数「de」(当月末日)から変数「w」(当月1日)を引くことにより、今月の日数を表します。

曜日を取得する

最初のブロックは、日付表示する37個のコマンドボタンに日曜日は赤色文字、土曜日は青色文字で表示させてそれ以外は黒色文字にする為の準備です。

各ボタンの文字を空欄➡黒色➡当月日付を曜日表示するVBA

With UserForm5.Controls(“CommandButton” & i)
.Caption = “”
.ForeColor = RGB(0, 0, 0)
.Caption = Weekday(c + i – 1)
End With

解説
  1. ユーザーフォーム5のコマンドボタン「i」の
  2. 文字を消去する
  3. 文字色を黒色に指定する
  4. 文字を曜日番号で表す
  5. withステートメント終了

※For i = 1 To 37とNext iで上記コードを挟み込みますが、説明上省略して部分的に記載しています。

これで全てのコマンドボタンが下記の図のように、曜日番号で表示させることができます。

カレンダー曜日番号
カレンダー曜日番号表示

あと、次に日曜日を表す1番を赤色にして土曜日を表す7番を青色に変えれば祝日以外の色がカレンダーっぽくなりますね。

曜日番号というものがエクセルにはありますので詳細は下記をご覧くださいませ。

日曜は赤文字、土曜は青文字にする

色を変える方法は2つあり、Ifステートメントでもし~だったら、そうでなかったら・・とすることもできますが、今回はSelect Caseを使っています。

日曜は赤文字、土曜は青文字にするVBA

Select Case UserForm5.Controls(“CommandButton” & i).Caption
Case Is = 1
UserForm5.Controls(“CommandButton” & i).ForeColor = RGB(255, 0, 0)
Case Is = 7
UserForm5.Controls(“CommandButton” & i).ForeColor = RGB(0, 0, 255)
End Select

解説
  1. Select Caseステートメントを使い、ユーザーフォーム5のコマンドボタン「i」の文字
  2. 1の場合
  3. ユーザーフォーム5のコマンドボタン「i」の文字色を赤色にする
  4. 7の場合
  5. ユーザーフォーム5のコマンドボタン「i」の文字色を青色にする
  6. Selectステートメント終了
カレンダー曜日色

これで、日曜日と土曜日の文字色が変わりましたが、プロパティで設定すれば?と思ったかもしれません。

実は最初はそのようにしたのですが、祝日が土曜日になった時にプロパティが優先されて赤色にならな方ので、この方法に変更しました。

このようにラベルやコマンドボタンなど好みの色に変更することができ、基本となる56色の色見本を用意しました。

各コマンドボタンの文字を空欄にしてシリアル値表示切替

曜日番号で表示されている状態の各コマンドボタンの文字を一旦消去して、祝日を見つけられるように日付をシリアル値にしてボタンに表示させます。

日付をシリアル値で表示するVBA

With UserForm5.Controls(“CommandButton” & i)
.Caption = “”
.Caption = CDbl(c + i – 1)
End With

解説
  1. ユーザーフォーム5のコマンドボタン「i」の
  2. 文字を消去する
  3. 文字を先月末から順にシリアル値にして表示
  4. withステートメント終了
カレンダーシリアル値表示
カレンダーシリアル値表示

これで、コマンドボタン1には1月31日のシリアル値からスタートして、順に最後のコマンドボタン37には3月8日となっています。

これで、祝日リストと同じシリアル値があったら赤色文字に変更することで祝日対応ができるようになります。

各ボタンの文字(シリアル値の日付)が祝日リストにあったら赤文字

まず最初にワークシートに祝日のリストを作りますが、カレンダーで調べて祝日をリストアップするのは大変なので、内閣府のホームページにCSVファイルで祝日がリスト化されているので、ダウンロードしてワークシートに貼り付けます。

ダウンロードしたCSVファイルの祝日は1955年~2022年までがリスト化されていますので、ここではセルA列に張り付けて、シリアル値にしています。

カレンダーシリアル値CSV
約70年分976行あります

そして、貼り付けているシート名を「CSV」として、カレンダーフォームのコマンドボタンのシリアル値と一致したら祝日とします。

祝日を探すVBA

Dim syuku As Range
Set syuku = Sheets(“CSV”).Range(“A:A”).Find(what:=UserForm5.Controls(“CommandButton” & i).Caption)
If Not syuku Is Nothing Then
UserForm5.Controls(“CommandButton” & i).ForeColor = RGB(255, 0, 0)
End If

解説
  1. Range型の変数「syuku」を宣言する
  2. シート名「CSV」のセル「A列」からユーザーフォーム5のコマンドボタン「i」の文字と同じ値のセルを検索して、見つけたら変数「syuku」に格納する
  3. 変数「syuku」を見つけたら
  4. ユーザーフォーム5のコマンドボタン「i」の文字色を赤色にする
  5. IFステートメント終了
カレンダーシリアル値祝日色変更
カレンダーシリアル値祝日色変更

シリアル値のままですが、これで祝日の表示となるコマンドボタンの文字色が赤色に変更でき、祝日対応できるようになりました。

シリアル値を日に変えて再表示する

最後にシリアル値で表示されている各コマンドボタンの表示文字を消去して、当月1日~当月末日のみをコマンドボタンに表示させます。

今月1日や月末日を自動取得する方法は下記をご覧くださいませ。

今月だけの日付と表示させるVBA

With UserForm5.Controls(“CommandButton” & i)
.Caption = “”
End With
Next i
For i = ds To ds + dc
With UserForm5.Controls(“CommandButton” & i)
.Caption = Day(c + i – 1)
End With

解説
  1. ユーザーフォーム5のコマンドボタン「i」の
  2. 表示する文字を消去する
  3. withステートメント終了
  4. 繰り返し処理をする
  5. 変数「i」を宣言
  6. 変数は「ds」~「ds」+「dc」
  7. ユーザーフォーム5のコマンドボタン「i」の
  8. 表示文字を日で表す
  9. withステートメント終了

ここで当月のみ表示させるために、コマンドボタン1~37で変数を使ってしまうと1月と3月まで表示されるので、変数「ds」を1の代わりにして、当月最初の曜日番号から当月最初の曜日番号+月末までとします。

そしてDay(c + i – 1)で日付から日だけ取り出して表示させて完成です。

祝日判定付き自作カレンダーフォーム
祝日判定付き自作カレンダーフォーム

これで祝日対応のカレンダーフォームが出来上がりました。

あとは、各コマンドボタンをクリックしたら、指定したセルに記述するようにVBAコードを書き込めば完成です。

このような方法で自作カレンダーを作成する事ができるようになりますので、ぜひ挑戦してみてくださいね。

ちなみに日付を取り扱うことがエクセルを使っていれば多くなると思いますので、セルの値から取得する方法など下記にまとめていますので、参考にいかがですか?

また、今回は西暦表示でしたが、和暦表示もちょっと工夫をすれば表示リスト化できますよ。

目次