2019年のアヴェントカレンダーの記事に
VBA-Functional-Libraryという自作の関数型プログラミング 風のライブラリの記事を書きました。
これを使って表計算のシートの中でVBAの関数をテストできる仕組みを作りました。
ワークシート関数とVBAの関数は別物なので、VBAの関数の引数をシート内で変更し実行する、
仕組みは珍しいんじゃないかと思います。
いかの画面はgithubに置いているVBA-Functional-Library
の中の「VBA-Functional-Array.xlsm」のシートの画面です
それぞれテストの実行前と実行後です
左上の「eval」「clear」のボタンで実行前・実行後の各画面に切り替えられます
テーブルの各列の内容は以下の通りです
項目 | 内容 |
---|---|
check | ctualと expected の照合の内容 |
assert | actualと expected の照合の種類 |
actual | 実際の計算結果 |
expected | あるべき計算結果 |
variable | 変数 |
function | 関数名 |
arg1 | 引数1 |
arg2 | 引数2 |
arg3 | 引数3 |
arg4 | 引数4 |
arg5 | 引数5 |
statement | VBAの記述に直したもの |
内部的な実装はevalAとtoStringという二つの関数のおかげで比較的素直にできていると思います。
evalAは配列の先頭を関数名、それ以降を引数と解釈して計算する関数です
toStringは配列などを文字列に変換する関数で各要素の型を調べて再帰的に文字列化しています
順に動作を書き上げると
- 各行からfunction列 からarg5列までの値を配列として抜き出し、後ろのほうの空白の要素を削除する
- その配列をevalAで計算する
- 計算結果をtoString関数で文字列にした結果をactual列に書き込む
- variable列に文字列がある場合それをキーとして計算結果を辞書に書き込む
- check列にはactual列をexpected列を照合するワークシート関数が入っているので自動的に"fail"か"pass"が表示される
variable列にある文字に_(アンダーバー)をつけるとそれ以降の行から、参照できるので、配列の配列なども計算できます
objectの代入と参照は、VBA上では、式にSetをつける必要があるので、
ともに文字列は__(アンダーバー2文字)を先頭につける規約にしています
コレクションと辞書に対しては、mkClcやmkDicという生成する関数をつくり、toStringを拡張して利用できるようにしました。他のobjectも同様の処置で利用可能になるかもしれません