【エクセルVBA】VBAでカレンダーを作るときに最も重要な関数【CDate関数】

みなさん、こんにちはケンケンです。

 

今回からVBAを使ってカレンダーを作成していきます。

前回までは、主に関数を使ってきましたが、VBAを使うことによってより高度で使いやすいカレンダーを作れればと思っています。

 

数回に渡ってご紹介していきますので、お付き合い下さい。

 

VBAを基礎から学びたい方は以下の記事を参考にしてください。

【エクセルVBA入門編①】VBAで何ができるのだろうか?

【エクセルVBA入門編②】めんどうな仕事はForNext構文で解決

【エクセルVBA入門編③】繰り返し作業はFor Next構文で完全自動化!

【エクセルVBA入門編④】自動記録を使ってみよう

【エクセルVBA入門編⑤】If Then構文で条件分岐をマスター

【エクセルVBA入門編⑥】手順に沿って請求書を作成してみよう【請求書作成自動化】

【エクセルVBA番外編】実務で使えるテクニック紹介します

 

 

 

VBAでカレンダーを作る基礎

前回までは主に関数を使ってカレンダーを作りました。

結果的に下図のようなものが完成しました。

カレンダー上部の年と月を入力すると

  1. 該当月の日付と曜日が表示される
  2. 主な行事をあらかじめ作成済みのリストから転記される
  3. 土日は色分けされる

というものでした。

 

CDate関数を使ってみる

今回から、上記のようなカレンダーをVBAで作って行きます。

そのための一歩として、CDate関数から紹介します。

 

最もシンプルな方法

CDate(date)

引数に入力した数値や文字列を日付型(date)に変換してくれます。

Sub hiduke_rensyu0()
    Range("A1").Value = CDate("2020/7/1")
    Range("B1").Value = CDate("2020/7/31")
End Sub

試しに上記のようなコードを標準モジュールに書いて実行してみましょう。

日付が表示されましたね。もちろん表示形式を標準に変更すれば、シリアル値が表示されます。

 

 

セルの値を代入する方法

今度は引数にセルの値を代入してみます。

下図のようにC2セルに年をD2セルに月を入力した状態で、その情報をCDate関数に代入し日付情報を書き出します。

Sub hiduke_rensyu0()
    Range("A1").Value = CDate(Range("C2") & "/" & Range("D2") & "/" & "1")
    Range("B1").Value = CDate(Range("C2") & "/" & Range("D2") & "/" & "31")
End Sub

上記のようにコードを修正して実行すると、先ほどと同じように表示できます。

年と月を指定するだけで月末日を算出する方法

先ほどまでの方法だと年月日のうち「月末日」は直接指定してましたね。

当然このままではカレンダーを作るのに問題がでてきちゃいます。

 

そこで、何月でも月末日がすぐ算出できるように工夫します。

手順は

  1. 指定された月の翌月の1日を算出する
  2. 1で算出された結果からマイナス1する

とすることで結果的に指定された月の月末日を算出することが出来ます。

 

これを具体的にコードにしたのが以下です。

Sub hiduke_rensyu0()
    Dim sday '最初の日という意味
    Dim ntuki '次の月を格納
    Dim stuki '翌月の最初の日を格納
    Dim lday '最後の日という意味
    
    ntuki = Range("D2").Value + 1'①
    If ntuki = 13 Then'②
        ntuki = 1'③
        sday = CDate(Range("C2") & "/" & Range("D2") & "/" & "1")
        stuki = CDate(Range("C2") + 1 & "/" & ntuki & "/" & "1")'④
        lday = stuki - 1'⑤

    Else
        sday = CDate(Range("C2") & "/" & Range("D2") & "/" & "1")
        stuki = CDate(Range("C2") & "/" & ntuki & "/" & "1")
        lday = stuki - 1
        
    End If
    
    Range("A1").Value = sday
    Range("B1").Value = lday
End Sub

 

ちょっと難しくなったように見えますが、中身は単純です。

 

①Range(“D2”).value +1とすることで翌月の値を変数ntukiに格納しています。

2月だったらntukiには3が代入されます。

 

②大半の月は問題ないのですが、12月だけは特殊です。①で変数ntukiに+1月分の値を格納していますが、12に+1したら13になってしまいます。

13ではなく12月の次は1月なので条件分岐を使います

ntukiが13の時、つまり指定月が12月の時はntukiを1に修正します(③)

 

④12月が指定されたときの翌月1月は翌年でもありますね。

そこで、Range(“C2”) + 1として翌年を表現しています。

また、CDate関数内の引数にntukiを使います。12月が指定されたときは「1」が入りますね。そして、一度変数stukiに代入します。

 

⑤欲しい情報は指定月の月末日です。④で計算したのは翌月1日なので、この値からマイナス1して前月末を算出します。

そのデータを月末日を表現するために用意した変数ldayに格納します。

 

Else以下は12月以外の月の挙動なので説明を省きます。

 

最後に指定月の最初の日を格納したsdayと、最後の日を格納したldayをセルに書き出す処理をして終了です。

実行して以下のように書き出せれば成功です。

まとめ

いかがでしたか。

今回は、主にCDate関数を使って日付を書き出す方法をいくつかご紹介しました。

次回は、他の関数と組み合わせて一か月分の日付や曜日を書き出す方法をご紹介します。

是非お楽しみに。

それでは、また次回お会いしましょう。

 

カレンダーアプリ作成関連記事一覧

【エクセルでカレンダー作成】シリアル値の概念を知り日付関数の基礎をマスター

【エクセルでカレンダー作成】日付と曜日を表現する関数をマスターしよう

【エクセルでカレンダー作成】作業列を設けてカレンダー作りにとりかかる

【エクセルでカレンダー作成】VLOOKUP関数と条件付き書式でカレンダーを作りこむ

【エクセルVBA】VBAでカレンダーを作るときに最も重要な関数

【エクセルVBAでカレンダー作り】DoLoopとDateAdd関数を使って日付を書き出す方法

【エクセルVBAでカレンダー作り】OFFSETとVLOOKUPを使って検索抽出する方法

【エクセルVBA】別シートからカレンダーに行事を転記する方法

【エクセルVBA】カレンダーの土日だけ色を変える方法とRangeオブジェクトの応用的な使い方

【エクセルVBA】プロシージャをまとめてカレンダーを完成させよう