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」というコンポーネントを使うと、簡単に業務や用途に応じたスプレッドシートアプリケーションを作成できます。

  • X ポスト
  • このエントリーをはてなブックマークに追加
用途固有の計算機能を実装
用途固有の計算機能を実装
保存したファイルはExcelと完全互換
保存したファイルはExcelと完全互換

はじめに

 業務やある用途に特化した計算機能を持つプログラムの開発を求める声は意外と多いのではないでしょうか。計算機能だけを取れば、Excelなど市販の表計算ソフトを使えばよいのでしょうが、機能が多すぎて特定の処理を行わせるにはかなりカスタマイズしなければなりません。さらに、表計算以外の機能を組み込もうとすると、どうしても独自のアプリケーションを開発しなければならなくなります。

 しかし、たくさんのセルを持った表計算機能を実装するとなると、相当開発の工数がかかります。

 そこで「SPREAD for .NET 2.5J Windows Forms Edition」(以下、SPREAD for .NET 2.5J)という表計算機能が集約されたコンポーネントを利用すると、簡単に業務や用途に応じたスプレッドシートアプリケーションを作成できます。

 今回は、アルバイトの勤務時間を集計する専用の計算ソフトを作ってみました。

対象読者

 Visual Basic 2005を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005またはVisual Studio 2005でプログラムが作れる環境。

プログラム実行時の注意事項

 本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。

  • FarPoint.Win.SpreadJ.dll(本体アセンブリ)
  • FarPoint.Win.dll(共通アセンブリ)
  • FarPoint.PluginCalendar.WinForms.dll(プラグインカレンダーDLL)
  • Farpoint.CalcEngine.dll(表計算エンジンDLL)
  • Farpoint.Excel.dll(Excelインポート/エクスポートDLL)

 これらのファイルを、実行プログラムと同じフォルダに格納します。

 また、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

コンポーネントのインストール

 はじめてSPREAD for .NET 2.5Jを使用する方は、プロジェクトにSPREAD for .NET 2.5Jをインストールする必要があります。インストーラをグレープシティ社のWebページからダウンロードして、インストールしてください。

 製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、目的のダウンロード方法([FTP]または[HTTP])を選択します。ファイルはLZH形式で圧縮されています。

 有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 SPREAD for .NET 2.5Jをインストールしたら、ツールボックスに専用のタブを作成し、SPREAD for .NET 2.5Jのコンポーネントを追加します。追加するコンポーネントは、[.NET Frameworkコンポーネント]の[名前空間]が「FarPoint.Win.Spread」で始まるコンポーネント「FpSpread」です。

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

FpSpreadコンポーネントの設定

 このFpSpreadコンポーネントは、プロパティとデザイナでほとんどの初期設定を行うことができます。コンポーネントをフォームに配置した時点では、500行×500列のシートが1枚組み込まれた状態になっています。これを、FpSpreadコンポーネント全体のプロパティやシートのプロパティを操作して、用途や業務固有の形態に修正していきます。

フォームに配置した状態のFpSpreadコンポーネント
フォームに配置した状態のFpSpreadコンポーネント

 FpSpreadコンポーネントでは、シートは[Sheet]オブジェクト(コレクション)になっていますので、シート単位で外観の設定を行うことができます。

スキンの変更

 シートの配色を変更するには、タスクトレイから[スキンの編集]を選び、[シートスキンエディタ]を起動します。[標準]ページではあらかじめ設定されている配色を、[カスタム]ページでは独自にカスタマイズした配色を選ぶことができます。ここでは、[Professional1]を選んでみました。

スキンの設定
スキンの設定

行列数の変更

 シートの行列数を変えるには、シート単体のプロパティを変更します。

 これには、まずFpSpreadコンポーネントの[Sheets]プロパティをクリックし、[SheetView]コレクションエディタを起動します。そして、[ClumnCount]と[RowCount]プロパティの値を操作します。ここでは、11行×5列のシートに変更します。

[SheetView]コレクションエディタで行列数を修正
[SheetView]コレクションエディタで行列数を修正

列見出しを変更する

 デフォルトでは、シートの行列の見出しはExcelのようになっています。特定の業務にしか使用しないという前提で、見出しも変更してみます。

 FpSpreadコンポーネントのタスクトレイをクリックし、[デザイナ]を選ぶと、[SPREAD for .NETデザイナ]というウィンドウが起動します。ここから、変更したい見出しをクリックし、プロパティウィンドウにある「Label」の値を好きな文字に変えます。これは、行列の見出しのどれも同じ操作で変更できます。

 ここでは、列見出しを人名に、11行目の見出しを[合計]に変更しています。そして、デザイナのツールバーにある[適用]ボタンを押すと、変更がコンポーネントに反映されます。

