ページ 11

AB で作成したDLLを、VBAで利用したいのですが・・・

Posted: 2006年12月19日(火) 23:10
by Take'N.
いつも、参考にさせて頂いております。

ABでDLLを作成することが出来ますが、
作成したDLLを、VBAから利用することが出来ません。

過去ログに、作成したDLLを、エクセルVBAにて利用されている方の
話がありましたが、ABやエクセルのバージョンについての記載を
発見出来ず、現在試行錯誤の最中です。

Ver4.x と 3.x の両方でDLLを作成して見ましたが、
結果は同じでした。
Access VBAで「参照設定」も出来ないし、直接呼び出す方法も試しましたが
「~DLLが見つかりません。~」と言った様なエラーでダメでした。

何か「おまじない」を、忘れてしまっているのでしょうか?

当方の環境は
OS:XP Pro VBA:Access2000 AB:Ver4.x 、3.x
です。

Posted: 2006年12月20日(水) 00:10
by イグトランス
ABにはVBで参照設定して使えるDLLを作れる環境が整っていません。
ABで作成したDLL(関数をExportで公開したもの)をVB/VBAで使うにはDeclareで宣言することになります。
VBのDeclareのLib部分ではDLLの指定にフルパスを指定できるはずです。念のためフルパスで指定してみてはどうでしょうか。

引数は大部分がAB/VBで同じように扱えますが細かい違いに気を付けて下さい。
まず,ByRef/ByValを省略したときの扱いがAB/VBでは異なっているので,AB/VB共に省略しないことをお勧めします。
ABでTへのポインタ型にしている場合は,(一次元配列を渡すつもりでも)VBではTのByRef引数にします。
VBで文字列 (String)を引数にしたければ,VBではByValなString型の引数とし,ABではByValな*Byte型の引数とします。VBが適切に変換をしてくれます。

Variant型や多次元配列を受け渡すことも不可能ではありませんが,ABでは単なる構造体へのポインタとなり,
その操作にはAPI関数を使いVBのように気楽に扱える代物ではなくなっています。
少なくとも現時点ではAB/VB間のやりとりには使わないようにするのがお勧めです。

ご回答ありがとうございます。

Posted: 2006年12月22日(金) 00:39
by Take'N
イグトランス さま。
早速のご回答ありがとうございます。

現状では、やはり、と言うべきかVBAからAB作成のDLLへは、
困難なのですね。
今後のバージョンアップに期待します。

Posted: 2006年12月22日(金) 18:39
by イグトランス
参照設定して使いたいと言うのであればたしかに困難ですが,
Declareで使うほうでしたらVARIANTなどVB特有のものを受け渡ししようとでもしない限り満足に使えます。

Posted: 2006年12月23日(土) 09:09
by teka
ABで作ったDLLを使ってエクセルのユーザーフォームをサブクラス化して
ドラッグアンドドロップされたファイル名を取得することもできます。

私が今も使っているオフィス97ではAddressOf演算子がサポートされて
いないのでこんなことをしたりしています。

2000からAddressOf演算子がサポートされたようですけど。