Sub MakeCal()
Range("4:100").Clear
Range("A4") = "日付"
Range("B4") = "曜日"
Range("C4") = "登録データ"
Dim A, B, C
A = DateSerial(Range("A2"), Range("A3"), 1) '指定月の1日
B = DateSerial(Range("A2"), Range("A3") + 1, 0) '指定月の月末
ReDim C(1 To 31, 1 To 2)
k = 0
For i = A To B
k = k + 1
C(k, 1) = i '日付を入力
C(k, 2) = i '日付を入力
Next
Range("A5").Resize(31, 2) = C 'セルに入力
End Sub
最初に、年と月は、入力しておきます。
年と月は入力
では、VBAコードを実行してみます。
実行するとまず、見出しが入力されます。
見出しを入力
次に、1か月分の日付が入力されます。
1か月分の日付を入力
日付と曜日で使う日付を、1か月分入力します。
列幅を大きくして確認してみます。
こんな感じで、1か月分のデータが入力されています。
書式を設定
次は、縦型の月間カレンダーの書式を設定していきます。
表示形式と、罫線、そして土日の塗りつぶしをするVBAコードです。
Sub SetFormat()
Range("A5").Resize(31).NumberFormatLocal = "d" '「日」を表示
Range("B5").Resize(31).NumberFormatLocal = "aaa" '「曜日」を表示
Range("A4").Resize(32, 3).Borders.LineStyle = xlContinuous '罫線
Dim A
For Each A In Range("A5").Resize(31)
If Format(A, "aaa") = "日" Then
'日曜日を塗りつぶし
A.Resize(, 3).Interior.Color = RGB(252, 228, 214)
ElseIf Format(A, "aaa") = "土" Then
'土曜日を塗りつぶし
A.Resize(, 3).Interior.Color = RGB(221, 235, 247)
End If
Next
End Sub
では、VBAコードを実行してみます。
表示形式を設定
日付のところを、日にちの表示形式に変更します。
そして、曜日の表示形式を設定します。
表示形式の設定ができました。
次は、罫線を引きます。
罫線を設定
次は、土日を塗りつぶししていきます。
土日を塗りつぶし
日曜日を塗りつぶしします。
土曜日を塗りつぶしします。
日曜日を塗りつぶしします。
土曜日を塗りつぶしします。
日曜日を塗りつぶしします。
土曜日を塗りつぶしします。
日曜日を塗りつぶしします。
土曜日を塗りつぶしします。
日曜日を塗りつぶしします。
これで、縦型の月間カレンダーを作成できます。
縦型の月間カレンダーを作成できた
縦型の月間カレンダーを作成できました。
祝日の反映
次は、作成した縦型の月間カレンダーに、祝日を反映していきます。
祝日のデータを入力
祝日のデータは、シートに入力しておきます。
祝日のデータを入力
こちらの祝日のデータを、カレンダーに反映させていきます。
祝日をカレンダーに反映
では、祝日のデータをカレンダーに反映させていきます。
祝日を反映させたい
祝日のデータをカレンダーに反映させる手順は、次のようになります。
指定した年月で祝日のデータを抽出
抽出した祝日をループしてカレンダーに反映
抽出データをクリア
という感じです。
祝日のデータをカレンダーに反映させるVBAコードです。
Sub GetHoliday()
Dim A, B
With Sheets("月")
A = DateSerial(.Range("A2"), .Range("A3"), 1) '指定月の1日
B = DateSerial(.Range("A2"), .Range("A3") + 1, 0) '指定月の月末
End With
With Sheets("祝日")
'指定月でフィルタ
.Range("A1").AutoFilter 3, ">=" & A, xlAnd, "<=" & B
.Range("A1").CurrentRegion.Copy .Range("E1") 'フィルタ結果をコピー
.Range("A1").AutoFilter 'フィルタを解除
End With
For i = 2 To Sheets("祝日").Cells(Rows.Count, "G").End(xlUp).Row
With Sheets("月").Range("A4").Offset(Day(Sheets("祝日").Cells(i, "G")), 0)
'祝日を塗りつぶし
.Resize(, 3).Interior.Color = RGB(252, 228, 214)
End With
Next
'コピーした値をクリア
Sheets("祝日").Range("E1").CurrentRegion.ClearContents
End Sub
まずは、指定した年月で祝日のデータを抽出します。
2022年5月の祝日を抽出
祝日のデータを、2022年5月でフィルタします。
フィルタ結果を別セルにコピーします。
フィルタを解除します。
抽出した祝日をループして、カレンダーを塗りつぶししていきます。
抽出した祝日をループしてカレンダーを塗りつぶし
抽出した値をループしていきます。
1つ目の日付に対応するセル範囲を、塗りつぶしします。
2つ目の日付に対応するセル範囲を、塗りつぶしします。
3つ目の日付に対応するセル範囲を、塗りつぶしします。
という感じで祝日をカレンダーに反映させます。
抽出した値は不要なので、クリアします。
抽出したデータのクリア
これで、縦型の月間カレンダーに、祝日を反映できます。
縦型の月間カレンダーに祝日を反映できた
縦型の月間カレンダーに、祝日を反映できました。
年と月の変更で実行するイベントを作成
カレンダーを簡単に更新できるように、年と月の更新で実行するイベントを作成します。
年と月を変更でカレンダーを更新
年と月を変更でカレンダーを更新できるように、「Change」イベントを作成します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Range("A2:A3"), Target) Is Nothing Then Exit Sub
Call MakeCal 'カレンダーを作成
Call SetFormat '書式を設定
Call GetHoliday '祝日を反映
End Sub
では、年や月を変更してみます。
年を変更すると、カレンダーを更新できます。
年を変更で、カレンダーを更新
月を変更すると、カレンダーを更新できます。
月を変更で、カレンダーを更新
というような感じで、年や月を変更したタイミングで、カレンダーを更新することができます。
「翌月」「先月」「今月」のボタンで更新
次に、「翌月」「先月」「今月」のボタンで、カレンダーを更新できるようにしてみます。
ボタンでカレンダーを更新できるようになると、かなり便利です。
「翌月」「先月」「今月」のボタンを作成
「翌月」「先月」「今月」のボタンを作成します。
翌月、先月、今月のボタンを作成
翌月、先月、今月のボタンに、登録するVBAコードは次のようになります。
登録するVBAコード
↓翌月に更新するVBAコード
Sub NextMonth()
Dim A
'1か月進める
A = DateSerial(Range("A2"), Range("A3") + 1, 1)
Range("A2") = Year(A) '年を取得
Range("A3") = Month(A) '月を取得
End Sub
↓先月に更新するVBAコード
Sub PreMonth()
Dim A
'1か月戻す
A = DateSerial(Range("A2"), Range("A3") - 1, 1)
Range("A2") = Year(A) '年を取得
Range("A3") = Month(A) '月を取得
End Sub
↓今月に更新するVBAコード
Sub ThisMonth()
Range("A2") = Year(Now()) '今年を取得
Range("A3") = Month(Now()) '今月を取得
End Sub
という感じで登録します。
ボタンでカレンダーを更新
では、ボタンでカレンダーを更新してみます。
ボタンをクリックで、翌月に更新できます。
翌月に更新
ボタンをクリックで、先月に更新できます。
先月に更新
ボタンをクリックで、今月に更新できます。
今月に更新
という感じで、ボタンでカレンダーを更新できました。
データを取得する機能を追加
次は、データベースからカレンダーに、データを取得する機能を追加してみます。
データベースと連携することで、作成したカレンダーで予定表の管理ができるようになります。
データを取得する機能
こんな感じで、データベースから、値を取得できる機能を追加してみます。
データベースから値を取得する機能を追加したい
では、作成する方法について、解説していきます。
データを取得する
まず、適当にデータベースを作成しておきます。
データベースを作成する
データベースのシートを追加します。
データベースに値を入力しておきます。
データベースからカレンダーに値を取得する手順は、次のようになります。
指定した年月でデータを抽出
抽出したデータをループしてカレンダーに転記
抽出した値をクリア
という感じです。
データベースからカレンダーに値を取得するVBAコードは、次のようになります。
Sub GetData()
Dim A, B
With Sheets("月")
A = DateSerial(.Range("A2"), .Range("A3"), 1) '指定月の1日
B = DateSerial(.Range("A2"), .Range("A3") + 1, 0) '指定月の月末
End With
With Sheets("DB")
'指定月をフィルタ
.Range("A1").AutoFilter 1, ">=" & A, xlAnd, "<=" & B
.Range("A1").CurrentRegion.Copy .Range("D1") 'フィルタ結果をコピー
.Range("A1").AutoFilter 'フィルタ解除
End With
For i = 2 To Sheets("DB").Cells(Rows.Count, "D").End(xlUp).Row
With Sheets("月").Range("A4")
'データを取得
.Offset(Day(Sheets("DB").Cells(i, "D")), 2) = Sheets("DB").Cells(i, "E")
End With
Next
'コピー結果をクリア
Sheets("DB").Range("E1").CurrentRegion.ClearContents
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Range("A2:A3"), Target) Is Nothing Then Exit Sub
Call MakeCal 'カレンダーを作成
Call SetFormat '書式を設定
Call GetHoliday '祝日を反映
Call GetData 'データを取得
End Sub
では、カレンダーを更新して、自動で値を取得してみます。
カレンダーを更新すると、自動で値を取得できる
今月をクリックで、データベースの値を自動で取得できます。
先月をクリックで、データベースの値を自動で取得できます。
翌月をクリックで、データベースの値を自動で取得できます。
こんな感じで、カレンダー更新のタイミングで、自動で値を取得することができます。
データを書き込みする機能を追加
さらに、カレンダーからデータベースに、データを書き込みする機能を追加してみます。
これで、カレンダーとデータベースを連携することができます。
追加する書き込み機能
先に、追加する書き込み機能をみてみます。
データベースに書き込みする機能を追加したい
カレンダーに値を入力します。
ボタンをクリックします。
データベースに値を書き込みできます。
こんな感じで、カレンダーからデータベースに書き込みすることができます。
書き込みする手順
書き込みする手順は、次のようになります。
カレンダーの日付をループ
データベースに登録済みの場合は、データを上書き
データベースに未登録で、入力がある場合は、新規で書き込み
という感じです。
この流れを、カレンダーのすべての日付でループします。
VBAコードは、次のようになります。
Sub WriteData()
Dim Flag, A
'カレンダーをループ
For Each A In Sheets("月").Range("A5").Resize(31)
Flag = 0
'既存のデータを変更
For i = 2 To Sheets("DB").Cells(Rows.Count, "A").End(xlUp).Row
If A = Sheets("DB").Cells(i, "A") Then
Sheets("DB").Cells(i, "B") = A.Offset(0, 2) '登録データ
Flag = 1
Exit For
End If
Next
'新規に登録
If Flag = 0 And A.Offset(0, 2) <> "" Then
With Sheets("DB").Cells(Rows.Count, "A").End(xlUp) '最終行を取得
.Offset(1, 0) = A '日付
.Offset(1, 1) = A.Offset(0, 2) '登録データ
End With
End If
Next
End Sub
データベースに値を入力しておきます。
データベースに値を登録しておく
カレンダーの値を変更してみます。
カレンダーの値を変更
では、VBAコードを実行してみます。
カレンダーの日付と、データベースをループして登録していきます。
カレンダーの日付と、データベースをループして登録していく
カレンダーの日付をループしていって、データベースに登録していきます。
まずはカレンダーの1つ目の日付で、データベースをループしていきます。
日付が登録されている場合は、登録データを上書きします。
日付が登録されている場合は、上書き
カレンダーからデータベースに書き込みできました。
データベースに登録されていない場合は、新規で書き込みします。
登録されていない場合は、新規で書き込み
新しくデータを入力してみます。
では、再度VBAコードを実行してみます。
カレンダーに入力があって、データベースに日付が登録されていない場合は、新規で書き込みをします。
カレンダーの日付を、新規で書き込みをします。
カレンダーのデータを、新規で書き込みをします。
これで、カレンダーの値を、データベースに新規で書き込みできます。
データベースに書き込みできた
カレンダーの値を、データベースに新規で書き込みできました。
書き込みのボタンを追加
最後に、書き込みのボタンを追加して、VBAコードを登録します。
書き込みボタンを追加します。
書き込みボタンを追加
登録するVBAコードは、先ほどのVBAコードになります。
Sub WriteData()
Dim Flag, A
'カレンダーをループ
For Each A In Sheets("月").Range("A5").Resize(31)
Flag = 0
'既存のデータを変更
For i = 2 To Sheets("DB").Cells(Rows.Count, "A").End(xlUp).Row
If A = Sheets("DB").Cells(i, "A") Then
Sheets("DB").Cells(i, "B") = A.Offset(0, 2) '登録データ
Flag = 1
Exit For
End If
Next
'新規に登録
If Flag = 0 And A.Offset(0, 2) <> "" Then
With Sheets("DB").Cells(Rows.Count, "A").End(xlUp) '最終行を取得
.Offset(1, 0) = A '日付
.Offset(1, 1) = A.Offset(0, 2) '登録データ
End With
End If
Next
End Sub