Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8228 / 13644 ツリー ←次へ | 前へ→

【34434】VBAで指定したEXCEL範囲を外部DLLへ送る方法 stoicker 06/2/2(木) 16:58 質問[未読]
【34435】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... Blue 06/2/2(木) 17:43 発言[未読]
【34436】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... stoicker 06/2/2(木) 18:16 質問[未読]
【34439】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... Blue 06/2/2(木) 18:52 質問[未読]
【34491】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... stoicker 06/2/3(金) 19:38 質問[未読]
【34500】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... Blue 06/2/4(土) 0:35 回答[未読]
【34501】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... 稲葉 06/2/4(土) 2:53 お礼[未読]
【34513】Re:VBAで指定したEXCEL範囲を外部DLLへ送る... stoicker 06/2/4(土) 15:25 お礼[未読]

【34434】VBAで指定したEXCEL範囲を外部DLLへ送る...
質問  stoicker  - 06/2/2(木) 16:58 -

引用なし
パスワード
   失礼致します。

VBAの方で、

Range("A10:A20").Select

と指定した範囲のデータを、Cで書かれた外部DLL(abc.dll)に、
セルひとつにつき、ひとつの変数に入れて送りたいのですが、
プログラムはどのように書けば良いのでしょうか・・・。


例えば上のRangeで指定したA10〜A20に入ったセルのデータを、
a1,a2,a3,a4......a18,a19,a20
という変数にひとつずつ入れて、外部DLL(abc.dll)に送れるようにしたいのですが…


よろしくお願いいたしますm(_)m

【34435】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
発言  Blue  - 06/2/2(木) 17:43 -

引用なし
パスワード
   DLLの関数宣言を書かなければ答えようがないです。

【34436】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
質問  stoicker  - 06/2/2(木) 18:16 -

引用なし
パスワード
   ▼Blue さん:
>DLLの関数宣言を書かなければ答えようがないです。

申し訳ありません。
DLLをコンパイルする前のプログラムは

-------------------------------------------------------------------------
#include "cdll.h"

DLLIMPORT double dll_double_square (double *d,double *a,double *b)
{
  return *d+*a+*b;
}

--------------------------------------------------------------------------

となっています。

DLLの方では、3個の変数を足すようになっていますので、
VB側の方も3個の変数を送るプログラムを教えていただきたいのですが…

よろしくお願いします(><)

【34439】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
質問  Blue  - 06/2/2(木) 18:52 -

引用なし
パスワード
   >例えば上のRangeで指定したA10〜A20に入ったセルのデータを、
>a1,a2,a3,a4......a18,a19,a20
>という変数にひとつずつ入れて
数が全然違いますが。。。

例えば、

1 2 3 4 5 6 7 8 9

と数字があったとき、3つしか選択できないのにどうするのでしょうか?
それをかかれないと誰も解答できませんよ。


とりあえず、
> DLLIMPORT double dll_double_square (double *d,double *a,double *b)
Declare Function dll_double_square Lib "cdll.dll" _
  (ByRef d As Double, ByRef a As Double, ByRef b As Double) As Double
みたいな宣言文になります。

それと、あまり名前をコロコロ変えないでください。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=34168;id=excel
の結果をきちんと報告してください。

【34491】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
質問  stoicker  - 06/2/3(金) 19:38 -

引用なし
パスワード
   昨日質問させて頂いた者です。

blueさんのも参考にしながら、自分なりにプログラムし、
エクセルのデータをVBAから読み取って、
「youso」という変数に配列として入れる事ができました。

ただそこからC言語で書いたDLLに送って、結果を得る方法がわかりません・・・

どうやってDLLを呼び出して、その「youso」の中に入ってるデータを送ればよいのでしょうか・・・。


 youso という配列の中には、

 youso(0)=5 youso(1)=8 youso(2)=1 youso(3)=4 youso(4)=9


 という感じで適当な数字が入っています。

 これをDLLに送って、DLL側で計算した結果を得たいと思っています。

 以下のプログラムのどこに、どういったプログラムを追加すればよいのか教えてください。

 プログラムも載せますので、よろしくお願いいたします。


 それから、名前を変更した件は本当にすいませんでした。
 今後、このハンドルで質問させていただきます。


*********************** VB側 *******************************:

Dim youso(4) As Double

Function goukei(hani) As Double
  Dim ue, shita, retu, i, j, yousosuu As Long
  
  goukei = 0
  ue = hani.Row

  retu = hani.Column
  yousosuu = hani.Rows.Count
  
  For j = 0 To yousosuu - 1
    youso(j) = Sheets(hani.Parent.Name).Cells(ue + j, retu)
  Next j

  goukei = ●●●● 

 
End Function

**************************************************************

 ●●●●の部分に、DLLに「youso」を送信するプログラムを書けば良いのではないかと思っているのですが、どうやったらいいのかわかりません。

 Declare Function dll_double_square Lib "cdll.dll" _
  (ByRef youso As Double) As Double

 という感じで書けばよいのでは・・・というのはわかっているのですが、どうやってもエラーが出てしまいます。


 ちなみにC側のプログラムは

****************************************************************


#include "cdll.h"

DLLIMPORT double dll_double_square (double *d,double *a,double *b,double *c,double *w)
{
  return *d+*a+*b+*c+*w;
}

*****************************************************************

 という感じです。

【34500】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
回答  Blue  - 06/2/4(土) 0:35 -

引用なし
パスワード
   >  という感じで書けばよいのでは・・・
はぁ?
引数の数とか全然違うでしょう?

なんで質問のたびにコロコロ DLL の関数宣言が変わるんでしょうか?

> DLLIMPORT double dll_double_square (double *d,double *a,double *b,double *c,double *w)
なら
Declare Function dll_double_square Lib "cdll.dll" _
  (ByRef d As Double, ByRef a As Double, ByRef b As Double, ByRef c As Dobule, ByRef w As Dobule) As Double

で、

youso(0)=5
youso(1)=8
youso(2)=1
youso(3)=4
youso(4)=9
なら
goukei = dll_double_square(youso(0), youso(1), youso(2), youso(3), youso(4))
とするしかないです。

C言語でああいう宣言をしている限り、配列にする意味もないですけど。


それと、引数の値を変えないのならば、ポインタで渡す意味があまりないです。
普通に
DLLIMPORT double dll_double_square(double d,double a,double b,double c,double w)
{
  return d+a+b+c+w;
}

Declare Function dll_double_square Lib "cdll.dll" _
  (ByVal d As Double, ByVal a As Double, ByVal b As Double, ByVal c As Dobule, ByVal w As Dobule) As Double
としたほうが良いです。

どうしても配列で渡したいのならば、前も書きましたが、
DLLIMPORT double dll_double_square (double *d,int size)
{
  int i;
  double ret = 0.0;
  for ( i = 0; i < size; i++ )
  {
    ret += d[ i ];
  }
  return ret;
}
として、VBAで
Declare Function dll_double_square Lib "cdll.dll" _
  (ByRef d As Double, ByVal size As Long) As Double
と宣言し、
goukei = dll_double_square(youso(0), 5)
のように使います。

これで、また振り出しに戻るような質問がされてきたら、悪いですが私は降りますので。
(ある掲示板にマルチポストもしていたようですから。)

【34501】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
お礼  稲葉  - 06/2/4(土) 2:53 -

引用なし
パスワード
   質問する資格ない人間ですが、
最後に一つだけ聞かせてください。

>VBAで
>Declare Function dll_double_square Lib "cdll.dll" _
>  (ByRef d As Double, ByVal size As Long) As Double
>と宣言し、

この宣言は、VBのプログラムの一番上に書いて、要するに

**********************************************************************

Declare Function dll_double_square Lib "cdll.dll" _
  (ByRef d As Double, ByVal size As Long) As Double

Dim youso(4) As Double

Function goukei(hani) As Double
  Dim ue, shita, retu, i, j, yousosuu As Long
  
  goukei = 0
  ue = hani.Row

  retu = hani.Column
  yousosuu = hani.Rows.Count
  
  For j = 0 To yousosuu - 1
    youso(j) = Sheets(hani.Parent.Name).Cells(ue + j, retu)
  Next j

  goukei = dll_double_square(youso(0), 5)

 
End Function

*****************************************************************

という事になるのでしょうか。


>これで、また振り出しに戻るような質問がされてきたら、悪いですが私は降りますので。
>(ある掲示板にマルチポストもしていたようですから。)


これでもし分からなくても、質問は終わりにします。
なんか、他のBBSでもそうですが、
気分を悪くさせてすいませんでした…。

何かもう僕も自分が何してるのか分からなくなってきてしまって…
いろんな人に叩かれて、これ以上書き込む事はいけないと思っています。

どうなったかの結果は、明日の夕方にプログラムをしているPCが使えるので、
実行してここに書き込ませていただきます。

本当にいろいろありがとうございました。

では失礼します…

【34513】Re:VBAで指定したEXCEL範囲を外部DLLへ送...
お礼  stoicker  - 06/2/4(土) 15:25 -

引用なし
パスワード
   blueさん、先ほどやってみましたが、解決いたしました。

いろいろと怒らすような事して、本当にすいませんでした。

本当に反省しています。

今後、マルチ投稿や名前をコロコロ変えるのも反省して、
ぜったい止めようと思っています。

失礼します。

8228 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free