SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(SPREAD)

データをグループ化する機能を持った表計算ソフトを作る

SPREAD for .NET 2.5J Windows Forms Editionコンポーネントの便利なテクニック

  • このエントリーをはてなブックマークに追加

隣接するセルの同じデータを結合する

 ここでは、Excelのデータを使って、作成するプログラムの機能を説明します。このデータは、いくつかの都道府県の市の人口を表している表で、Excelのブック形式で「data1.xls」という名前で保存されています。

 このExcelの表をプログラムで使用する際は、Excelのデータをコピーしプログラムにキーボードの[Ctrl]+[V]キーでペーストして使用してください。

Excelに入力してある住民の人口データ
Excelに入力してある住民の人口データ

 次に、隣接するセルの同じデータを結合する機能を組み込みます。

 ワークシートの住民人口データは、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つのセルになるように自動的に結合されます。セルデータをいちいちチェックする必要はありません。

GUIの配置画面
GUIの配置画面
MergePolicy列挙型のメンバ
メンバ 説明
None セルを自動的にマージしない
Always 値が同一の隣接セルと常にマージする
Restricted 別の行または列の対応するセルが同様にマージされている場合、値が同一の隣接セルと自動的にマージする
Visual Basic
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
Visual C#
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)
SortRangeメソッド
パラメータ 内容
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)
Visual Basic
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
Visual C#
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コンポーネントを使った方が簡単にアプリケーションに組み込むことができます。

 

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(SPREAD)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1223 2016/09/02 13:44

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング