【Excelマクロ】シンプルなカレンダーを作成【ユーザーフォーム】

Uncategorized

転用、商業利用等フリーです。ダウンロードしてご自由にお使いください。

ユーザーフォームから、サクッとカレンダーを作成できるマクロを作りました。一応西暦で9999年まで作れます。これさえあればあと7000年弱は使えるので安心ですね(?)。
デフォルトではシンプルなデザインになっています。そのまま利用してもVBAを魔改造して素敵なカレンダーにしていただいても結構です。それでは紹介いたします。

ダウンロードはこちら

使用方法

  1. ボタンをクリックしてフォームを表示する
  2. 年、月、週の始まりを設定して、決定ボタンをクリックする

これだけで新しいシートにカレンダーが作成されます。とても簡単です。

マクロについて

全体の流れ

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

  1. フォームを開く
  2. (各項目の選択)
  3. 新しいシートを追加
  4. フォームへの入力をもとに年月日を入力
  5. 書式設定の変更

という手順でカレンダーを作成しています。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で作成してあるので改造することも簡単だと思います。転載等も自由なので、個人商用問わず好き勝手に使ってやって下さい。
ご拝読ありがとうございました。

配布しているエクセルの不具合、要望、改善点などありましたら、コメントもしくは問い合わせフォームからご指摘いただければ幸いです。
またこのサイトではリクエストも受け付けています。「あんなエクセルが欲しい」「こんな風に魔改造して」といったご要望があれば、リクエストフォームからお気軽にご連絡ください。

コメント

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