【マクロ】フォームからシンプルなカレンダーを作成する【ダウンロード可】

Uncategorized

ユーザーフォームにより、サクッとカレンダーを作成できるマクロを作りました。
カレンダーはシンプルな書式設定になっているので、このまま利用していただいても、VBAを魔改造して素敵なカレンダーになるようにしていただいても結構です。
どうぞご自由にご利用ください。

ダウンロードはここから

使用方法

  1. ボタンをクリックしてフォームを表示
  2. 年(西暦)、月、週の始まりを選択して、決定ボタンをクリック

これだけでシンプルなカレンダーが作成できます。

マクロについて

この記事ではステートメントやメソッドごとの細かい解説はしていません。ただ、記述しているVBAはごく一般的なものなので、簡単に調べることができると思います。
直接質問したい方は「問い合わせフォーム」からお気軽にお問い合わせください。

全体の流れ

マクロ全体の流れとしては、

  1. フォームを開く
  2. (各項目の選択)
  3. 新しいシートを挿入
  4. 挿入したシートへ年、月、日付を入力
  5. 週の始まりを変更
  6. 書式設定の変更

という手順でカレンダーを作成します。

2.(各項目の選択)はマクロによる自動操作ではなく、ユーザー自身がフォームへ入力・操作する部分のために、カッコでかこみました。

モジュールの概要

このエクセルではフォームと標準モジュールを1つずつ、さらにその中にいくつかのSubプロシージャを記述しています。

内容はいたってスタンダードで、フォームへ入力したデータをもとに標準モジュールで処理を実行する、といったマクロとなっています。

変数名、オブジェクト名について

このサイトで紹介するVBAは、変数やオブジェクト名を日本語でコーディングするようにしています。そのほうがコードに目を通したときに、視覚的にでわかりやすいと思うからです。
主に変数、シートやコントロールのオブジェクト名、モジュール名を日本語もしくは日本語を含めて命名しています。VBAコードを見る際に、ご参考にしてください。

フォーム

フォームのVBAは、前半部分で各コントロールのプロパティの設定を、後半ではユーザーの操作に対するコントロールのイベントを記述しています。

プロパティの設定をマクロで行っているのは、どのコントロールのどのプロパティを設定したかをエディターから一覧でわかるようにするためです。またプロパティウインドウから変更したものの、どこを変更したか忘れてしまう、といったことも予防しています。

後半の24行目以降では、おもにテキストボックス(年の入力)に関するイベントを記述しています。具体的には、まず入力を数値のみに制限し、さらにスピンボタンで数値の増減ができるようにしています。
そして最後にはコマンドボタンによるマクロの実行を記述しています。

レイアウト

カレンダーを作成するうえで必要な「年」や「月」を入力するためのコントロールが3つ、マクロ実行のためのコマンドボタンが1つ、そのほかには見出し用のラベルと「年」を増減させるスピンボタンを配置しています。

見出しラベルコントロールの種類入力方式
年(西暦)テキストボックス
スピンボタン
直接入力もしくは
スピンボタンで増減
リストボックスリストから選択
週の始まりの曜日リストボックスリストから選択
コマンドボタン- (マクロの実行)
フォームのコントロールのプロパティについて

コントロールのプロパティはCaption以外はマクロで設定するようにしています。そうすればエディターから何を設定している確認できるためです。反対にプロパティウインドウからの変更は、変更点がわからなくなる恐れがあるために、できるだけやらないようにしています。
どのプロパティが設定してあるかは、エディターからご確認ください。

VBAコード
Private Sub UserForm_Initialize() '各コントロールのプロパティ設定
    
    '年(テキストボックス)のプロパティ
    テキストボックス年.Value = Year(Date) '初期値を現在の西暦に
    スピンボタン年.TabStop = False 'Tabキーによるフォーカスを禁止
    
    '月(コンボボックス)のプロパティ
    With コンボボックス月
        For i = 1 To 12 '1から12を追加
            .AddItem i
        Next
        .ListIndex = Month(Date) - 1 '初期選択を現在の月に
        .Style = fmStyleDropDownList 'リスト(1~12)以外の入力を禁止
    End With

    '週の始まりの曜日(コンボボックス)のプロパティ
    With コンボボックス週の始まり
        .AddItem "日" '日を追加
        .AddItem "月" '月を追加
        .ListIndex = 0 '初期選択を日にする
        .Style = fmStyleDropDownList 'リスト(日、月)以外の入力を禁止
    End With
End Sub
Private Sub テキストボックス年_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) '年(テキストボックス)に数字しか入力できないようにする
    If Not Chr(KeyAscii) Like "[0-9]" Then
        KeyAscii = 0
    End If
