セルの結合
連続する複数のセルを結合して一つのセルとして取り扱うことができます。結合したセルのサイズは結合前のセルを合わせたサイズとなります。
セルを結合
複数のセルを結合するには、その範囲を指定してワークシートのメソッド MergeRange
を利用するか、または Range
インスタンスを取得してそのメソッド Merge
を利用します。
// 現在表示中のワークシートを取得
var worksheet = reoGridControl1.CurrentWorksheet;
// 方法1: ワークシートの MergeRange を呼び出す
worksheet.MergeRange("B3:E5");
// 方法2: Rangeオブジェクトのメソッド Merge を呼び出す
var range = worksheet.Ranges["B3:E5"];
range.Merge();
結合したセルを解除
結合したセルを解除するには、セルの結合と同じようにワークシートのメソッド UnmergeRange
と Range
インスタンスの Unmerge
メソッドを利用します。
// 方法1: ワークシートの UnmergeRange を呼び出す
worksheet.UnmergeRange("B3:E5");
// 方法2: Range オブジェクトの Unmerge を呼び出す
var range = worksheet.Ranges["B3:E5"];
range.Unmerge();
元に戻す、やり直す、繰り返す
セルの結合と結合の解除はアクションによって実行されると操作を元に戻す、やり直す、繰り返すことができます。
アクションを利用してセルを結合
セルを結合するアクションは MergeRangeAction
クラスです。
worksheet.DoAction(new MergeRangeAction("B3:E5"));
アクションを利用して結合したセルを解除
結合したセルを解除するアクションは UnmergeRangeAction
クラスです。
worksheet.DoAction(new UnmergeRangeAction("B3:E5"));
スクリプト言語でのセルの結合および結合したセルの解除
拡張機能版を利用する場合、スクリプト言語の実行でもセルを結合する、または結合したセルを解除することができます。セルの結合にはワークシートの mergeRange
関数を利用する、結合したセルの解除には unmergeRange
を利用します。
var sheet = workbook.CurrentWorksheet;
sheet.mergeRange(new Range("B3:E5"));
sheet.unmergeRange(new Range("B3:E5"));
多重結合と結合したセルの一括解除
セルの結合操作は、すでに結合したセルにも有効です。例えば下図のようなA、B、Cの三つが結合したセルがあります。赤線で囲まれた範囲に対して結合の操作を行うと、A、B、Cセルが結合されて一つのセルになります。
一方、赤線の範囲に対して結合を解除する操作を行うと、A、B、C三つのセルが全て解除され、ワークシートが初期化された(結合したセルがない)状態になります。
結合したセルの行列数
結合したセルのインスタンスから行列数を取得できます。結合したセルの場合、行と列のいずれかが必ず2以上になります。
B3セルが結合したセル、行数は4、列数は3となります。行列数を取得するにはセルインスタンスの GetRowspan
と GetColspan
を利用します。
var rowspan = cell.GetRowspan(); // number of rowspan
var colspan = cell.GetColspan(); // number of colspan
結合したセルをチェック
ワークシートからどのセルが結合したセルかをチェックするには、ワークシートの IsMergedCell
メソッドを利用します。下図のようにYesと書いたセルが結合したセル、Noと書いてあるセルが結合していないセルです。赤線の中のNoと書いてあるセルも結合したセルではありません。結合したセルはC3のみとなります。
セルが結合したセルであるかどうかをチェックするには、ワークシートのメソッド IsMergedCell
、またはセルインスタンスの IsMergedCell
を利用します。
// 方法1: ワークシートの IsMergedCell を利用
bool isMergedCell = worksheet.IsMergedCell("B3"); // 戻り値:false
bool isMergedCell = worksheet.IsMergedCell("C3"); // 戻り値:true
bool isMergedCell = worksheet.IsMergedCell("C2"); // 戻り値:false
// 方法2: セルインスタンスの IsMergedCell を利用
var cell = worksheet.Cells["B3"];
bool isMergedCell = cell.IsMergedCell; // 戻り値:true
有効なセルと無効なセル
他のセルに結合されたセル(先頭の一つ目のセルを除く)は無効なセルとなります。下図にあるC3:F7範囲が結合されたセル、Yesと書いたC3セルが結合したセルの代表として有効なセルとなり、それ以外Noと書いたセルは全て無効なセルとなります。また、結合していないセルは有効なセルとなります。
無効なセルはデータ、スタイル、罫線の表示ができません。ただし結合する前に設定したデータはそのまま保持することができます。
ワークシートにあるセルが有効か無効かをチェックするには、ワークシートの IsValidCell
メソッドを利用します。
sheet.IsValidCell(2, 2); // 戻り値:true
sheet.IsValidCell(2, 3); // 戻り値:false
範囲から結合したセルを見つける
結合したセルの範囲にある無効なセルから、有効なセルを見つけたい場合、ワークシートの GetMergedCellOfRange
メソッドを利用します。例えば下図のように、D6セルは結合されたセルで無効となり、このメソッドにD6セルを渡すと、その結合した範囲の代表セルであるB3セルが返されます。
メソッドの呼び出し例は以下の通りです。
var validCell = worksheet.GetMergedCellOfRange("D6");
指定した範囲を囲む結合したセルを見つける
範囲を指定して、その範囲を囲む結合したセルの範囲を見つけたい場合、ワークシートの CheckMergedRange メソッドを利用します。下図のようにC4:F11が結合したセルの範囲、中にある任意の範囲E6:E9をインプットとして渡すとアウトプットのC4:F11範囲を取得できます。
メソッドの呼び出し例は以下の通りです。
var inputRange = new RangePosition("E6:E9");
RangePosition outputRange = sheet.CheckMergedRange(inputRange);
// 結果は C4:F11
RangeIntersectionException 異常
すでに結合したセルの一部は、他のセルと結合できません。 例えば下図にあるB3:E7は結合したセルなので、C列を選択して、結合操作を行うと、異常 RangeIntersectionException
が発生します。
この異常を捕捉し、ユーザーに分りやすいメッセージを提示することができます。
指定した範囲が結合できるかを確認
RangeIntersectionException
異常を発生させないため、指定した範囲が結合できるかを事前に確認することができます。それにはワークシートの CheckIntersectedMergingRange
メソッドを利用します。
RangePosition outputRange = sheet.CheckIntersectedMergingRange(inputRange);
このメソッドは指定した範囲が他の範囲と交差するかを確認し、交差する範囲を返します。戻り値の RangePosition
構造体は Empty
の場合、交差する範囲がなく、指定した範囲の結合が安全に行われることを示します。また、交差する範囲のポジションを求めず、単にあるかどうかをチェックするには、より便利なメソッド HasIntersectedMergingRange
が利用できます。このメソッドは bool
型の戻り値を返します。
bool rs = sheet.HasIntersectedMergingRange(inputRange);