こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

投稿日時 - 2012-06-22 01:02:58

QNo.7547531

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

取り合えず、DLL側で引数を受け取れているのか、OutputDebugStringとsprintf(でなくてもいいけど)で、
デバッガ(DebugView等)に出力して確認するとか。
(または、MessageBox)

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

投稿日時 - 2012-07-08 07:31:07

ANo.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/

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

投稿日時 - 2012-07-05 22:11:41

ANo.2

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

> __stdcall

Win64では、呼び出し規約は統一されてるので、既定の__cdeclでも同じです。
(__stdcallと指定しなくとも)

投稿日時 - 2012-06-23 08:12:09

お礼

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

投稿日時 - 2012-07-02 00:29:20

ANo.1

こちらがお役に立つかもしれません。
http://okwave.jp/qa/q5622852.htm

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

投稿日時 - 2012-06-22 22:15:13

お礼

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

投稿日時 - 2012-07-02 00:32:12

あなたにオススメの質問