きっかけ
もう何年も前の話です。
毎月末に提出する書類(エクセルファイル)の作成日記入欄に、下記の数式が書かれていました。
EOMONTH(B3,0)-MAX(WEEKDAY(EOMONTH(B3,0),2)-5,0)
当時の自分はExcelの関数についてほとんど知らなかったので、この数式が何を計算しているのか全く分かりませんでした。
そのとき、自分なりに調べて理解したことをまとめて記事にします。
3つの関数の意味
ひとまず、この数式に登場する3つの関数について調べました。
EOMONTH(開始日,月数)
開始日から数えて、月数分だけ前または後の月の最終日を求める関数です。
素直に日付を答えてくれるわけではなく、シリアル値という数値で返答してきます(Windows版Excelの場合は、1900年1月1日を1とし、そこに経過日数を足して、その日付のシリアル値としているそうです)。
上記の数式の場合、EOMONTH(B3,0)
とのことなので、B3セルに記入された日付から0ヶ月後(つまりB3セルの日付と同じ月)の月末の日付が算出されます。
ちなみに、この書類ではB3セルにその月の月初日が記入されていました。
WEEKDAY(日付,週の基準)
指定した日付の曜日を求める関数です。
これも素直に月火水木金土日で答えてくれるわけではなく、「週の基準」で指定した数値によって答え方が変わります。
上記の数式の場合、WEEKDAY(EOMONTH(B3,0),2)
とのことなので、「その月の最終日が何曜日なのかを、週の基準2に従って算出する」という内容になっています。
「週の基準2」は、「月曜日を1、火曜日を2、…、日曜日を7」と置き換える法則です。
MAX(数値1,数値2,…)
括弧の中で指定した数値のうち、最も大きい数値を求める関数です。
上記の数式の場合、MAX(WEEKDAY(EOMONTH(B3,0),2)-5,0)
とのことなので、「WEEKDAY(EOMONTH(B3,0),2)-5
と0を比較して、大きい方の数値を算出する」という内容になっています。
WEEKDAY(EOMONTH(B3,0),2)-5
は、週の基準2に従って求めた曜日の数値から5を引いていますので、「月曜日が-4、火曜日が-3、…、日曜日が2」となります。
それらと0を比べて大きい方の数値を答えるのがMAX(WEEKDAY(EOMONTH(B3,0),2)-5,0)
ですので、「月曜日から金曜日は0、土曜日は1、日曜日は2」と置き換えられています。
数式全体の意味
上記を踏まえて、最初の数式の全体を見てみます。
EOMONTH(B3,0)-MAX(WEEKDAY(EOMONTH(B3,0),2)-5,0)
数式の前半(EOMONTH(B3,0)
)は、単純にその月の最終日を求めています。
後半(MAX(WEEKDAY(EOMONTH(B3,0),2)-5,0)
)は、その月の最終日が平日なら0を、土曜日なら1を、日曜日なら2を算出します。
数式全体としては、その月の最終日から0(平日の場合)または1(土曜日の場合)または2(日曜日の場合)を引いているので、その月の最後の平日を求めていることになります。
こうして、この数式がその月の最後の平日を算出する関数であることを、当時の自分はやっとのことで突き止めたのでした。
ただし、この数式は祝日等を考慮していませんので、そこは注意が必要です。
最後に
最初に書いた通り、この数式は月末提出書類の作成日記入欄に書かれていました。
であれば、「これはその月の最終出勤日が出てくる数式なのかな?」などと想像できていれば、もっと早く疑問を解決できていたかもしれません。
その点も含めて、当時は知識や経験が足りませんでした。
反省し、精進します。
以上、ご覧いただきありがとうございました。