復帰

きょうから仕事に復帰。 休み前に作り掛けだったVBAを完成させた。 ここでまた不可解な現象が起きて、色々調べたら例の修飾の問題で解決することが出来た。 下のコードを参照。
それから書いているコードは、過去の直近の営業日を求めるコードなんだけど、これも例によってネットを見ると、ワークシート関数の"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: