1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Visual BasicAdvent Calendar 2021

Day 24

VBAの関数型風プログラミング用のライブラリのその後

Posted at

2019年のアヴェントカレンダーの記事
VBA-Functional-Libraryという自作の関数型プログラミング 風のライブラリの記事を書きました。

これを使って表計算のシートの中でVBAの関数をテストできる仕組みを作りました。
ワークシート関数とVBAの関数は別物なので、VBAの関数の引数をシート内で変更し実行する、
仕組みは珍しいんじゃないかと思います。

いかの画面はgithubに置いているVBA-Functional-Library
の中の「VBA-Functional-Array.xlsm」のシートの画面です
それぞれテストの実行前と実行後です

before_calc.png

after_calc.png

左上の「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は配列などを文字列に変換する関数で各要素の型を調べて再帰的に文字列化しています

順に動作を書き上げると

  1. 各行からfunction列 からarg5列までの値を配列として抜き出し、後ろのほうの空白の要素を削除する
  2. その配列をevalAで計算する
  3. 計算結果をtoString関数で文字列にした結果をactual列に書き込む
  4. variable列に文字列がある場合それをキーとして計算結果を辞書に書き込む
  5. check列にはactual列をexpected列を照合するワークシート関数が入っているので自動的に"fail"か"pass"が表示される

variable列にある文字に_(アンダーバー)をつけるとそれ以降の行から、参照できるので、配列の配列なども計算できます

objectの代入と参照は、VBA上では、式にSetをつける必要があるので、
ともに文字列は__(アンダーバー2文字)を先頭につける規約にしています
コレクションと辞書に対しては、mkClcやmkDicという生成する関数をつくり、toStringを拡張して利用できるようにしました。他のobjectも同様の処置で利用可能になるかもしれません

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?