- ベストアンサー
VBA DLLワークシート関数配列引数について
こんばんわ Cで書かれたDLLをワークシートで呼んで計算に使用しているのですが 配列を引数に取る関数にワークシートの値(B1:B5みたいな感じ)を渡したいのですが渡せなくて困っています。 VBAのFunctionから呼んでデバックをかけてみたら、たとえば「B1:B5」を渡すとRangeオブジェクトとして渡されているみたいなんですがこれをなんとか配列として渡したいです。 ↓DLLの関数例です __declspec(dllexport) LONG __stdcall SumTest(LONG *p, LONG psize) { LONG i = 0; LONG Rtn = 0; for(i = 0; i < psize; i++) { Rtn = Rtn + p{i]; } return Rtn; } こんな感じのをセルA1に「=SumTest(B1:B5,5)」にすると「#Value」と表示されています。 ↓デバックに使用したVBAのFunction Function Test(p As Variant, ByVal psize As Long) As Long Test = SumTest(p, psize) End Function 配列を引数に取らないものは、正常に呼べるので問題ないです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
下記に、Excelのセル範囲をc++のDLLに渡す事例がありますが、ご参考になりませんか。 http://www.codeproject.com/KB/office/A_C___dll_for_Excel.aspx {=sumonetoarray(B3:F7)} と、配列数式としてワークシートで使用するサンプルブックがダウンロードできます。 C++のDLLは、Rangeオブジェクトを扱えるように作成する必要があります。その方法は、リンク先でご覧下さい。 >これをなんとか配列として渡したいです。 は、無理なんじゃないでしょうか。
その他の回答 (2)
- mitarashi
- ベストアンサー率59% (574/965)
#2です。 考えてみたら、VBAのユーザー定義関数の中から、C++のDLLを呼ぶのではどうでしょうか。 手元に昔お勉強で作成したDLLがあったのでやってみましたが、ユーザー定義関数として、使える様です。 ただし、この例ではC++側は、お勉強のためSafeArrayを用いております。 Private Declare Function numArray2 Lib "test.dll" (s() As Long) As Long Function test(target As Range) As Long ReDim x(1, 1) As Long x(0, 0) = target.Cells(1, 1).Value x(0, 1) = target.Cells(1, 2).Value x(1, 0) = target.Cells(2, 1).Value x(1, 1) = target.Cells(2, 2).Value test = numArray2(x()) End Function
- piroin654
- ベストアンサー率75% (692/917)
なかなかレスがつかないようでですが。 もう解決しましたか。 DLLのCのソースからSumTestの引数はLong 型の数値で、SumTest(B1:B5,5)とわたし ても型の違いで何もおこらないのはお分かり だと思います。希望の主旨はわかりますが SumTestはあくまでもDLL内での計算結果を Long型の数値を返すだけで、文字列を 送り込んでもどうしようもありません。 Cのソースはある数値を起点として(この 場合は2ですが)、 ある数値にループする間に加算していく 仕様です。戻りは最終結果です。もし 連続値として取り出したいならば、 たとえばSumTest(2,5)のような最終結果 を求める場合は、1から5までをSumTestに 順次代入し、戻り値を受け取る仕様の 関数を作る必要があります。 それを配列に収めてもいいでしょうし、 あるいはイミディエイトウインドウに 出力して内容を確認してもいいのでは と思います。DLLを使用するという 意義はあります。もう一度Cのソースを ながめて、戦略を練ってください。 わからないところはお手伝いします。
お礼
ご回答ありがとうございます。 実は解決の見込みかなり低いです・・・ どうにかラップ関数をつくらずにExcelで用意されたほかの関数と同じようにコールしたいのですが・・・ sum関数とかは、「B1:B5」とか渡すとセルの値から一時的に配列を作って参照を渡しているのかと思っていたのですが大間違いでした・・・ ネットでもDLL関数をワークシート関数として使用しなおかつ配列を渡しているものを見たことないのですがご存じないですか? 私ももう少しがんばってみます。 ありがとうございました。