ドキュメントを読んでいるとこんな記事が
カスタム関数から複数の結果を返す - Office Add-ins | Microsoft Learn
そういえば、Excelは2020年あたりからスピルが使えるようになったんだった。
動的配列数式とスピル配列の動作 - Microsoft サポート
スピルについてはちゃんと理解していないけど。
昔は配列数式というのがあって(Ctrl+Shift+Enterで入力するやつ)行列計算みたいな配列を扱えるんだけど、挙動がちょっと融通が利かなくて使いにくかった。
それを動的にお手軽に使えるようになったというイメージであろうか。
これを使うと、例えばたくさんの演算をするときにweb上のやり取りが減って処理速度が上がったりしないかなと思ったので試してみることにしよう。
A列とB列の数値の和をC列に出力するスピル関数を作ってみる。
引数についてはここを見るとnumberで受け取ればよいっぽいかな。
Excel カスタム関数のオプション - Office Add-ins | Microsoft Learn
戻り値は単純に配列で返せばよいみたいだ。
ということで、関数を作ってみた。
/** * 配列同士を加算する * @customfunction * @param first First number * @param second Second number * @returns The sum of the two numbers. */ export function addArrayTest(first: number[][], second: number[][]): number[][] { let result:number[][]=[]; for(let i=0;i<first.length;i++){ result.push([first[i][0]+second[i][0]]); } return result; }
配列を返す関数のテスト · st-func/st_func_addin@b1e0b5d · GitHub
うまくスピルで足し算ができた。
そういえば、前の記事で関数名をスネークケースで書いたけど、TypeScriptのコード規約だと関数名はキャメルケースなのね。しかしExcelで表示されるときは全部大文字になっちゃうのが若干不満・・・。キャメルケースで表示してほしいなあ。
さて、これで計算速度の比較ができる、と500個くらいの足し算をしようとしたところ・・・ 今日は通信環境がいいのか、1つずつの計算も一瞬でできてしまった・・・。 ということで、速度検証はできなかったけど、たぶん配列のほうが早いんじゃないかあなあ。
しかし、もっと時間かかる計算させようと思って、足し算の個数を20000行にしたら、セルが多すぎますというエラーが出た。 計算量が多すぎると配列にするとこれでエラーになるかもしれないわけか。
ちなみに、検証したところ、足し算で、[=STF.ADDARRAYTEST(A1:A5000,B1:B5000)]は計算可能で、[=STF.ADDARRAYTEST(A1:A5001,B1:B5001)]はNGだった。 5000が一つの目安らしい。引数1つあたり5000ずつなのか、合計で10000なのかはわからないけど。
とりあえず速度はサーバーがちゃんとしてれば意外と出ることが分かったので、ちゃんと作ったらそこそこ実用的になるかも??