転用、商業利用等フリーです。ダウンロードしてご自由にお使いください。
ユーザーフォームから、サクッとカレンダーを作成できるマクロを作りました。一応西暦で9999年まで作れます。これさえあればあと7000年弱は使えるので安心ですね(?)。
デフォルトではシンプルなデザインになっています。そのまま利用してもVBAを魔改造して素敵なカレンダーにしていただいても結構です。それでは紹介いたします。
ダウンロードはこちら
使用方法
- ボタンをクリックしてフォームを表示する
- 年、月、週の始まりを設定して、決定ボタンをクリックする
これだけで新しいシートにカレンダーが作成されます。とても簡単です。
マクロについて
全体の流れ
マクロ全体の流れとしては、
- フォームを開く
- (各項目の選択)
- 新しいシートを追加
- フォームへの入力をもとに年月日を入力
- 書式設定の変更
という手順でカレンダーを作成しています。2.(各項目の選択)はマクロによる自動操作ではなく、ユーザー自身がフォームへ入力・操作する部分なのでカッコでかこみました。
いたってスタンダードなマクロで、フォームへの入力をもとに標準モジュールで処理を実行する、といった流れとなっています。
フォーム
レイアウト

フォームのレイアウトは画像のとおりで、上から下に直感的に操作できるようなインターフェースとなっています。とりわけ「年(西暦)」の入力欄は、テキストボックスとスピンボタンの組み合わせになっていて、キーボードとマウスどちらでも操作しやすいようにしています。
各コントロールの詳細は下の表のとおりです。
ラベル | 種類 | 入力方式 |
---|---|---|
年(西暦) | テキストボックス スピンボタン | キー入力もしくは スピンボタンで増減 |
月 | コンボボックス | リストから選択 |
週の始まりの曜日 | コンボボックス | リストから選択 |
– | コマンドボタン | - (マクロの実行) |
イベント
イベントプロシージャは全部で5つあります。
最初にフォーム表示時のイベントで、コンボボックスのリストの作成と各コントロールの初期値を設定しています。
2つ目はテキストボックスのキー入力時、3つ目と4つ目はスピンボタンのクリック時のイベントで、どちらも年の入力に関する設定を記述しています。
最後にコマンドボタンのクリック時のイベントです。エラー回避のためにIfステートメントで分岐させています。問題がなければカレンダー作成マクロを実行します。
VBAコード
Private Sub UserForm_Initialize() 'フォームが表示された時に実行
'コンボボックスのリスト項目を追加
For i = 1 To 12
cbo月.AddItem i
Next
cbo週の始まり.AddItem "日"
cbo週の始まり.AddItem "月"
'リスト以外は入力禁止
For Each i In Me.Controls
If TypeName(i) = "ComboBox" Then i.Style = fmStyleDropDownList
Next
'初期値を選択
txt年.Value = Year(Now)
cbo月.Value = Month(Now)
cbo週の始まり.Value = "日"
End Sub
Private Sub txt年_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) '年(テキストボックス)のキー操作で実行
'数字だけが入力できるように、数字以外のアスキーを0にして操作を無効化
If Not Chr(KeyAscii) Like "[0-9]" Then
KeyAscii = 0
End If
End Sub
Private Sub spn年_SpinUp() 'スピンボタンのクリック時に実行(上)
If Not IsNumeric(txt年) Then Exit Sub
txt年 = txt年 + 1
End Sub
Private Sub spn年_SpinDown() 'スピンボタンのクリック時に実行(下)
If Not IsNumeric(txt年) Then Exit Sub
txt年 = txt年 - 1
End Sub
Private Sub cmd決定_Click() '決定ボタンで実行
'年への文字列貼付とDate型エラー対策
If IsNumeric(txt年) And txt年 > 99 And txt年 < 10000 Then
Call modカレンダー作成.新しいシートへ作成
Call modカレンダー作成.デザイン変更
Unload Me
Else '正しい値でない場合はメッセージ表示
MsgBox "年は100以上9999以下の数字にしてください"
txt年.SetFocus
End If
End Sub
標準モジュール
モジュールは標準モジュールが1つだけで、その中に3つのSubプロシージャを記述してあります。
始めに入力フォームを開くプロシージャ。
次にカレンダーを作成するプロシージャ。新しいシートを追加してフォームの入力値をもとに年月日を入力していきます。
最後にデザイン変更のプロシージャ。書式やセルの高さを変更してシンプルで見やすいカレンダーに仕上げます。見た目を変えたいときはここを魔改造します。
VBAコード
全体的に簡単なVBAで記述していますが、難所は23行目の日付入力かなと思います。単にフォームで入力した年月をもとに、月初から月末までForステートメントで繰り返し処理しているだけなのですが、~Cells(Weekday(DateSerial~とネストしているので少々ややこしくなっています。
Weekday(DateSerial(.txt年, .cbo月, 1), 週の始まり)
この部分は月初(ついたち)の曜日を数字で返す記述です。この値からカレンダー内のついたちの位置を特定できるので、あとは順番にRange(“A3:G8”)の範囲内で日付を入力していく、といった内容となっています。
Sub フォームを開く()
frm年月入力.Show
End Sub
Sub 新しいシートへ作成()
Sheets.Add(After:=ActiveSheet).Select '新シート追加
'フォームのコントロールの値を参照してカレンダーを作成
With frm年月入力
'表題を入力
Range("A1").Value = .txt年 & "年"
Range("D1").Value = .cbo月 & "月"
'週の始まりで入力位置をずらすための変数を記述
Dim 週の始まり
If frm年月入力.cbo週の始まり = "日" Then 週の始まり = vbSunday
If frm年月入力.cbo週の始まり = "月" Then 週の始まり = vbMonday
'曜日欄と日付を入力
For i = 1 To 7 '曜日欄
Cells(2, i) = WeekdayName(i, True, 週の始まり)
Next
For i = 1 To Day(DateSerial(.txt年, .cbo月 + 1, 0)) '日付
Range("A3:G8").Cells(Weekday(DateSerial(.txt年, .cbo月, 1), 週の始まり) + i - 1) = i
Next
End With
End Sub
Sub デザイン変更()
'月が一番目立つように
With Range("D1")
.Font.Size = 28 'フォントサイズ
.Font.Bold = True '太字
End With
'曜日がわかりやすいように、曜日欄の色を変更
For Each i In Range("A2:G2")
Select Case i
Case "日"
i.Interior.Color = rgbCoral '赤
Case "土"
i.Interior.Color = rgbSkyBlue '青
Case Else
i.Interior.Color = rgbSilver '灰色
End Select
i.Font.Color = vbWhite '文字色を白に
i.Font.Bold = True '太字
Next
'日付欄を罫線で区切り、文字を寄せて余白を作成
With Range("A2", Cells(Range("A1").CurrentRegion.Rows.Count, 7)) 'A2から最終セル
.Borders.LineStyle = xlContinuous '罫線を引く
.RowHeight = 54 'セルの高さ
.VerticalAlignment = xlTop '文字の縦位置を上詰めに
End With
'ほかの調整
Range("A1:G1").BorderAround LineStyle:=xlContinuous '表題を罫線で囲む
Range("A1").CurrentRegion.HorizontalAlignment = xlCenter '全体の文字の横位置を水平揃えに
End Sub
まとめ
以上シンプルなカレンダーを作成するマクロの紹介でした。簡単なVBAで作成してあるので改造することも簡単だと思います。転載等も自由なので、個人商用問わず好き勝手に使ってやって下さい。
ご拝読ありがとうございました。
配布しているエクセルの不具合、要望、改善点などありましたら、コメントもしくは問い合わせフォームからご指摘いただければ幸いです。
またこのサイトではリクエストも受け付けています。「あんなエクセルが欲しい」「こんな風に魔改造して」といったご要望があれば、リクエストフォームからお気軽にご連絡ください。
コメント