重なりのある数値区間の組を取り出す

開始点と終了点のある一覧から、区間が重なる組み合わせを探します。一方がもう一方に含まれる場合も残し、端で接するだけの組は除きます。

重なりのある数値区間の組を取り出す 説明図
架空のデータを使った説明図です。実際の画面キャプチャではありません。

区間が重なっているかを調べるには、片方の開始点がもう片方の終了点より前にあることを、両方向で確かめます。JOIN SHEETでは同じ一覧を2つ読み込んで区間の組を作り、2つの差を計算して判定します。これなら、一方の区間がもう一方に完全に含まれる組も見つかります。

包含と端点だけの接触を区別する

この架空の例では、区間4(2~4)は区間1(0~10)に含まれます。区間1と3は10で接するだけなので除外します。

比較用に、同じ一覧を2つ用意します。読み込む前に各区間へ重複しない数値IDを付け、コピーの列名をFirst・Secondに分けてください。以下の表やIDは、このように元のファイルで準備したものです。

FirstRanges

Route FirstID FirstStart FirstEnd
R 1 0 10
R 2 8 12
R 3 10 15
R 4 2 4

SecondRanges

Route SecondID SecondStart SecondEnd
R 1 0 10
R 2 8 12
R 3 10 15
R 4 2 4

同じ区間一覧を2つの役割で比較する

  1. FirstRangesとSecondRangesを読み込み、Route同士を「一致する行のみ」で結びます。同じRouteの4行×4行で最初は16組です。両方のRoute列は結果から非表示にできます。
  2. 「結果を整理」→「計算」でIDGap = SecondID − FirstIDを作り、その下の「絞り込み」でIDGapが0「より大きい」と設定します。自己・逆順の組がなくなり6組になります。
  3. 次にGapAB = FirstEnd − SecondStart、GapBA = SecondEnd − FirstStartを「引き算 · A − B」で追加します。AとBを逆にしないでください。
  4. 計算の下でGapABが0「より大きい」、GapBAが0「より大きい」という絞り込みをそれぞれ追加します。両方の条件を満たす必要があります。
  5. 「適用」を押してから「結果のプレビュー」で1–2、1–4、2–3の3組を確認して保存します。IDGap・GapAB・GapBAは判定の根拠として結果に残します。

同じ区間一覧を2つの役割で比較する 説明図

重なる3組を確認する

1–4は一方が他方に完全に含まれていても検出されます。1–3はGapAB=0なので除かれます。GapABとGapBAは判定用の差で、重なった長さではありません。1–4の実際の重なりは2で、GapABの8ではありません。

FirstID FirstStart FirstEnd SecondID SecondStart SecondEnd IDGap GapAB GapBA
1 0 10 2 8 12 1 2 12
1 0 10 4 2 4 3 8 4
2 8 12 3 10 15 1 2 7

重なる3組を確認する 説明図

元表の色付けではなく確認用の一覧

各区間のStartとEndは数値にし、Start < Endになることを確認します。原文にある12+50のような測点表記は、読み込む前に1250のような数値へ変換してください。アプリで自動変換はしません。端で接する組も残したい場合は、両方の差の条件を0以上に変えます。

同じRouteがn行あると、最初の候補はn²行になります。小さな一覧で試すか、確認対象を十分に分けてください。結果として作るのは重なる区間の一覧で、元のセルに色を付ける操作ではありません。

自分のファイルで始めましょう

JOIN SHEETを使ってみる ↗

Excel・CSVの作業はPCでご利用ください。
新しいタブで開くため、作業中のデータは置き換わりません。

サンプルの検証日:

出典

How can I flag overlaps in number ranges? (Reddit r/excel)

原文は道路作業の2班が記録した開始・終了測点について、区間の重なりを見つける方法を尋ねています。 上の表と手順は、この質問を参考に別途作成した架空の例です。質問者の実データや製品の利用体験ではありません。