土日祝日or平日の判定だけでなく、土日or祝日or平日の判定などのパターンに分けて紹介します。
判定の内容
まずはデータと判定(表示)しようとする内容についてです。
B列には対象となる日付を入力しています。結果を理解しやすいように曜日を含めて表示していますが形式は文字列ではなく日付(シリアル値)です。
E列には祝日のリスト(抄)を置いています。これはもちろん祝日の判定に必要なものです。
これらのデータに基づき、D列に関数を入力して各日付が土日祝日に該当するか判定・表示します。
ところで祝日を直接的に判定してくれる関数がないのでこのように祝日リストが必要になるわけですが、その取得方法が問題になります。
有力なものとしては下記リンク先(内閣府のページ)の中段に置いてあるcsvファイルがあり、これが1955年以降の祝日をカバーしており便利です。
参考リンク:
国民の祝日について - 内閣府
土日祝日or平日の判定
土日祝日とそれ以外(平日)の2択で判定する例です。
まずはC3セルに「=NETWORKDAYS(B3,B3,E3:E5)」と入力すると「0」と表示されます。
この式の意味ですが「B3セルの日付からB3セルの日付までの期間(1日間)に、土・日曜でなく祝日リストにも含まれない日(平日)が何日かあるか」というものです。
結果は1か0にしかなりませんが、これが1なら平日、0なら土日祝日であるというわけです。WORKDAY関数を使う式も考えられます(下記備考参照)が、こちらの方がわかりやすいのがメリットです。
ただし「=NETWORKDAYS(B3:B12,B3:B12,E3:E5)」としても一括判定(スピル)してくれず、なぜかエラーになります。
そこで祝日リストへの参照がズレないよう絶対参照を用いた「=NETWORKDAYS(B3,B3,E$3:E$5)」という式にして、下方にフィルコピーするとすべての日付を判定できます。
さらにIF関数を使って判定結果を文字列にして表示させる例です。
次の式をC3セルに入力しC12セルまでコピーしています。
C3セル(下方にコピー)
=IF(NETWORKDAYS(B3,B3,E$3:E$5),"平日","土日祝日")
土日or祝日or平日の判定
土日、祝日、それ以外(平日)の3択で判定する例です。
C3セル(下方にコピー)
=IFS(COUNTIF(E$3:E$5,B3),"祝日",NETWORKDAYS(B3,B3),"平日",TRUE,"土日")
NETWORKDAYS関数では土日と祝日の区別がつけられないのでCOUNTIF関数で祝日リストを参照して日付が存在すれば「祝日」、ない場合はNETWORKDAYS関数で土日かどうかを判定し「平日」「土日」のいずれかを表示させています。
祝日かつ土日曜である場合は「祝日」となります。
祝日名を表示する
祝日において個々の祝日名を表示させる例です。
祝日リストに祝日名の列(F列)を追加したうえで、次のような式を入力します。
C3セル(下方にコピー)
=IFS(COUNTIF(E$3:E$5,B3),XLOOKUP(B3,E$3:E$5,F$3:F$5),NETWORKDAYS(B3,B3),"平日",TRUE,"土日")
基本的には1つ上の例と同様で、祝日である場合にXLOOKUP関数で祝日名を表引きしています。
曜日または祝日を示す場合
祝日以外は曜日を表示させる例です。
C3セル(下方にコピー)
=IF(COUNTIF(E$3:E$5,B3),"祝日",TEXT(B3,"aaa"))
土日かどうかの判定は不要なので、単純に祝日リストに日付があれば「祝日」を、なければ日付を曜日に変換した文字列を表示させています。
祝日名を表示する
祝日の場合は祝日名を、祝日以外は曜日を表示させる例です。
祝日リストに祝日名の列(F列)を追加したうえで、次のような式を入力します。
C3セル(下方にコピー)
=IF(COUNTIF(E$3:E$5,B3),XLOOKUP(B3,E$3:E$5,F$3:F$5),TEXT(B3,"aaa"))
祝日である場合にXLOOKUP関数で祝日名を表引きしています。
備考
上記の例では土日祝日の判定にNETWORKDAYS関数を使っていますが、WORKDAY関数を使う方法もあります。
上記のデータに基づけば「=WORKDAY(B3-1,1,E3:E5)=B3」とすることでTRUEならB3セルの日付が平日、FALSEなら土日祝日と判定できます。
「『B3セルの日付』の前日からみた次の平日が『B3セルの日付』かどうか」というわかりにくいロジックになっているのが難点ですが、スピルが利くので一括判定が可能というメリットがあります(画像参照)。