2012/04/15

Excelの独自型 -hiraxさんへ-

Excelや数値計算に興味ナッシングな人には???な話ですみません。


実は2001年ごろより拝見させていただいているhiraxさんの乳力学


まろの杜でも少し扱って中途半端で止まっちゃってますが、中で述べてるように完全にhiraxさんにインスパイアされてます。だって、サイエンスで遊んでる感じがよくないですか?


アメリカから帰国後、しばらく森イチローはネット上からいなくなってたんですが、つい最近twitterを始めて復活。そしてそのタイミングでちょうどhiraxさんのExcel独自型のつぶやきを拝見したわけです。



目的はたぶんさらに拡張性ある表計算。私も複素数や行列がExcelでさくっと扱えないかといつも苦労するもんで、同じことかなぁと思ってとりあえずそれっぽいものを昼休みに書いて送ってみました。


私的にはhiraxさんとの
ファーストコンタクト!(ドキドキ)


って言っても、ただセルに複素数を入力したら、足し算して複素数の形で返すだけのもので、専用の関数を準備すれば一応動きますが、普通の数字と同じように数式入力して扱うことはできません。てかそもそも、残念ながらExcelのVBAはとてもバージョンが古く、最新のVBと違って演算子などのオーバーロードがないので、型を準備してもコードの共通化はできないです。


で、hiraxさんにはメールで「できないです」ってお送りしたんですが、なーんか「できない」って言われると燃える感じがするのがマッドサイエンティストな私。で、少しでもそれに近づけないかと思って、少しだけバージョンアップしてみました。やったことは、

①複素数セルA1、A2に対し、=A1+A2のように入力
②#VALUE!エラーが出るので、それを検出(Workbook_Changeを利用)
③検出したセルに対し、入力数式を複素数演算用関数を用いた数式に変換
(ここは、数式を解析して汎用に変換する機能が必要ですが、これはたぶんできる)
④変換後の専用関数による数式で計算し、そのまま値を返す

という流れです。残念ながら、自動的に数式は変換され、元の情報は残らないので、hiraxさんの目的にはまだまだ合致してません。可読性、修正性を高めるために、


「#VALUE!のエラーセルはそのままにして、その右に修正数式を入力する」


とすれば、少々冗長ではありますが、少しマシにはなります。


それでも、既存関数の再利用はできないので、関数を書きまくらないといけませんが、オブジェクト指向のない頃のC言語くらいにはなるかな・・・と。





●ちなみに、私のExcel感 

私は少しだけhiraxさんと見解が違って、エンジニアとしてもExcelの基本機能は便利な部分があるもんですから(特にLevenburg-Marquartによる最適化)、逆にExcelを使いやすくしてやろうとして、独自関数を充実させながら使ってます。残念ながら、最適化と独自関数の相性が計算時間の関係であまりよくないので、少し演算量の多いもののときは結局MATLABやVSなどで書いちゃってますが、特に他人が使うときはUIを全部書くのはあまりに大変なので、みんなが慣れ親しんでるExcelをそのままUIにする方法でそこそこうまくいくんですよね。

演算速度だけ割り切れば、最初からエラーファンクションとかベッセル関数とかありますし、その気になれば既存のフーリエ変換も使えます。グラフ描画として少し物足りないところはあるにしても、描画くらいは他のソフトに任せるとして、科学技術系の数値計算を「ちょこっと」やるのには結構便利だなと思うわけです。

| | コメント (0) | トラックバック (0)