結合はセル値とは別の側テーブル ws.Merges(MergeTable)が保持します。
結合していないセルはこのテーブルに一切現れないため、コストは結合の個数にのみ比例します。

結合と解除
using unvell.ReoGrid.Core;
ws.MergeRange(RangePosition.Parse("B2:D3"));
bool merged = ws.Merges.IsMerged(1, 1);
bool isAnchor = ws.Merges.IsAnchor(1, 1); // 左上セルかどうか
ws.UnmergeAt(1, 1); // 範囲内のどのセルを指してもよい
結合すると、範囲の**左上セル(アンカー)**の値と書式が表示に使われます。
UnmergeAt は範囲内のどのセルを指しても、その結合全体を解除します。
内容の確認
if (ws.Merges.TryGetAt(1, 1, out var range))
Console.WriteLine(range.ToAddress()); // "B2:D3"
int count = ws.Merges.Count;
foreach (var r in ws.Merges.Ranges)
Console.WriteLine(r.ToAddress());
TryGetAt は範囲内のどのセルからでも、その結合の範囲全体を返します。
選択範囲を結合単位へ広げる
// 選択範囲が結合セルを部分的に含む場合、結合全体まで広げる
RangePosition full = ws.Merges.ExpandToIncludeMerges(selection);
コピーや書式適用の対象範囲を決めるときに使います。結合の一部だけを対象にすると 表示と実データが食い違うため、Excel と同じく範囲を広げるのが既定の挙動です。
挿入・削除との関係
行や列を挿入・削除すると、結合範囲は自動的に追従します。削除によって結合範囲が 完全に消える場合は、その結合自体が取り除かれます。
制限
- 結合範囲に対する範囲ソートはできません。 ソート は結合を含む 範囲を拒否します。Excel と同じ制限です
主なメンバー(MergeTable)
| メンバー | 内容 |
|---|---|
IsMerged(r, c) | そのセルが結合に含まれるか |
IsAnchor(r, c) | 結合の左上セルか |
TryGetAt(r, c, out range) | そのセルを含む結合範囲 |
Ranges / Count | 結合の一覧と個数 |
ExpandToIncludeMerges(range) | 範囲を結合単位へ拡張 |
Clear() | すべて解除 |
追加・解除は ws.MergeRange(...) / ws.UnmergeAt(...) を使ってください
(テーブルを直接操作すると、関連する更新が漏れます)。