§4-2 祝 日
1.祝日の定義
Ver 5.40 では 2019年〜2021年 の 祝日改正(下記) に対応しています。
( a ) 2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
( b ) 2019年の徳仁親王の即位日(5/1) および
祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) & 5/2 の2休日
( c ) 2019年の「即位の礼 正殿の儀 (10/22) 」
( d ) 2020年施行の「体育の日の改名」⇒スポーツの日
( e ) 東京五輪特措法による2020年の「祝日移動(2020年)」
( 海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10 )
( f ) 東京五輪特措法による2020年の「祝日移動(2021年)」
( 海の日:7/19(3rd Mon)⇒7/22, スポーツの日:10/11(2nd Mon)⇒7/23, 山の日:8/11⇒8/8 )
kt関数では【祝日】を全てアドイン内部で算出しています。
分析ツールのWORKDAYの様にユーザー側で『祝日一覧表』を用意する必要はありません。
kt関数では、『 祝日について 』に載っている、現行の祝日法で定められた祝日を「施行日」を含めて
認識します。
ある年の『祝日一覧』は メニュー から簡単に求める事もできます。
2.祝日の算出アルゴリズム
「祝日の判定」というものは結構重い処理です。 『祝日ではない』という判断に辿り着くまでに非常に時間を要すると言った方が正確かも知れません。
--- ある1日だけならば微々たるものですが、日数計算などでは
連続して何百回/何千回と実行される為、微々たる時間も積
もり積もって結構大きな時間になります。
---
例えば、通常、祝日テーブルは「1月1日(正月)〜12月23日(天皇誕生日)」の順で作成します。ここで、1月1日と1月2日での流れを見ると、1月1日では、1つ目のデータとの比較で即『祝日である』と判断を完了できますが、1月2日を『祝日ではない』と判断する為には全てのデータ(15+α)との比較を終える必要があります。また、1年の「祝日を除いた日数」をカウントする等の場合、9割5分の日付が『祝日ではない』側になります。
つまり、祝日算出アルゴリズムの最重要ポイントは、「祝日データをどのように持たせて判断するか」ではなく、「いかにして『祝日ではない』という判断を速やかに下すか」ということになります。
kt関数では、日付を年・月・日に分解し【月→日→年】の順で判断します。何故かと言うと、12月の日付を判断するのに『1月〜』の祝日データと比較する必要は無いからです。また、現時点で祝日の無い6月/8月の日付に対しては、祝日データとの比較自体が全くの無駄な話です。
更に効率よく『祝日ではない』という判断を下す為に、kt関数では『祝日プリマップ期間』というものを設けています。これは、本日日付の前後5年間(計11年間)の祝日を予めマップデータとして展開しておくというものです。マップ展開自体は[kt関数Addin.xla]のオープン時に自動的に行なわれます。日付が上記の期間内である場合は、マップデータ上で「シリアル値」の位置にフラグが立っているかという、たったひとつの判断で決定を下す事が出来ます。日付がマップ期間から外れた場合は、自動的に通常の判定処理(個々の祝日との比較)に移行するようにしてあります。
土曜/日曜/祝日を休日とした場合の1年間の営業日数計算を行なって比較すると、この計算を1000回繰り返した(シート1000行の日数計算式の再計算に相当)場合、
『祝日プリマップ期間』内‥‥‥ 6秒474
〃
外‥‥‥13秒535 (PentiumV
450MHz)
という結果が得られています(200MHz位のマシンなら「20秒 対 40秒」程度になるでしょうか)。
「今年〜10年後」とか「10年前〜今年」といったデータを大量に処理したいという場合、『祝日プリマップ期間』から外れるデータが出てきて処理時間が多くなってしまいます。このような場合には、一時的に『祝日プリマップ期間』をリセットすることが出来ます。【kt祝日PreMap設定】を参照して下さい。
補)休日マップ(祝日を休日)を利用する場合は、既に祝日を含めた休業日の位置
(シリアル値)にフラグを立ててありますので、たった1回の判定処理で判断でき
ます。したがって、休日マップを利用する際には、祝日判定に要する処理時間を
気にする必要は全くありません。
角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved.