隣接するセルの同じデータを結合する
ここでは、Excelのデータを使って、作成するプログラムの機能を説明します。このデータは、いくつかの都道府県の市の人口を表している表で、Excelのブック形式で「data1.xls」という名前で保存されています。
このExcelの表をプログラムで使用する際は、Excelのデータをコピーしプログラムにキーボードの[Ctrl]+[V]キーでペーストして使用してください。
次に、隣接するセルの同じデータを結合する機能を組み込みます。
ワークシートの住民人口データは、Excelで「市名」の昇順(Shift-JIS順)に並べてありますので、「県名」列では同じ県名が行方向に並んでいます。
例えば、セルA4とA5には「神奈川県」が入力されていますので、この2つのセルを1つにまとめた方が表としては見やすいです。しかし、同じように隣接するセルに同じデータが入っているセルはいくつもあり、これを1つ1つセル結合していたのでは時間がかかります。そこで、この処理をボタン1つで実行できるようにします。
ここで、FpSpreadコンポーネントのSetColumnMerge
メソッドを使用します。このメソッドはSheetView
クラスのメソッドで、2つの引数を取ります。1つはセルを結合する列番号を指定します。A列が「0」番になり、すべての列を対象にする場合は-1を指定します。2番目の引数は、セル内の値に基づいてコントロールがセルを自動的に結合する方法を、MergePolicy列挙型で表します。
ここでは、先頭の列を結合するので0を、また、常に結合するのでAlwaysを指定して実行します。
SetColumnMerge(0, FarPoint.Win.Spread.Model.MergePolicy.Always)
これだけで、シート内で隣接するセルに同じデータがあれば、すべて1つのセルになるように自動的に結合されます。セルデータをいちいちチェックする必要はありません。
メンバ | 説明 |
None | セルを自動的にマージしない |
Always | 値が同一の隣接セルと常にマージする |
Restricted | 別の行または列の対応するセルが同様にマージされている場合、値が同一の隣接セルと自動的にマージする |
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click FpSpread1.ActiveSheet.SetColumnMerge(0, _ FarPoint.Win.Spread.Model.MergePolicy.Always) End Sub
fpSpread1.ActiveSheet.SetColumnMerge(0, FarPoint.Win.Spread.Model.MergePolicy.Always);
同じデータを結合してグループ化する
データを県名で並び替え、SetColumnMerge
メソッドを実行すると、同じ県名のデータを1つにまとめることができます。
データのソート
シート内のデータを並び替えるには、並び替えの条件をSortInfo
オブジェクトとして作成し、SheetView
クラスのSortRange
メソッドを実行します。複数の並び替え条件がある場合は、SortInfo
オブジェクトの配列を作成しそれぞれの要素に並び替え条件を設定します。
ここでは、県名と市名で並び替えますので、2つの要素を持ったSortInfo
オブジェクト型の配列を作成し、SortInfo
クラスのコンストラクタでSortInfo
オブジェクトを作成します。コンストラクタの引数は2つで、最初の引数に並び替えを実行する列番号を指定し、2番目の引数で並び替えの順序を昇順(True)か降順(False)で指定します。
Dim si(1) As FarPoint.Win.Spread.SortInfo si(0) = New FarPoint.Win.Spread.SortInfo(0, True) si(1) = New FarPoint.Win.Spread.SortInfo(1, True)
そして、SheetView
クラスのSortRange
メソッドを実行します。メソッドの引数は全部で以下の6つです。
SortRange(row, column, rowCount, columnCount, byRows, sortInfo)
パラメータ | 内容 |
row | 並べ替えるセル範囲の開始行インデックス |
column | 並べ替えるセル範囲の開始列インデックス |
rowCount | セル範囲の行数 |
columnCount | セル範囲の列数 |
byRows | ソートの基準を行にするかどうかを表すブール値。Trueを指定すると行を基準に、Falseを指定すると列を基準に並べ替えます |
sortInfo | ソート基準とソート方法を含むSortInfoオブジェクト |
ここでは、並べ替え範囲の開始行・列は列見出しを除いてセル「A2」(行1・列0番)からに設定し、セル範囲の行数はデータがある行数を返すRowCount
プロパティから取得し見出し行を引いた数を指定します。列数はColumnCount
プロパティで取得し設定します。
また、ソートの基準を行にするためTrueを、そしてソート方法に作成したSortInfo
オブジェクトを指定します。
FpSpread1.ActiveSheet.SortRange(1, 0, FpSpread1.ActiveSheet.RowCount - 1, FpSpread1.ActiveSheet.ColumnCount, True, si)
県名のセルを結合する
ソートができたら、県名のセルを結合します。SetColumnMerge
メソッドのコードは、先ほどの隣接するセルの同じデータを結合する際の使い方と同じです。
FpSpread1.ActiveSheet.SetColumnMerge(0, FarPoint.Win.Spread.Model.MergePolicy.Always)
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
'第1キー:1列目/第2キー:2列目としたSortInfo
オブジェクトを作成
Dim si(1) As FarPoint.Win.Spread.SortInfo
si(0) = New FarPoint.Win.Spread.SortInfo(0, True)
si(1) = New FarPoint.Win.Spread.SortInfo(1, True)
'作成済みソート条件を元に、すべての行/2列を対象としたソートを実行
FpSpread1.ActiveSheet.SortRange(1, 0, _
FpSpread1.ActiveSheet.RowCount - 1, _
FpSpread1.ActiveSheet.ColumnCount, _
True, si)
'同じ県名のセルをマージ
FpSpread1.ActiveSheet.SetColumnMerge(0, _
FarPoint.Win.Spread.Model.MergePolicy.Always)
End Sub
private void Button2_Click(object sender, EventArgs e) { //第1キー:1列目/第2キー:2列目とした //SortInfoオブジェクトを作成します FarPoint.Win.Spread.SortInfo[] si = new FarPoint.Win.Spread.SortInfo[2]; si[0] = new FarPoint.Win.Spread.SortInfo(0, true); si[1] = new FarPoint.Win.Spread.SortInfo(1, true); //作成済みソート条件を元に、 //すべての行/2列を対象としたソートを実行します fpSpread1.ActiveSheet.SortRange(1, 0, fpSpread1.ActiveSheet.RowCount -1, fpSpread1.ActiveSheet.ColumnCount, true, si); //同じ県名のセルをマージ fpSpread1.ActiveSheet.SetColumnMerge(0, FarPoint.Win.Spread.Model.MergePolicy.Always); }
まとめ
この、同じデータがあるセルを自動的に結合する機能は、Excelには組み込まれていない機能ですが、意外と便利で使い勝手のある機能だと思います。
Esxcel VBAで苦労してコードを組むよりも、SPREAD for .NET 2.5J Windows Forms Editionコンポーネントを使った方が簡単にアプリケーションに組み込むことができます。