みなさん、こんにちはケンケンです。
VBAを使ってカレンダーアプリを作っています。
前回は曜日を抜き出し土日だけ色を変えることに挑戦しました。
今回は、前回まで作った仕掛けを合体させてカレンダーを完成させるところまでご紹介します。
カレンダーの完成形を確認しよう
前回まで作ってきた部品をつなぎ合わせてカレンダーを完成させます。
まずは下図で完成したカレンダーを確認しましょう。
所定のセルに作りたいカレンダーの「年」と「月」を入力し、ボタンをクリックするとカレンダーが自動で作成されます。
前回まで紹介した、曜日の書き出しや土日のみ色を変えるなどの仕掛けを組み合わせて完成させます。
ちなみに完成形のカレンダーを作るシートは「カレンダー」という名前にして新規作成しておいてください。
部品をつなぎ合わせる
前回までは、曜日を書き出したり土日だけセルの色を変えたりと、ひとつひとつ部品を作ってきましたが、今回はこの部品をつなぎ合わせて一気にカレンダーを完成させます。
まずは、完成形のコードをお見せしてから解説します。
Sub calendar_day() Dim sday '最初の日という意味 Dim ntuki '次の月を格納 Dim stuki '翌月の最初の日を格納 Dim lday '最後の日という意味 ntuki = Range("H3").Value + 1 If ntuki = 13 Then ntuki = 1 sday = CDate(Range("G3") & "/" & Range("H3") & "/" & "1") stuki = CDate(Range("G3") + 1 & "/" & ntuki & "/" & "1") lday = stuki - 1 Else sday = CDate(Range("G3") & "/" & Range("H3") & "/" & "1") stuki = CDate(Range("G3") & "/" & ntuki & "/" & "1") lday = stuki - 1 End If Range("C1").Value = Range("G3").Value & "年" & Range("H3").Value & "月" '① Dim Lrow Lrow = Range("A" & Rows.Count).End(xlUp).Row '② If Lrow = 2 Then '③ Else Range("A3" & ":D" & Lrow).ClearContents '④ Range("A3" & ":D" & Lrow).Interior.ColorIndex = 0 '⑤ End If Dim cnt '書き出し先のカウント変数 cnt = 3 Do While sday <= lday Range("A" & cnt).Value = sday Range("B" & cnt).Value = WeekdayName(Weekday(sday)) '⑥ If Weekday(sday) = 7 Then'⑥ Range("A" & cnt & ":" & "D" & cnt).Interior.ColorIndex = 5'⑥ ElseIf Weekday(sday) = 1 Then'⑥ Range("A" & cnt & ":" & "D" & cnt).Interior.ColorIndex = 3'⑥ End If sday = DateAdd("d", 1, sday) cnt = cnt + 1 Loop End Sub
Sub kensaku_event() Dim cnt Dim kensakucnt Dim eSheet As Worksheet '検索元イベント一覧シート Dim cSheet As Worksheet '転記先カレンダーシート Dim motoLrow Dim sakiLrow Set eSheet = Sheets("イベント一覧") Set cSheet = Sheets("カレンダー")'⑦「カレンダー練習」から「カレンダー」へ変更 motoLrow = eSheet.Range("A" & Rows.Count).End(xlUp).Row 'イベント一覧シートの最終行 sakiLrow = cSheet.Range("A" & Rows.Count).End(xlUp).Row 'カレンダーシートの最終行 For kensakucnt = 2 To sakiLrow For cnt = 2 To motoLrow If eSheet.Range("A" & cnt).Value = cSheet.Range("A" & kensakucnt).Value Then cSheet.Range("C" & kensakucnt).Value = eSheet.Range("A" & cnt).Offset(0, 1).Value End If Next Next cSheet.Range("C:C").ShrinkToFit = True '⑧ End Sub
Sub calendar_kansei()'⑨ Call calendar_day Call kensaku_event End Sub
長い道のりでしたが、もう少しでゴールにたどり着けます。
がんばっていきましょう。
プロシージャは全部で3つ作ります。
- calendar_day
- kensaku_event
- calendar_kansei
上記のとおりです。
以前作成したプロシージャと同じ箇所も多いので、前回までのプロシージャを修正していただいても良いですが、めんどうでしたらコピペしてください。
修正追加した箇所を中心にコードの解説をします。
①Range(“C1”).Value = Range(“G3”).Value & “年” & Range(“H3”).Value & “月”
作成したい年と月をC1セルに転記します。
細かいことですが、こういうところも自動化しておきましょう。
②~⑤で初期化します。
具体的には、②でA列の最終行を取得して、最終行が2行目だった場合は初期化しません(③)
初期化したいのは3行目以降ですからIF文で条件分岐させておきます。
④Range(“A3” & “:D” & Lrow).ClearContents
ClearContentsメソッドを使ってA3セルから先ほど取得したA列の最終行をD列まで伸ばして削除します。
イメージは以下の通りです。
これで文字は削除できるのですが、土日の色が残ってしまいます。
⑤そこで、先ほどと同じ範囲に対し、InteriorのColorIndexプロパティを0(白)に設定します。
すると、文字列と色をクリアにすることができます。
⑥曜日を表示し、土日に色を付けるコードです。これは、以前にひとつの部品として作成したもので、それを、DoLoop内にあてこめました。
内容は以前とほとんど変わりないので問題ないかと思います。不安な方は復習しておきましょう。
⑦OFFSETを使った検索用のプロシージャをほぼそのまま使っています。
以前は「カレンダー練習」というシートに書き出していましたが、新しく「カレンダー」というシートを作成し、そこに転記するよう変更するためにコードも変更しています。
⑧cSheet.Range(“C:C”).ShrinkToFit = True
ShrinkToFitプロパティを使って文字列を縮小することができます。セルの列幅に合わせて文字列を縮小する場合はTrueを設定します。
イベントの文字数は一定ではないので、こういった措置をとっておくことは重要です。
⑨新しく作ったプロシージャ「calendar_kansei」に2つのプロシージャ「calendar_day」と「kensaku_event」を組み込みます。
これで完成です。
カレンダー作成用のボタンを作っておきましょう。
ボタンはカレンダーシート上に作ります。
作成したい年と月をシートに入力して、ボタンをクリックするとカレンダーが出来上がります。
まとめ
いかがでしたか。
ボタンひとつでカレンダーを作るところまでできました。
今まで盛りだくさんの内容だったと思います。
カレンダー作りでご紹介した内容は、他のシーンでも当然使えるので何度も復習して自分のものにしてください。
それでは、またお会いしましょう。
カレンダーアプリ作成記事一覧
【エクセルでカレンダー作成】シリアル値の概念を知り日付関数の基礎をマスター
【エクセルでカレンダー作成】日付と曜日を表現する関数をマスターしよう
【エクセルでカレンダー作成】作業列を設けてカレンダー作りにとりかかる
【エクセルでカレンダー作成】VLOOKUP関数と条件付き書式でカレンダーを作りこむ
【エクセルVBA】VBAでカレンダーを作るときに最も重要な関数
【エクセルVBAでカレンダー作り】DoLoopとDateAdd関数を使って日付を書き出す方法
【エクセルVBAでカレンダー作り】OFFSETとVLOOKUPを使って検索抽出する方法
【エクセルVBA】別シートからカレンダーに行事を転記する方法
【エクセルVBA】カレンダーの土日だけ色を変える方法とRangeオブジェクトの応用的な使い方
【エクセルVBA】プロシージャをまとめてカレンダーを完成させよう