End Sub
Private Sub スピンボタン年_SpinUp() 'スピンボタンで年(テキストボックス)の値を増減させる
    If Not IsNumeric(テキストボックス年) Then Exit Sub
    テキストボックス年 = テキストボックス年 + 1
End Sub
Private Sub スピンボタン年_SpinDown() 'スピンボタンで年(テキストボックス)の値を増減させる
    If Not IsNumeric(テキストボックス年) Then Exit Sub
    テキストボックス年 = テキストボックス年 - 1
End Sub
Private Sub コマンドボタン決定_Click() '決定ボタンで実行

    If IsNumeric(テキストボックス年) Then '年(テキストボックス)が数字の場合
        Call 作成モジュール.カレンダーの作成(Val(テキストボックス年), Val(コンボボックス月))
        Call 作成モジュール.月曜スタートに変更(コンボボックス週の始まり)
        Call 作成モジュール.書式変更
        Unload Me
    Else '年(テキストボックス)が数字じゃない場合
        MsgBox "数値を入力してください"
        テキストボックス年.SetFocus
    End If
End Sub

標準モジュール

標準モジュールは1つだけで、その中に4つのSubプロシージャを作成しています。上から順に、

  • フォームを開く
  • カレンダーの作成
  • 月曜スタートに変更
  • 書式変更

と続き、このとおりにマクロが実行されることとなります。

今回のメインでもある「カレンダーの作成」では、フォームで入力した年月をForステートメントで月初から月末まで繰り返し処理しています。
具体的にはWeekday(DateSerial(年, 月, 1))でついたちの曜日を取得して、それをもとにRange(“A3:G8”)の範囲で1から順番に日付を入力していく、といった内容となっています。

ほか「月曜スタートに変更」は、単に日曜のセルのカットアンドペーストによる移動。
「書式変更」はその名のとおりで、これを書き換えてお好みのデザインにすることができます。

VBAコード
Sub フォームを開く()
    入力フォーム.Show
End Sub
Sub カレンダーの作成(年, 月)
    Sheets.Add(After:=ActiveSheet).Select 'シートを追加
    
    '年月の入力
    Range("A1").Value = 年 & "年"
    Range("D1").Value = 月 & "月"
    
    '曜日の入力
    For i = 1 To 7
        Cells(2, i) = WeekdayName(i, True)
    Next

    '日付の入力
    For i = 1 To Day(DateSerial(年, 月 + 1, 0)) '1日から月末まで繰り返し処理
        Range("A3:G8").Cells(Weekday(DateSerial(年, 月, 1)) + i - 1) = i
    Next
End Sub
Sub 月曜スタートに変更(曜日の始まり) 'カットアンドペーストで表を変更
    If 曜日の始まり = "月" Then
        Range("A2:A9").Cut
        Range("H2:H9").Insert
        Range("G3").Cut
        Cells(Range("A1").CurrentRegion.Rows.Count + 1, Range("A1").CurrentRegion.Columns.Count).Insert
    End If
End Sub
Sub 書式変更()
    Range("A1:G1").BorderAround LineStyle:=xlContinuous '表題を罫線で囲む

    '月部分
    With Range("D1")
        .Font.Size = 28 'フォントサイズ
        .Font.Bold = True '太字
    End With
    
    '曜日部分
    For Each i In Range("A2:G2")
        Select Case i '背景色の変更
            Case "日"
                i.Interior.ColorIndex = 22 '日曜は赤
            Case "土"
                i.Interior.ColorIndex = 37 '土曜は青
            Case Else
                i.Interior.ColorIndex = 15 'それ以外は灰色
        End Select
        
        i.Font.ColorIndex = 2 '文字色
        i.Font.Bold = True '太字
    Next
    
    '日付部分
    With Range("A2", Cells(Range("A1").CurrentRegion.Rows.Count, 7))
        .Borders.LineStyle = xlContinuous '罫線を引く
        .VerticalAlignment = xlTop '文字の縦位置を上詰めに
    End With
    
    '高さの調整
    Range("1:1,3:" & Range("A1").CurrentRegion.Rows.Count).RowHeight = 54 '曜日以外の高さ調整
    Range("A1:G8").HorizontalAlignment = xlCenter '文字の横位置を水平揃えに
End Sub

まとめ

以上、シンプルなカレンダーを作成するマクロの紹介でした。とても簡単なVBAで作成してあるので改造することも簡単だと思います。

不具合、要望、改善点などありましたら、コメントもしくは問い合わせフォームからご指摘いただければ幸いです。
またリクエストも随時受け付けています。お気軽にご連絡ください。

コメント

タイトルとURLをコピーしました