特定の日付が休日、祝日なら平日に移動する処理をしたいです。

いつも大変お世話になっております。

■実現したいこと2つ
・データ①のDeliveryDateがデータ②の祝日と同じ値がないか条件分岐をしたいです。同じだった場合+1dayをして値が平日(月~金)になるまで繰り返す
例 データ①のBB-101のDeliveryDateがデータ②のF4になるので+1dayをする

・土曜日か日曜日の場合は+2dayもしくは+1dayをして平日に移動したい。
例 データ①のAA-101の曜日が日曜日になるので+1dayをしたい。

■背景
もともとエクセルのWorkday関数でしていた処理を実現したいです。

■途中までできたこと
1.データ②をデータテーブルにdtHolidayList作成
2.代入
左辺 dict
右辺 dtHolidayList.AsEnumerable.ToDictionary(Function(r) r(“日付”).ToString,Function(r) r(“曜日”).ToString)
3.繰り返し(各行) dtデータ①
4.代入
左辺 row(“DeliveryDate”) =
右辺 DateTime.Parse(row(“DeliveryDate”).ToString).CompareTo(Int32.Parse(dict(row(“日付”).ToString))).ToString(“yyyy/MM/dd”)

★下記エラーが出てつんでいます。。。
4. エラー 代入: 列 ‘日付’ はテーブル DataTable に属していません。

こちらでご相談させていただき、解決したのですが
同じようにやってみたら
同じようにできない状況です。。。
今回は加算ではなく比較なのでCompareToを使っています。
===
できそうでできなくて、、、
アドバイスいただけますでしょうか。
もっと簡単な方法もあれば、ぜひ教えていただきたく。。。m(_ _)m

こんにちは

対象となるDataTableに“日付”という名前の列がないからです。”祝日”ではないでしょうか?

1 Like

Yoichiさん

おはようございます!昨日から続きありがとうございます。

こちらサンプルが祝日と記載していますが、
本番では日付としていて、項目名も間違っていないです。

記載したエラーがここでは下記のように書くべきでした。
「エラー 代入: 列 ‘祝日’ はテーブル DataTable に属していません。」
失礼しました。

こんにちは

上記勘案しますと、エラーの直接の原因は、データ1の方に祝日という名前の列がないからかと思います。

今回実装したい内容ですが、ループと何らかの条件分岐が必要になるかと思います。
データ2の方ですが、土日もリストされる形になりますでしょうか?あるいはそれ以外の祝日等
だけになりますでしょうか?

いずれにしても、仮に評価する日が祝日に該当した場合、翌日が候補になりますが、
その日も祝日や土日の可能性もありますので、平日にたどり着くまで1日加算する
繰り返しが必要になります。

1 Like

Yoichiさん

ご返信ありがとうございます。

確認してみました。
データ②をデータテーブルでdtHolidayListを作成しているのでExcelに書き出してみました。写真の通りで、取得はできているのかなと思いますが、ほかに考えられる原因はありますでしょうか。

データ②は土日のリストは作成しないです。
それ以外の祝日だけで構成を考えています。

そこに関してはデータ②で振り替え日として登録していますので、対応可能かなと思います。上記写真のC6のように登録しています。

こんにちは

基本的に曜日は日付で一意に決定されるので、日付だけのハンドリングにして、
必要時に曜日を算定する方がシンプルかと思います。

そのためデータ2に関してはDictionaryにするのではなく、対象日付を
リストあるいは配列すれば十分かと思います。

データ1の各行の日付を評価して、「土曜日」または「日曜日」または「上記リスト中に日付がある」の
いずれかに該当すれば、1日加算して、再度評価します。

上記に該当しない日が平日ですので、それを書き戻します。

これらをまとめると、例えば以下の様に実装できると思います。

2 Likes

Yoichiさん

ご返信ありがとうございます。

うん、確かに!お話している中で私もそう感じました。

deliveryDate.DayOfWeek = DayOfWeek.Saturday OrElse deliveryDate.DayOfWeek = DayOfWeek.Sunday OrElse listHolidays.Contains(deliveryDate)
ここのDayOfWeekが曜日ということですね。なるほどこういう書き方するんですね、勉強になります。
やってみて一発で理想の形になりました。本当に助かりました。
ありがとうございます!

あと、もし可能であれば教えていただきたいのですが、今回のような書き方.NETの書き方をどこで調べたらわかるのでしょうか。MSのドキュメントは見てるのですが、素人にはよくわからなくて。
Yoichiさんのように書けるようになりたいのですが、経験も浅いので参考にされてるサイト、書籍などあれば教えていただきたいです。

よろしくお願いいたします。

こんにちは

個々のクラスやメソッド(関数)の使い方はMicrosoftのサイト、あるいは
検索エンジンで言語名+クラスまたはメソッド名あるいはキーワードで検索すると、
たくさん出てくると思うので、そちらを参照すれば良いかと思います。
例えば「vb.net 曜日」で検索すると DayOfWeek に容易にたどり着けると思います。

ただアルゴリズムの組み方となると、インターネット上にピンポイントで同様の
実装がある場合は少ないので、「場数を踏む」「他の方の実装を見る」「書いた
コードをレビューしてもらう」等で経験値を上げながら、検索のキーワードの質や
応用できる力を上げていく必要があるかと思います。

あまり回答になっていませんが、一個人の意見として上記になります。

1 Like

Yoichiさん

ありがとうございます!

少し苦手意識がありましたが、今回のような実装がすごく容易にできることを体感したので、次回から積極的に調べてみます。

なるほど、そういった意味ではこのUiPathのフォーラムはありがたい場ですね。
私もほかの方の実装や質問を積極的に見ていこうと思います。(回答はできないですが)

本当何から何までご相談いただき、ありがとうございました!
またよろしくお願いしますm(_ _)m

さすがYoichiさんですね。

ある意味「翌営業日の計算」の話だと思うのですが(今回のケースは「昨日から見た翌営業日の算出」)、過去にこんなのを作成していました。

⇒ 「他の方の実装を見る」の一例になれば幸いです。

1 Like

みやぎさん

ありがとうございます!
マーケットプレイスで作成されていたんですね。
サンプルがあると自分で試せるのでとてもありがたいです。

ダウンロードしてみましたので、触ってみます!

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.