いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)平日のみカウントする方法

 Excelで、期間(開始日~終了日)中の平日(土日祝日以外)の日付だけをカウントする方法と、日付のリストのうち平日だけをカウントする方法を紹介します。

期間(開始日~終了日)中の平日をカウントする方法

 カウントする内容の確認です。
 左側に記入されている開始日から終了日までの日付のうち、平日(土日と、祝日リスト内の日付を除いた日付)をカウントするものとします。
 Excelの機能のみで祝日を判定することはできないので、このように祝日のリストを用意しておくことが欠かせません。もちろん曜日だけで平日を判定するのであればこのようなリストは不要です。

 


 カウントそのものは簡潔にでき、NETWORKDAYS関数を使った計算式を入力すれば求められます。

 G3セル

=NETWORKDAYS(B3,C3,E3:E5)

 NETWORKDAYS関数は期間中の平日をカウントするという、まさにこのようなカウントのための関数です。
 第1引数として開始日を、第2引数として終了日を、そして第3引数として祝日リストを指定すればOKです。



 土・日曜日以外の曜日を平日とみなす場合はNETWORKDAYS.INTL関数を利用します。
 次の画像では月・火曜日以外の曜日を平日とみなした場合の平日をカウントしています。

 G3セル

=NETWORKDAYS.INTL(B3,C3,"1100000",E3:E5)

 機能はNETWORKDAYS関数とほぼ同じですが引数が1つ増えていて、第3引数をこのように指定することで月~日曜日をそれぞれ平日(0)とみなすか休日(1)とみなすかを設定することができます。
 また、祝日リストの指定は第4引数で行います。引数の順序を誤りやすいのが注意点です。

日付データ中の平日をカウントする方法

 ここでは、B列に並んでいる日付のうち平日(土日及び祝日リストの日付を除く日付)だけをカウントするものとします。
 表示形式の設定(ユーザー定義形式「yyyy/m/d(aaa)」を適用)により日付とともに曜日を表示していますが、結果が理解しやすいようにするためで、カウントの手順には関係ありません。

 


 まずはC列を作業列とし(1列挿入しているため、祝日リストがE列に移動しています)、C3セルに次の数式を入力してC12セルまでフィルコピーします。

 C3セル(下方にフィルコピー)

=NETWORKDAYS(B3,B3,E$3:E$5)

 NETWORKDAYS関数の第1引数(開始日)、第2引数(終了日)をともにB3セルの日付としています。
 一見奇妙ですが、これによりその日が平日ならば1が、平日でなければ0が返るので各日付について判定できるというわけです。
 第3引数の絶対参照「$」を忘れると式のコピーに伴い参照先がずれてしまい、祝日の判定を誤ります。



 あとはSUM関数でこの数値を合計すれば平日の日数が求められます。

 G3セル

=SUM(C3:C12)

 


 次の画像ではNETWORKDAYS.INTL関数を使い、月・火曜日以外の曜日を平日とみなしてカウントしています。
 G3セルの式は上記と同じ「=SUM(C3:C12)」です。

 C3セル(下方にフィルコピー)

=NETWORKDAYS.INTL(B3,B3,"1100000",E$3:E$5)

 引数では平日=0と指定しますが式の結果は平日=1となり混乱しやすいのがちょっとした注意点です。

1つの式だけでカウントする方法

 次の画像では上記の内容を踏まえて、作業列を使わず1つの数式で平日の日数を求めています。

 F3セル

=SUM(NETWORKDAYS(B3:B12*1,B3:B12*1,D3:D5))

 NETWORKDAYS関数の第1、第2引数を「B3:B12」に拡張することでB3:B12セルの各日付について判定した配列を取得し、それをSUM関数で囲んでいます。
 2か所の「*1」が気になりますが、これがないと配列が取得できずエラーになります。おまじないと思ってください。
 上記の例と同様にNETWORKDAYS.INTLを使えば曜日の設定もできますが、具体例は省略します。

旧バージョンの場合

 1つ上の例の式はスピルが効かないバージョンだと誤った結果になります(NETWORKDAYS関数の戻り値が配列にならないため結果が0か1にしかならない)。しかし実はSUM関数をSUMPRODUCT関数に代えると、つまり次のようにするとうまく求められます。これはもちろんMicrosoft 365でもうまくいきます。

=SUMPRODUCT(NETWORKDAYS(B3:B12*1,B3:B12*1,D3:D5))

 互換性を考えてSUMPRODUCTを統一すべき…とも言えませんが、この例に限らず、古いバージョンのExcelで条件付き集計の手間を省略できることがあるので、覚えておいて損はないと思います。