はじめに
業務やある用途に特化した計算機能を持つプログラムの開発を求める声は意外と多いのではないでしょうか。計算機能だけを取れば、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」です。
FpSpreadコンポーネントの設定
このFpSpreadコンポーネントは、プロパティとデザイナでほとんどの初期設定を行うことができます。コンポーネントをフォームに配置した時点では、500行×500列のシートが1枚組み込まれた状態になっています。これを、FpSpreadコンポーネント全体のプロパティやシートのプロパティを操作して、用途や業務固有の形態に修正していきます。
FpSpreadコンポーネントでは、シートは[Sheet]オブジェクト(コレクション)になっていますので、シート単位で外観の設定を行うことができます。
スキンの変更
シートの配色を変更するには、タスクトレイから[スキンの編集]を選び、[シートスキンエディタ]を起動します。[標準]ページではあらかじめ設定されている配色を、[カスタム]ページでは独自にカスタマイズした配色を選ぶことができます。ここでは、[Professional1]を選んでみました。
行列数の変更
シートの行列数を変えるには、シート単体のプロパティを変更します。
これには、まずFpSpreadコンポーネントの[Sheets]プロパティをクリックし、[SheetView]コレクションエディタを起動します。そして、[ClumnCount]と[RowCount]プロパティの値を操作します。ここでは、11行×5列のシートに変更します。
列見出しを変更する
デフォルトでは、シートの行列の見出しはExcelのようになっています。特定の業務にしか使用しないという前提で、見出しも変更してみます。
FpSpreadコンポーネントのタスクトレイをクリックし、[デザイナ]を選ぶと、[SPREAD for .NETデザイナ]というウィンドウが起動します。ここから、変更したい見出しをクリックし、プロパティウィンドウにある「Label」の値を好きな文字に変えます。これは、行列の見出しのどれも同じ操作で変更できます。
ここでは、列見出しを人名に、11行目の見出しを[合計]に変更しています。そして、デザイナのツールバーにある[適用]ボタンを押すと、変更がコンポーネントに反映されます。
SUM関数の埋め込み
今度は、[合計]欄に、行1から10までの合計値を算出する関数を組み込みます。これもデザイナで行います。
まず、デザイナのプロパティウィンドウのオブジェクトリストから[シート]を選び、[Calculation]の[ReferenceStyle]が[A1]になっていることを確認します。この形式になっていれば、行列見出しの名前が変わっていても、数式でのセルの参照をExcelのように[A1,A2,A3...]というセル番地で参照できるようになります。
次に、[山田][合計]のセルをクリックし、デザイナの[数式の編集]をクリックします。
[数式エディタ]が起動します。[数学]をクリックし[SUM]をダブルクリックすると、[数式]欄に「SUM()」と入力されるので、[適用]ボタンを押します。
セルの値を編集する欄に「=SUM()」と入力されるので、()の中に「A1:A10」と入力します。Excelのようにセル範囲を""で囲む必要はありません。これで、[山田][合計]のセルには、「=SUM(A1:A10)」と関数式が入力されます。
そして、[数式または値の設定]ボタン(チェックマーク)を押すと、この式が確定します。
また、デザイナのプロパティウィンドウにある[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
列挙型のメンバで指定します。
メンバ | 説明 |
None | 列ヘッダも行ヘッダも含めません。 |
ColumnHeadersCustomOnly | 列ヘッダのカスタムヘッダのみを含めます。 |
RowHeadersCustomOnly | 行ヘッダのカスタムヘッダのみを含めます。 |
BothCustomOnly | 列ヘッダと行ヘッダのカスタムヘッダのみを含めます。 |
シートをもう1枚追加する処理
では、同じシートをもう1枚追加する処理を、今度はコードから行ってみます。シートの作成は、SheetView
オブジェクトを作成してSheetViewCollection
コレクションに追加する、という手順で行います。
コレクションに追加する前にシートの設定を行います。以降、デザイナで行った内容をコードから行ってみます。
- シートの作成
- シート名と行列数の設定
- 行列見出しの変更
- スキンの設定
-
SUM
関数の組み込み - セルのコピー&ペースト
シートの作成
新しいシートは、SheetView
クラスのコンストラクタで作成します。引数はありませんが、コンストラクタが返すインスタンスへの参照を変数で受け取っておきます。
Dim newsheet As New FarPoint.Win.Spread.SheetView()
後は、この変数名で各種設定を変更します。
シート名と行列数の設定
シート名はSheetName
プロパティで、行列数はそれぞれRowCount
、ColumnCount
プロパティの値で指定します。
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と同じシートが追加されていきます。
まとめ
簡単な機能ですが、独自の表計算機能を自作のプログラムに実装してみました。まだまだ、いろいろな機能をたくさん持っているコンポーネントなので、次回以降、さまざまな機能拡張を紹介していきたいと思います。