Excel VBA でシリアル値から休日かどうかを判定する

祝日に対応させる場合は 【Excel で祝日判定】 を参照。


以下、土日のみ対応した場合。


Excel で曜日を表示させたいときは、たいていの場合めんどくさがって表示形式を "aaa" とか設定してシリアル値のまま表示させてる。
曜日という"文字列"をチェックしないといけなくても、choose とか weekday とかいった関数を組み合わせて、曜日を表示することが多い。
でも、せっかくシリアル値で処理してるのに、VBA を扱う段になって文字列を返さないといけない場合とかがある。
今回は、Excel VBA でシリアル値を取得したあと、土日なら "休日" という文字列を返すだけのマクロを書いてみる。

Private Function 休日判定(SERIAL As Date)
    Dim 答え As String
    答え = ""     ' 先にデフォルトの応答内容を入れておく
    ' 休日判定
    ' Weekday にシリアル値を入れた場合の戻り値
    ' 1 = 日曜日, 2 = 月曜日, 〜 7 = 土曜日
    Select Case Weekday(SERIAL)
        Case Is = 1
            答え = "休日"
        Case Is = 7
            答え = "休日"
    End Select
    休日判定 = 答え
End Function

これ*1を、標準モジュールにそのまんま書き写して、適当なセルに
=休日判定(TODAY())
とか、入力する。

もしも、これを入力した日が土曜日か日曜日なら、休日と表示される。
平日なら?
なーんも表示されない。
表示させたかったら、答えの "" 内に 平日 とかデフォルトの応答内容を書き込んでおけばよい。


もし水曜日が休みだったら、こんな感じ。

Private Function 休日判定(SERIAL As Date)
    Dim 答え As String
    答え = ""
    ' 休日判定
    ' Weekday にシリアル値を入れた場合の戻り値
    ' 1 = 日曜日, 2 = 月曜日, 〜 7 = 土曜日
    Select Case Weekday(SERIAL)
        Case Is = 4
            答え = "休日"
    End Select
    休日判定 = 答え
End Function


簡単に説明すると、ブック内に 休日判定 という関数を定義したいので Private Function 休日判定() と書いている。
Private は、ブック内で有効だということの指定。
Function は、そのまま和訳すると関数を意味する。
カッコ内でシリアル値がほしいので、SERIAL という変数で Date 型 を指定している。これは、別途宣言する必要がないタイプなので、そのまま。
応答内容は一旦変数へ入れておきたかったので、文字列型で "答え" を宣言。
曜日は7つあるけど、応答内容は多くても2つ。デフォルト応答は、平日示す空白 "" で指定。
曜日判定では、標準で用意されている Weekday を利用してみた。
1〜7 が戻り値に入ってくるので、

*1:Private Function から End Function まで、すべて