RTS日付から「18営業日前」を自動で出したい、でもSharePointの計算列でどう書けばいいか分からない――そんな場面は、製造・開発・リリース管理の現場でよくあります。本記事では、土日を除外した18営業日前を正確に求める計算式と、その仕組み・検算方法・祝日対応まで、実務目線で丁寧に解説します。
SharePointで「RTS日付 − 18営業日」を自動計算したいシナリオ
RTS(Ready To Ship / Ready To Start など)日付を軸に、
- リードタイムの管理
- 発注・生産・テスト開始日の逆算
- 社内レビューや承認期限の自動算出
といった運用をしているケースは多いと思います。
しかし、単純に「18日前」とすると、
- 土日に着地してしまう
- 週の位置によってズレる(例:18日前≠18営業日前)
- 担当者が毎回カレンダーを見て手計算している
などの問題が起こりがちです。SharePointの計算列をうまく使えば、この「RTS日付 − 18営業日」を自動計算し、リストのどこからでも一貫した値を参照できるようになります。
前提:SharePointリストの列構成
RTS日付列(入力用)
まずは、ユーザーが入力するRTS日付の列を用意します。
| 項目 | 設定例 |
|---|---|
| 列名(表示名) | RTS date |
| 種類 | 日付と時刻 |
| 表示形式 | 日付のみ(時刻は不要) |
この記事では、計算式の中でこの列を [RTS date] という名前で参照する前提で解説します。実際の環境で内部名が異なる場合は、計算式中の [RTS date] を実際の列名に置き換えてください。
18営業日前列(計算列)
| 項目 | 設定例 |
|---|---|
| 列名(表示名) | RTS−18営業日前 |
| 種類 | 計算(他の列に基づく) |
| この数式から返されるデータの種類 | 日付 |
ここに、次で紹介する「完成版の式」をそのまま貼り付けます。
完成版:RTS日付から「18営業日前」を計算する式
土日を除いた「18営業日前」を計算するための、完成済みの計算式がこちらです。
=[RTS date]
-(
IF(WEEKDAY([RTS date],2)=6,1,IF(WEEKDAY([RTS date],2)=7,2,0))
+ INT((18 - IF(WEEKDAY([RTS date],2)>=6,1,0))/5)*7
+ MOD(18 - IF(WEEKDAY([RTS date],2)>=6,1,0),5)
+ IF(
MOD(18 - IF(WEEKDAY([RTS date],2)>=6,1,0),5)
> WEEKDAY([RTS date] - IF(WEEKDAY([RTS date],2)=6,1,IF(WEEKDAY([RTS date],2)=7,2,0)),2) - 1,
2,
0
)
)
ポイントを整理すると以下の通りです。
WEEKDAY([RTS date],2)は 月曜=1 〜 日曜=7 のモードで曜日を取得します。- 入力が土日でも、内部で自動的に直前の金曜を起点にして、18営業日前を求めます。
- 計算結果は必ず平日になり、土日に着地することはありません。
- この式では祝日・会社休日は除外していません(後半でPower Automateによる拡張方法を解説します)。
まずはこの式をそのまま計算列に設定し、意図した結果が返るかを確認してみてください。
式の仕組みをパーツごとに分解して理解する
長い式に見えますが、実は以下のような4つの処理を順番に足し合わせているだけです。
- もしRTS日付が土日なら、直前の金曜まで戻す(起点補正)
- 18営業日を「5営業日=1週」で割って、週単位+端数の平日 に分解
- 週単位の部分は
週数 × 7日戻す - 端数の平日を戻すときに、週をまたぐなら土日2日分を余分に引く
1. RT S日付が土日なら直前の金曜に寄せる
最初のこの部分です。
IF(WEEKDAY([RTS date],2)=6,1,IF(WEEKDAY([RTS date],2)=7,2,0))
これは「RTS日付が土曜なら1日、日曜なら2日、それ以外(平日)なら0日を戻す」という値を返しています。
| RTS日付の曜日 | WEEKDAY([RTS date],2) | 戻す日数 | 補正後の起点日 |
|---|---|---|---|
| 月〜金 | 1〜5 | 0 | そのまま |
| 土 | 6 | 1 | 前日の金曜日 |
| 日 | 7 | 2 | 前々日の金曜日 |
この値を全体の括弧の中で最初に足しているため、RTS日付が土日であっても、あたかもRTS日付が直前の金曜だったかのように営業日計算を続けることができます。
2. 18営業日を「週」と「端数」に分解する
次に出てくるのが、週単位と端数の平日に分解する部分です。
INT((18 - IF(WEEKDAY([RTS date],2)>=6,1,0))/5)*7
MOD(18 - IF(WEEKDAY([RTS date],2)>=6,1,0),5)
ここでは、
- RTS日付が土日の場合は、起点補正分として1営業日をあらかじめ引いておく
- 18営業日を 5 で割って 週数(INT) と 端数の平日数(MOD) を求める
ということをしています。
| 式 | 意味 |
|---|---|
INT((18 - 週末補正)/5) | 5営業日=1週 として何週分あるか(整数) |
MOD(18 - 週末補正, 5) | 上の週数で割り切れずに余った平日数 |
INT(...)*7 | 週数 × 7日 = 土日を含めた「カレンダー上の戻す日数」 |
たとえば、月曜日を起点に「18営業日前」を考えると、
- 18 ÷ 5 = 3 余り 3
- つまり「3週間」+「3営業日」戻る必要がある
ということになります。式の中では、この計算を汎用的に行っています。
3. 端数の平日が週をまたぐかどうかを判定する
最後の少し複雑に見えるのがここです。
IF(
MOD(18 - IF(WEEKDAY([RTS date],2)>=6,1,0),5)
> WEEKDAY([RTS date] - IF(WEEKDAY([RTS date],2)=6,1,IF(WEEKDAY([RTS date],2)=7,2,0)),2) - 1,
2,
0
)
やっていることはシンプルで、
- 「端数の平日数」を戻したときに、その週の月〜金をオーバーしてしまうか?
- もしオーバーするなら、土日分の2日を余計に戻す
という判定処理です。
具体的には、
- 起点を「直前の金曜 or もともとの平日」に補正した後の曜日を
WEEKDAY(...,2)で取得 - その週に残っている平日数と「端数の平日」を比較
- 端数が残りを超える場合は 土曜・日曜をまたぐ ので
+2日戻す
という流れです。こうして、18営業日分の移動の中で発生するあらゆる週またぎのパターンに対して、土日を確実に飛ばすことができます。
検算:RTS=2025/10/20(月)のときの結果
質問で挙がっていた「RTSを 2025/10/20(月)にしたとき、18営業日前はどうなるか?」を実際に確認してみましょう。
2025/10/20(月)から平日だけを数えて18営業日前にさかのぼると、以下のようになります。
| 営業日カウント | 日付 | 曜日 |
|---|---|---|
| 1営業日前 | 2025/10/17 | 金 |
| 2営業日前 | 2025/10/16 | 木 |
| 3営業日前 | 2025/10/15 | 水 |
| 4営業日前 | 2025/10/14 | 火 |
| 5営業日前 | 2025/10/13 | 月 |
| 6営業日前 | 2025/10/10 | 金 |
| 7営業日前 | 2025/10/09 | 木 |
| 8営業日前 | 2025/10/08 | 水 |
| 9営業日前 | 2025/10/07 | 火 |
| 10営業日前 | 2025/10/06 | 月 |
| 11営業日前 | 2025/10/03 | 金 |
| 12営業日前 | 2025/10/02 | 木 |
| 13営業日前 | 2025/10/01 | 水 |
| 14営業日前 | 2025/09/30 | 火 |
| 15営業日前 | 2025/09/29 | 月 |
| 16営業日前 | 2025/09/26 | 金 |
| 17営業日前 | 2025/09/25 | 木 |
| 18営業日前 | 2025/09/24 | 水 |
よって、2025/10/20(月)の18営業日前は 2025/09/24(水) となり、先ほどの計算式で得られる結果と一致します。
週末に着地した場合の丸め(前倒し・後ろ倒し)
上で紹介した「完全版」の計算式は、常に平日で返すため、週末に着地するケースはありません。ただ、別のシンプルなロジックで計算した場合など、結果が土日になる可能性があるときに、
- 「週末に当たったら翌営業日に繰り延べたい」
- 「週末に当たったら前営業日に繰り戻したい」
といったニーズが出てくることがあります。その場合、一旦計算した結果を変数 R とみなし、以下のような「ラッパー式」を重ねるとシンプルに実現できます。
週末の場合、翌営業日(月曜)に繰り延べる式
=IF(WEEKDAY(R,2)=6, R+2, IF(WEEKDAY(R,2)=7, R+1, R))
Rが土曜(6)の場合 → 月曜まで2日進めるRが日曜(7)の場合 → 月曜まで1日進める- それ以外(平日)の場合 → そのまま
週末の場合、前営業日(金曜)に繰り戻す式
=IF(WEEKDAY(R,2)=6, R-1, IF(WEEKDAY(R,2)=7, R-2, R))
Rが土曜の場合 → 前日の金曜へRが日曜の場合 → 前々日の金曜へ- 平日の場合 → そのまま
実際に計算列に設定するときは、R の部分を元々の計算式全体に置き換えてください。
祝日(会社休日)も除外したい場合:Power Automate連携
ここまでの式は、土日だけを除外するもので、祝日や会社独自の休日は考慮していません。残念ながら、SharePointの計算列だけでは、
- 別リストに保存している「休日カレンダー」を参照する
- その日が休日かどうかを動的に判定する
といったことができないため、Power Automate と組み合わせるのが現実的な解決策になります。
1. 休日管理リスト(Holidays)の用意
まず、SharePointに休日を一覧管理するリストを作成します。
| 列名 | 種類 | 内容例 |
|---|---|---|
| Title | 1行テキスト | 元日、会社創立記念日 など |
| Date | 日付 | 2025/01/01, 2025/05/03 など |
| Type | 選択肢(任意) | 祝日 / 会社休日 / メンテナンス日 など |
ここに、除外したい祝日・会社休日をすべて登録しておきます。毎年更新する運用でも構いませんし、複数年分をあらかじめ入れておいても構いません。
2. Power Automate フローの基本設計
次に、RTS日付を元に「18営業日前(祝日も除外)」を求めるフローを作ります。大まかな流れは以下の通りです。
- トリガー:RTS日付を持つアイテムの作成/変更
- 変数の初期化:
baseDate= RTS日付count= 0(カウントした営業日数)
- 「Do Until(繰り返し)」:
count < 18の間ループbaseDateを 1日前にする(addDays(baseDate, -1))- もし
baseDateが土日なら → 何もせず次のループへ - 土日でない場合:
- Holidays リストを
Date eq baseDateで検索 - 該当があれば「休日」なのでカウントせず次のループへ
- 該当がなければ営業日 →
count = count + 1
- Holidays リストを
- ループ終了(=18営業日さかのぼった状態の
baseDate) - SharePointアイテムの更新:
- 「RTS−18営業日前(祝日除外)」という通常の日付列に
baseDateを書き込む
- 「RTS−18営業日前(祝日除外)」という通常の日付列に
この方式にすると、
- 土日だけでなく、Holidaysリストに登録した日も営業日カウントから除外
- 「18」という数字を変数にすれば、別列で「N営業日前」を再利用することも可能
といった柔軟な運用が可能になります。
18以外の「N営業日前」にも応用する
プロジェクトによっては、18営業日前だけでなく、
- 7営業日前:レビュー締め切り
- 3営業日前:最終確認
- 30営業日前:発注期限
など、複数の営業日オフセットを同時に管理したくなることがあります。
今回の数式は 18 を固定値として使っていますが、実はこの部分を数値列にしてしまえば、同じロジックで「任意の N 営業日前」を計算できます。
オフセット列を追加する例
| 列名 | 種類 | 説明 |
|---|---|---|
| BusinessOffset | 数値(整数) | 何営業日前か(例:18) |
| RTS−N営業日前 | 計算列 | 上の値を使って営業日を逆算 |
この場合、先ほどの式中の 18 をすべて [BusinessOffset] に置き換えれば、同じロジックで任意の営業日前を計算できるようになります。
=[RTS date]
-(
IF(WEEKDAY([RTS date],2)=6,1,IF(WEEKDAY([RTS date],2)=7,2,0))
+ INT(([BusinessOffset] - IF(WEEKDAY([RTS date],2)>=6,1,0))/5)*7
+ MOD([BusinessOffset] - IF(WEEKDAY([RTS date],2)>=6,1,0),5)
+ IF(
MOD([BusinessOffset] - IF(WEEKDAY([RTS date],2)>=6,1,0),5)
> WEEKDAY([RTS date] - IF(WEEKDAY([RTS date],2)=6,1,IF(WEEKDAY([RTS date],2)=7,2,0)),2) - 1,
2,
0
)
)
これにより、
- オフセット値をユーザーが変更できる
- 同じ式を再利用して、複数の営業日前列を持つこともできる
といった柔軟なメンテナンスが可能になります。
よくある落とし穴とチェックポイント
WEEKDAY関数のモード違い
WEEKDAY には複数のモードがありますが、本記事の数式は必ず WEEKDAY(…,2)(月=1〜日=7)を前提に組んでいます。
| モード | 月 | 火 | 水 | 木 | 金 | 土 | 日 |
|---|---|---|---|---|---|---|---|
| 既定(または1) | 2 | 3 | 4 | 5 | 6 | 7 | 1 |
| 2(本記事で使用) | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
モードを変えてしまうと「土日判定」や「週をまたぐ判定」がすべて狂ってしまうため、WEEKDAYの第2引数は必ず 2 に固定してください。
計算列の「返されるデータの種類」
計算列の設定で「この数式から返されるデータの種類」を、
- 数値
- 単なるテキスト
のままにしていると、ビューでのソートやグループ化、フィルターが正しく動きません。必ず 「日付」 を選び、表示形式も「日付のみ」にしておきましょう。
サイトのタイムゾーン設定
SharePoint Online では、サイト コレクションやユーザープロファイルのタイムゾーン設定によって、
- 実際の内部値はUTC
- 表示時にローカル時刻に変換
という挙動になります。通常は日付のみの列であれば問題になりにくいですが、
- 時刻付きの列を使っている
- 海外拠点と同一サイトを共有している
といった場合に、日付が「1日ずれて見える」ような現象が起こることがあります。営業日計算列は基本的に「日付のみ」で運用することをおすすめします。
列名のスペル違い・内部名の違い
計算列の式で使う列名は、表示名ではなく内部名であることに注意してください。表示名を変更した場合など、内部名と画面表示が異なるケースがあります。
- 作成時に英数字のシンプルな列名をつける(例:
RTSdate、BusinessOffset) - 必要であれば後から日本語の表示名に変える
といった運用にしておくと、計算列やPower Automateから参照しやすく、トラブルも減らせます。
運用のコツ:テスト用ビューで必ず検証する
本番運用に入る前に、以下のような「検証用ビュー」を1つ作っておくと安心です。
- RTS日付
- RTS−18営業日前(計算列)
- (必要なら)RTS−18営業日前(祝日除外、Power Automate)
- 作成日時 / 更新日時
このビューで、
- RTS日付を平日・土日いろいろ変えて動作確認
- カレンダー(OutlookやTeamsなど)と突き合わせて目視で検算
- 「祝日除外版」と並べて、休日が含まれるケースで差が出ることを確認
というチェックを一度やっておくと、後から「この日付は合っているのか?」という問い合わせを受けたときにも説明しやすくなります。
まとめ:SharePointで営業日計算を安定運用するポイント
- SharePointの計算列だけでも、土日を除いた「RTS日付 − 18営業日」を正確に計算できます。
- 今回紹介した「完全版の式」は、入力が土日でも自動補正し、結果を必ず平日で返します。
- 祝日・会社休日まで除外したい場合は、Holidaysリスト+Power Automateで前計算するのが現実解です。
- 18以外の営業日数にも応用したい場合は、「オフセット値」を数値列として持たせ、計算式の定数を列参照に変えると汎用的に使えます。
- WEEKDAY関数のモード(
…,2)、計算列のデータ型(「日付」)、タイムゾーン設定など、周辺設定も合わせて確認しておくとトラブルを防げます。
一度しっかりと計算ロジックを作ってしまえば、あとはリストにRTS日付を入力するだけで、関連する「◯営業日前」の日付が自動で追従するようになります。SharePoint上のタスク管理や進捗管理を「カレンダーとにらめっこしないで済む」状態にして、日々の運用負荷をぜひ下げてみてください。

コメント