![]() ![]() |
![]() |
|
TOP
|
|
みなさんこんにちは。ワークシート関数プラグイン担当のHです。 今回で、ワークシート関数プラグインのレッスンは最後ですが、今までのレッスンに比べ、ボリューム的にもその重要さからも大事なものですので、是非、理解してください。頂上まであと少しです・・・ それでは、最後までよろしくお願いします Lesson7では、セル範囲参照を引数に取った場合に、そのセル範囲内の各セルデータへのアクセス方法について説明します。 このLessonが終われば、SUM関数等の実装がどのようにされているのかが理解できます。 今まで同様、サンプルとして用意している関数で説明します。 三四郎にはSumStep関数という便利な関数があり、この関数は「3つ以上の引数をとり、第1引数を列ステップ数、第2引数を行ステップ数、第3引数以降に数値やセル範囲を指定して、数値の合計を返す」というものです。ただし、「引数がセル範囲の場合は、列ステップ数や行ステップ数で指定された数の分だけセルを飛ばして計算します。」 ![]() 今回は、サンプルということもあり、引数の個数は3つに限定し、第3引数はセル(範囲)参照のみとして実装しています。 では、実装を見てみましょう。ちょっと長くなったので、途中で半分に分割しています。
9行目を見るとFunctionインターフェースを実装するのではなくて、FunctionArg3というクラスを派生していることが分かりますね。これは、続く「付録」でも説明しますが、3つの引数をとる関数の抽象的な実装をしてくれているクラスです。SumStepの実装を見ても分かるように、getMinArgc、getMaxArgc、getTypeメソッドがなく、これらをFunctionArg3xが実装してくれています。 10行目からが、実際の関数実装です。 12行目から21行目までで、第1引数の列ステップ数、第2引数の行ステップ数、そして第3引数の計算対象のセル範囲を取得しています。 そして、26行目で、取得した行列ステップ数とセル範囲を元にしてAccessクラスを作成しています。 ちょっと説明が前後しますが、Accessクラスは45行目のCellAccessインターフェースを実装したクラスで、これをExprValueクラスのaccessRangeメソッドの引数に渡すと(29行目)、各セル毎にaccessメソッド(62行目)がコールバックされる仕組みになっています。 そして、対象セル範囲内の全てのセルに問題なくアクセスできた場合はtrueを返し、途中で中断された場合はfalseを返します。ここでは、対象セル範囲内にエラー値を見つけた場合に、それ以降のアクセスを中断しています。(79行目)
残りは、Accessクラスの説明です。 先ほどと説明が重複しますが、CellAccessインターフェースは62行目のaccessメソッドのみからなっていて、これをAccessクラスが実装することで、各セル毎の処理がコールバックされます。 63行目から70行目で、SumStepのステップ処理について実装しています。 72行目で、セルデータの値(val)を取得し、その型が数値であれば数値の和をとり(74〜76行目)、エラー値であればそのエラー値を覚えておき、falseを返すことでセル範囲アクセス処理を中断しています。(77〜79行目) エラー値以外の場合は、trueを返すことでセル範囲アクセスを続行します。(81行目) いかがでしたか? 要は、ExprValueクラスのaccessRangeメソッドと、CellAccessインターフェースを実装すればいいということです。CalcArkが標準で提供している組み込みワークシート関数プラグインに含まれるSUMやAVERAGE関数等は、おおよそこの手法で実装されています。 以上、4回に渡りワークシート関数プラグインの作成方法を見てきました。 表計算アプリケーションでは、ワークシート関数を上手に使うことで、基本的な帳票は十分作成できます。使い方によっては、本来の使われ方以上の威力も発揮することが可能です。そして、そのワークシート関数を自分の好みによって作成することができるとなると、これほど面白いことはないでしょう。使い方によっては、2次方程式の解を求める関数等、教材としても利用できるのではないでしょうか。 みなさん、いろいろ試して楽しんでみてください。 圧縮ファイル
jp.co.justsystem.choco.model.expr パッケージ
jp.co.justsystem.choco.model.function パッケージ
<<その3へ 付録へ>> |
|||||||||||||||||||||||||
|
TOP
|
||
|
|
||