はじめに
セルに入力したデータで、同じものを1つにまとめることができたら便利です。Excelではセルデータを1度ソートして同じデータを集め、結合対象のセルを探しながらセル結合を行う、という作業になりますがこれらの操作は手動で行うことになります。
SPREAD for .NET 2.5J Windows Forms Editionコンポーネントのセルマージ機能を使うと、データのグループ化作業や隣接する同じデータのセルを結合する作業を、簡単に自動化することができます。
対象読者
Visual Basic 2005、Visual C# 2005を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。
- FarPoint.Win.SpreadJ.dll (本体アセンブリ)
- FarPoint.Win.dll (共通アセンブリ)
- FarPoint.PluginCalendar.WinForms.dll (プラグインカレンダーDLL)
- Farpoint.CalcEngine.dll (表計算エンジンDLL)
これらのファイルを、実行プログラムと同じフォルダに格納します。また、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
コンポーネントのインストール
はじめてSPREAD for .NET 2.5J Windows Forms Editionを使用する方は、プロジェクトにSPREAD for .NET 2.5J Windows Forms Editionをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。
製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
SPREAD for .NET 2.5J Windows Forms Editionをインストールしたら、ツールボックスに専用のタブを作成し、SPREAD for .NET 2.5J Windows Forms Editionのコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「FarPoint.Win.Spread」で始まる名前空間のコンポーネント「FpSpread」です。
GUIの作成
今回のGUIも簡単な設定です。VS標準のpanelを2つ配置し、Dock
プロパティを[Top]と[Fill]に設定します。
panel1にはボタンを3つ配置し、panel2にはFpSpreadコンポーネントを配置してDock
プロパティを[Fill]に設定します。
隣接するセルの同じデータを結合する
ここでは、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コンポーネントを使った方が簡単にアプリケーションに組み込むことができます。