2017年7月5日水曜日

クソVBAをやってる話

VBAでラムダのようなものを使いたくて試行錯誤中

まずは引数として渡せる関数の再現
試行錯誤の履歴

・Application.Run()  … 名前文字列で指定する 重め
                参照引数が使えない
                Application ってどうなの

・CallByName()    … 名前文字列で指定する 重め
                参照引数は使える
                オブジェクトのメソッドしか呼べない
                
・イベント        … 汎用的に呼べるイベントを作ってやることで再現 軽め!
                戻り値はない エラーを呼び出し元に Raise できない
                withEvents のメンバにセットした値を外部に持ち出せば、
                 対応したイベントを呼び出すことができる

イベントに光を見出して、文字列コードをラムダにして動的モジュールを生成していくようにした。
LINQのオペレータ的なものを、Skip,  Take, Select, Where, SelectMany, くらいまで作成した。
しかし for each に対応させられずに、Do Loop で回す感じになっていて、不満があった。

IEnumVariant を V-table ごとメモリ上に構築してしまえばよいことを知る。
APIを使用することをなぜか拒んでいたが、解禁する。つまらないこだわりだったと思う。
VBAのオブジェクトはCOM関係そのものということに気づく。

で、ついでにここでこれに気づいてしまう…

・DispCallFunc()    … AddressOf で関数ポインタを得て、使用できる。
                参照引数も使用できる。型も使用できる。
                が、引数指定のクセが強く、たやすくハングアップする。これは問題。
                なやむ。
                また、オブジェクトのメソッドを V-table のオフセットで指定実行できる。

そこからVBAのクラスは IDispatch  を継承しているということに気づく。
ITypeInfo を作成すればいろいろいじれる。
ただ、本当に DispCallFunc() の引数はセンシティブで、試行錯誤しまくった。情報もないし…。

また、クラスメソッドを呼ぼうとしたときに、第一引数が戻り値になってしまうという謎の現象に遭遇。
回避できない。
同じことで悩んでる外人さんもいた。
どうしたものか

そこで今、このページを発見。
https://msdn.microsoft.com/en-us/library/ms221141(v=vs.85).aspx
うおぅ!!
今までやってた煩雑なことが、APIでできそう???
と興奮すると同時に徒労感が。

いまここ。


0 件のコメント:

コメントを投稿

ニューラルネットやってみてる

最近ニューラルネットやってみてる 理屈を学ぼうと思って、まずはオブジェクト的に作ってみてる (ベクトル化とかは後回しで) sigmoid, tanh, ReLU MSE, cross entorpy あたりを小規模にいじってみてます でも今 soft max の逆伝...