■
それから書いているコードは、過去の直近の営業日を求めるコードなんだけど、これも例によってネットを見ると、ワークシート関数の"WorkDay"関数を使えば良いと出ていた。
この関数、基準日と、求めたい日との差(過去はマイナス)、祝祭日のテーブル(必要であれば自社の休みも含めたり)の3つの引き数を与えると土日、祝祭日を勘案して求めたい営業日を返してくれる。
確かに、その通りの結果を返してくれた。
■
普通のときはそれでいいのだけど、年を跨いだときに上手く行かない。
ネットに出ている例は、年ごとの祝祭日テーブルを指定するようになっている。
年が変われば、その年用の祝祭日テーブルを指定し直す。
至極真っ当な処理だと思うので、同様の実装をしたのだけど、例えば1月2日を基準日として指定すると前営業日は去年の12月31日と返してくれる。
それはそうだ。そういう指定をしているのだから。
でも、返してほしいのは年末の休みになる前の12月27日(今年の年初を指定した場合)を返してほしいのよ。
■
ちょっと考えて、求める日が去年になるような場合は、テーブルを去年用に挿げ替えるとか。
でも、去年まで行かないかもしれないし、どうもそれは複雑になりすぎて違う気がしてきた。
困ったときのネット頼み、探してみたけど、そんな例はで出て来ない。
困ったなあと思いながら、あれこれ考えてみると、今年のテーブルに去年の年末の休みを追加すればどうだろうとひらめいた。
やってみるとバッチリ。
想定してた日付が返ってきた。
やれば出来るじゃん!
' 例によって変数宣言は割愛
' 今年のデータ数を得る
MaxRow = ThisWorkbook.Worksheets("Holiday").Range("B1"). _
Offset(0, iColumn).End(xlDown).Row
' ダメなコード(Cells()の修飾がない)
' Set rngHoliday = ThisWorkbook.Worksheets("Holiday"). _
Range(Cells(2, 2 + iColumn), Cells(MaxRow, 2 + iColumn))
' おっけーなコード(Cells()も修飾している)
Set rngHoliday = ThisWorkbook.Worksheets("Holiday"). _
Range(ThisWorkbook.Worksheets("Holiday").Cells(2, 2 + iColumn), _
ThisWorkbook.Worksheets("Holiday").Cells(MaxRow, 2 + iColumn))
' 前営業日を求める
valDay = Application.WorksheetFunction.WorkDay(dDate, -1, rngHoliday)
dDate = valDay ’ Variant型からDate型に変換
’ テーブル例(Excelのシートのどこぞのセル)
休日名称 2020年
-----------------------------------
自社休日 2019-12-28
自社休日 2019-12-29
自社休日 2019-12-30
自社休日 2019-12-31
元日 2020-01-01
自社休日 2020-01-02
自社休日 2020-01-03
成人の日 2020-01-13
建国記念の日 2020-02-11
天皇誕生日 2020-02-23
休日 2020-02-24
春分の日 2020-03-20
昭和の日 2020-04-29
憲法記念日 2020-05-03
みどりの日 2020-05-04
こどもの日 2020-05-05
休日 2020-05-06
海の日 2020-07-23
スポーツの日 2020-07-24
山の日 2020-08-10
敬老の日 2020-09-21
秋分の日 2020-09-22
文化の日 2020-11-03
勤労感謝の日 2020-11-23
自社休日 2020-12-29
自社休日 2020-12-30
自社休日 2020-12-31
--
No comments:
Post a Comment