C++ でXLLアドインを作る with XLW−3〜関数作成&XLWについて〜

過去の記事

前回まではサンプルソリューションの解説を主に行ったので、今回は実際に自分で関数を作成してみます。まずはTemplateExtractorsでサンプルソリューションを作成し、それを立ち上げて下さい。以下、そこに追記していく形で自作関数を作成します。

関数の宣言

次に行列の各要素を2乗して返却する関数を作ってみます。XLLプロジェクトのcppinterface.hに以下のような記述を追記し関数を宣言します。場所は元から入っているEchoShort関数の下あたりで。

MyMatrix //calculate squared matrix
SquaredMatrix(MyMatrix x // matrix
			  );

上のようにコメントも合わせて書いてやるとExcelのダイアログボックスからこの関数を呼び出したときにきちんとコメントが表示されます。引数・返り値のMyMatrix型については後述〜。

関数の定義

次にsource.cppへと移動して以下のように各要素を2乗する関数を作成します.MyMatrixがどういうインターフェイスを持っているのかはIDEの補完機能を使えばだいたいわかるでしょう。

MyMatrix SquaredMatrix(MyMatrix x)
{
	MyMatrix result(x);
	for(unsigned int row = 0; row < x.rows(); row++){
		for(unsigned int col = 0; col < x.columns(); col++){
			result(row,col) = x(row,col)*x(row,col);
		}
	}
	return(result);
}

ここまで来たらソリューションをビルドし、XLLを完成させます。そして、実際にXLLを使ってみると・・・

のようにSquaredMatrix関数にセルの範囲を引数として渡すと、引数の各要素を二乗して返してくるのがわかります。ちなみに関数のダイアログボックスからSquaredMatrix関数を選択してやると

のようにちゃんとコメントで記載した内容が表示されます。ここまで来れば一通りのことができるようになるかと思います。

XLWについて

最後に備忘録を兼ねてXLWについて調べたことをメモっとく。

MyMatrix型について

MyContainer.hの中でtypedefされている。そこに書いてある注意書き

/*
    everyone has their favoured matrix and array class
    You should alter this file to typedef your favourite of each to MyMatrix and MyVector.

    For MyMatrix it is assumed that a constructor with MyMatrix(unsigned long, unsigned long) exists
    and that an element can be accessed via thisMatrix[i][j]
*/

から、このMyMatrixクラスは上に書いてあるインタフェースさえ持たせればなんでもOKですぜ!ということ。その下あたりにはBoostライブラリを入れさえすればそれの行列型もすぐ使えるような形になっていることがわかる。デフォルトではMJMatrixクラスがtypedefされているので、上の例ではMJMatrixのインターフェイスを使っていたということ。

ライブラリ名について

XLLプロジェクトのヘッダーファイルcppinterface.hの中にある

//<xlw:libraryname=MyTestLibrary

という箇所を変更すると、ライブラリの名前を変更することができる。

CellMatrixクラス

今回ここで使用したデフォルトのMyMatrixクラスの場合、引数に文字型を入れるとアウトになるけど、この他にもCellMatrixというクラスが用意されていてこれだといろいろな型を引数に取れるようになってる。


【参考リンク】