• 締切済み

自作DLLをエクセルVBAで使用したい

こんにちは。 自作DLLをエクセルVBAで使用したいのですが、知識不足でうまく動かせません。どうぞお知恵をお貸しください。 例えば足し算をするCのプログラムを以下のように作ります。ファイル名は"wa.c"とします。 #define EXPORT __declspec(dllexport) __stdcall EXPORT double wa(double a,double b) { return(a+b); } これをコンパイルして、DLLファイル"test.dll"を作ります。 gcc -shared -o test.dll wa.c エクセルVBAのモジュールには次のように記述しました。 Declare PtrSafe Function wa Lib "test.dll" (ByVal a As Double, ByVal b As Double) As Double ここで作成した関数をワークシート関数として呼び出したいのですが、ワークシート上での返り値は常にゼロになってしまいます。例えば、ワークシートのセルに"=wa(1.2,3.5)"と記入すると、"4.7"を返してほしいところですが、ゼロとなってしまいます。ワークシート関数として正しく動作させるにはどうしたらよいでしょうか? ちなみに、この関数をエクセルVBAのサブルーチンで使うことはできます。例えばこんな感じです。 Sub test() x = 1.2 y = 3.5 Call MsgBox(wa(x, y)) End Sub また、上記の"test.dll"を他のCのプログラムから呼び出すことも正しくできます。 なお、64bitのエクセルを使っています。Cのコンパイラも64bitです。 どうぞよろしくお願いいたします。

みんなの回答

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.4

取り合えず、DLL側で引数を受け取れているのか、OutputDebugStringとsprintf(でなくてもいいけど)で、 デバッガ(DebugView等)に出力して確認するとか。 (または、MessageBox) --- mitarashiさんのリンクされているスレッドの質問者さんのコードは、 > Rtn = Rtn + p{i]; コンパイラを通らないのでは。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1です。 すみませんが、回答では無いです。 #1の最初のリンクは、末尾のhtmlが、htmになっているために全く別のところにリンクしてしまっているので、再掲します。 http://okwave.jp/qa/q5622852.html こちらも本件に直接関係無いですが、別のQAの関係で見つけたので載せておきます。 http://supermab.com/wp/excel-dna-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%9D%E3%81%AE%EF%BC%91/ ご参考にはならないでしょうが、話の種に...

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.2

# ご質問とは関係ないのですが。 > __stdcall Win64では、呼び出し規約は統一されてるので、既定の__cdeclでも同じです。 (__stdcallと指定しなくとも)

totetote000
質問者

お礼

コメントありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

こちらがお役に立つかもしれません。 http://okwave.jp/qa/q5622852.htm リンク先は健在でした。 http://www.codeproject.com/Articles/17733/A-C-DLL-for-Excel-that-uses-Arrays-and-Ranges 当時のサンプルはあまり機能を生かしていると思えないものでしたが、現状は確認しておりません。

totetote000
質問者

お礼

ありがとうございます。 いろいろと参考になりそうなサイトですが、今の問題の解決につながる記述は見つけられませんでした。