SHOEISHA iD

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

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

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

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

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

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

 SPREAD for .NET 2.5J Windows Forms Editionコンポーネントのセルマージ機能を使うと、Excelのような「セル」を同じ情報でグループ化する機能を手軽に作ることができます。しかもこのグループ化機能は、ボタン1つで動作させることが可能です。

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

はじめに

 セルに入力したデータで、同じものを1つにまとめることができたら便利です。Excelではセルデータを1度ソートして同じデータを集め、結合対象のセルを探しながらセル結合を行う、という作業になりますがこれらの操作は手動で行うことになります。

 SPREAD for .NET 2.5J Windows Forms Editionコンポーネントのセルマージ機能を使うと、データのグループ化作業や隣接する同じデータのセルを結合する作業を、簡単に自動化することができます。

隣接するセルの同じデータを1つにまとめる
隣接するセルの同じデータを1つにまとめる
セル範囲をソートし同じデータをグループ化する
セル範囲をソートし同じデータをグループ化する

対象読者

 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」です。

「GrapeCity.Win.Input」で始まる名前空間のコンポーネント「FpSpread」を追加する
「GrapeCity.Win.Input」で始まる名前空間のコンポーネント「FpSpread」を追加する

GUIの作成

 今回のGUIも簡単な設定です。VS標準のpanelを2つ配置し、Dockプロパティを[Top]と[Fill]に設定します。

 panel1にはボタンを3つ配置し、panel2にはFpSpreadコンポーネントを配置してDockプロパティを[Fill]に設定します。

GUIの配置画面
GUIの配置画面

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

 ここでは、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コンポーネントを使った方が簡単にアプリケーションに組み込むことができます。

 

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング