ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。

こんにちは。

自作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です。

どうぞよろしくお願いいたします。

A 回答 (4件)

取り合えず、DLL側で引数を受け取れているのか、OutputDebugStringとsprintf(でなくてもいいけど)で、


デバッガ(DebugView等)に出力して確認するとか。
(または、MessageBox)

---
mitarashiさんのリンクされているスレッドの質問者さんのコードは、
> Rtn = Rtn + p{i];
コンパイラを通らないのでは。
    • good
    • 0

#1です。


すみませんが、回答では無いです。
#1の最初のリンクは、末尾のhtmlが、htmになっているために全く別のところにリンクしてしまっているので、再掲します。
http://oshiete.goo.ne.jp/qa/5622852.html

こちらも本件に直接関係無いですが、別のQAの関係で見つけたので載せておきます。
http://supermab.com/wp/excel-dna-%E3%82%92%E4%BD …

ご参考にはならないでしょうが、話の種に...
    • good
    • 0

# ご質問とは関係ないのですが。



> __stdcall

Win64では、呼び出し規約は統一されてるので、既定の__cdeclでも同じです。
(__stdcallと指定しなくとも)
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/07/02 00:29

こちらがお役に立つかもしれません。


http://okwave.jp/qa/q5622852.htm

リンク先は健在でした。
http://www.codeproject.com/Articles/17733/A-C-DL …
当時のサンプルはあまり機能を生かしていると思えないものでしたが、現状は確認しておりません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/07/02 00:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!