デザイナで行列の見出しを変える
デザイナで行列の見出しを変える

SUM関数の埋め込み

 今度は、[合計]欄に、行1から10までの合計値を算出する関数を組み込みます。これもデザイナで行います。

 まず、デザイナのプロパティウィンドウのオブジェクトリストから[シート]を選び、[Calculation]の[ReferenceStyle]が[A1]になっていることを確認します。この形式になっていれば、行列見出しの名前が変わっていても、数式でのセルの参照をExcelのように[A1,A2,A3...]というセル番地で参照できるようになります。

[ReferenceStyle]が[A1]になっていることを確認
[ReferenceStyle]が[A1]になっていることを確認

 次に、[山田][合計]のセルをクリックし、デザイナの[数式の編集]をクリックします。

[山田][合計]欄のセルをクリックし、セルの値を編集する欄をクリックしてカーソルを点滅させ、[数式の編集]ボタンをクリックします。
[山田][合計]欄のセルをクリックし、セルの値を編集する欄をクリックしてカーソルを点滅させ、[数式の編集]ボタンをクリックします。

 [数式エディタ]が起動します。[数学]をクリックし[SUM]をダブルクリックすると、[数式]欄に「SUM()」と入力されるので、[適用]ボタンを押します。

[SUM]をダブルクリックし[適用]ボタンを押す
[SUM]をダブルクリックし[適用]ボタンを押す

 セルの値を編集する欄に「=SUM()」と入力されるので、()の中に「A1:A10」と入力します。Excelのようにセル範囲を""で囲む必要はありません。これで、[山田][合計]のセルには、「=SUM(A1:A10)」と関数式が入力されます。

 そして、[数式または値の設定]ボタン(チェックマーク)を押すと、この式が確定します。

()の中に[A1:A10]と入力し[数式または値の設定]ボタンを押す
()の中に[A1:A10]と入力し[数式または値の設定]ボタンを押す

 また、デザイナのプロパティウィンドウにある[Formura]プロパティにも、この数式が入ります。

[Formura]プロパティにもこの数式が入る
[Formura]プロパティにもこの数式が入る

 後は、このセルをコピーし、残りの人の[合計]セルにペーストしていきます。ペーストはセル範囲でまとめて行うことはできないので、1つ1つ順番にペーストしていきます。最後に、ツールバーの[適用]ボタンを押して、設定をコンポーネントに反映させ、デザイナを閉じます。

[適用]ボタンを押す
[適用]ボタンを押す

動作チェック

 では、ここまでの設定がちゃんと動作するかどうか、チェックしてみましょう。プログラムを実行させ、セルに数値を入力します。合計値が変わっていけばOKです。

動作チェックで計算をさせてみる
動作チェックで計算をさせてみる

ファイル保存の処理

 簡単ですが、基本的な機能は組み込んだので、次に入力データをファイルに保存する処理を実装します。この処理はとても簡単で、メソッドを実行するだけです。ボタンコントロールを配置し、このクリックイベントハンドラに次のコードを入力します。

FpSpread1.SaveExcel("C:\myspread.xls", _
    FarPoint.Win.Spread.Model.IncludeHeaders.BothCustomOnly)

 FpSpreadコンポーネントでは、コンポーネントへの入力データを次の3つの形式でファイルに保存できます。

  • Spread XMLファイル、またはストリーム
  • Excel 形式ファイル(ワークブック全体または特定のシート)
  • ASCIIテキストファイル(ファイル全体またはセル範囲)

 それぞれ、FpSpreadクラスのメソッドを利用して保存しますが、今回はExcelのブックと互換性のある形式で保存することにします。

 これには、SaveExcelメソッドを使用します。引数は2つで、保存するファイル名と保存する際にデータと共にヘッダを保存するかどうかを、IncludeHeaders列挙型のメンバで指定します。

IncludeHeaders列挙型のメンバ
メンバ 説明
None 列ヘッダも行ヘッダも含めません。
ColumnHeadersCustomOnly 列ヘッダのカスタムヘッダのみを含めます。
RowHeadersCustomOnly 行ヘッダのカスタムヘッダのみを含めます。
BothCustomOnly 列ヘッダと行ヘッダのカスタムヘッダのみを含めます。
保存したデータファイルをExcelで開くと...
保存したデータファイルをExcelで開くと...

シートをもう1枚追加する処理

 では、同じシートをもう1枚追加する処理を、今度はコードから行ってみます。シートの作成は、SheetViewオブジェクトを作成してSheetViewCollectionコレクションに追加する、という手順で行います。

 コレクションに追加する前にシートの設定を行います。以降、デザイナで行った内容をコードから行ってみます。

  1. シートの作成
  2. シート名と行列数の設定
  3. 行列見出しの変更
  4. スキンの設定
  5. SUM関数の組み込み
  6. セルのコピー&ペースト

シートの作成

 新しいシートは、SheetViewクラスのコンストラクタで作成します。引数はありませんが、コンストラクタが返すインスタンスへの参照を変数で受け取っておきます。

Dim newsheet As New FarPoint.Win.Spread.SheetView()

 後は、この変数名で各種設定を変更します。

シート名と行列数の設定

 シート名はSheetNameプロパティで、行列数はそれぞれRowCountColumnCountプロパティの値で指定します。

With newsheet
    .SheetName = "Sheet" & i
    .RowCount = 11
    .ColumnCount = 5

行列見出しの変更

 行見出しの変更は、Columnsプロパティの引数に列番号を指定し、Labelプロパティの値を変更します。列番号は0から始まりますから注意してください。

.Columns(0).Label = "山田"
.Columns(1).Label = "鈴木"
.Columns(2).Label = "田中"
.Columns(3).Label = "斉藤"
.Columns(4).Label = "渡辺"

 行番号は、Rowsプロパティの引数に行番号を指定し、Labelプロパティの値を変更します。列番号と同様に行番号も0から始まりますので注意してください。

.Rows(10).Label = "合計"

スキンの設定

 スキンは、Sheet1に設定したものをそのまま適用します。スキンはSheetSkinオブジェクトになっているので、FpSpread1_Sheet1オブジェクトのActiveSkinプロパティから取得し、新しいシートのActiveSkinプロパティに設定します。

Dim sk As FarPoint.Win.Spread.SheetSkin = _
    Me.FpSpread1_Sheet1.ActiveSkin
.ActiveSkin = sk

SUM関数の組み込み

 SUM関数の組み込みは、Cellsプロパティで組み込むセルを指定し、Formulaプロパティに文字列で式を設定します。

.Cells(10, 0).Formula = "SUM(A1:A10)"

 Cellsプロパティの引数には行列番号を指定しますが、いずれも0番から始まりますので注意してください。

セルのコピーペースト

 SUM関数の式を設定したら、このセルを他の人の合計用セルにコピー&ペーストします。

 しかし、このコピー・ペーストはクリップボードを経由して行うようになっており、このクリップボード処理も[アクティブなシートのアクティブなセル]という指定でないとできないようになっているので、少し工夫が必要になります。クリップボードの処理は、.NET FrameWorkクラスライブラリのClipBoardクラスの各機能を使用します。

 まず、FpSpread1クラスのActiveSheetプロパティに追加したシートを設定し、このシートをアクティブにします。次に、アクティブシートのSetActiveCellメソッドで、コピー元のセルを指定します。

With Me.FpSpread1
    .ActiveSheet = newsheet
    .ActiveSheet.SetActiveCell(10, 0)

 そして、ClipboardCopyメソッドを実行し、クリップボードにコピーします。

.ActiveSheet.ClipboardCopy()

 今度は、コピー先のセルをアクティブにします。

.ActiveSheet.SetActiveCell(10, 1)

 そして、クリップボードの中身をペーストします。

.ActiveSheet.ClipboardPaste()

 同じように、他のセルにもクリップボードの中身をペーストします。

.ActiveSheet.SetActiveCell(10, 2)
.ActiveSheet.ClipboardPaste()
.ActiveSheet.SetActiveCell(10, 3)
.ActiveSheet.ClipboardPaste()
.ActiveSheet.SetActiveCell(10, 4)
.ActiveSheet.ClipboardPaste()

 これで、ボタン[シートの追加]を押すたびに、Sheet1と同じシートが追加されていきます。

まとめ

 簡単な機能ですが、独自の表計算機能を自作のプログラムに実装してみました。まだまだ、いろいろな機能をたくさん持っているコンポーネントなので、次回以降、さまざまな機能拡張を紹介していきたいと思います。


 

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング