Excel VBA質問箱 IV

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

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


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

【34168】EXCELデータを外部プログラムへ 稲葉 06/1/27(金) 16:12 質問[未読]
【34170】Re:EXCELデータを外部プログラムへ Blue 06/1/27(金) 16:39 回答[未読]
【34171】Re:EXCELデータを外部プログラムへ Blue 06/1/27(金) 16:48 回答[未読]
【34189】Re:EXCELデータを外部プログラムへ 稲葉 06/1/28(土) 4:41 お礼[未読]

【34168】EXCELデータを外部プログラムへ
質問  稲葉 E-MAIL  - 06/1/27(金) 16:12 -

引用なし
パスワード
   失礼します。どなたか教えてください・・・
少し長くなりますが、よろしくお願いいたします。


EXCELのセルに5つの適当な数字(「5,2,6,3,4」こんな感じです)を縦に順番に入力しまして、
それを、VBAを使って、外部のプログラム(恐らくC言語だと思います)にデータを送り、
その計算結果を、EXCELに表示させるというプログラムを組みたいのですが、
どなたか良い知恵をお貸しください・・・

上記の説明ではわかりにくいので、もう少し具体的に書かせていただきます。


以下が、EXCELのとあるセルに打ち込んだ命令です。

=dll_double_square(B10:B14)

ここでは、B10〜B14のセルに、先ほどの適当な数字を入力しています。


EXCELを起動させて、Alt+F11でVBAを起動させ、
その中に現時点で以下のようにプログラムしています。


Declare Function dll_double_square Lib "cdll.dll" _
  (Dim d(0 To 4) As Double) As Double


ちなみに、これではエラーが出ています・・・


"cdll.dll"というファイルは、「WINNT」というフォルダの中の、
「system32」というフォルダに入れてあります。


この「cdll.dll」というファイルをコンパイルする前のプログラムが、以下となっています。


#include "cdll.h"

DLLIMPORT double
dll_double_square (double *d)
{
 return d[0]+d[1]+d[2]+d[3]+d[4];
}


このプログラム(cdll.c)をコンパイルして、cdll.dllを作成しました。


また、cdll.c の中に、


#include "cdll.h"

というコマンドがあるのですが、
これが「cdll.h」をインクルードしているのか良くわかりません・・・


ただ、一応「cdll.c」と同じフォルダの中に、「cdll.h」も存在していて、
そのプログラムの中身は


#ifndef cdll_h_included
#define cdll_h_included

/*
* When building the DLL code, you should define BUILDING_DLL so that
* the variables/functions are exported correctly. When using the DLL,
* do NOT define BUILDING_DLL, and then the variables/functions will
* be imported correctly.
*
* You need to be using egcs-1.1.1 or newer.
*
* Building the DLL:
* - define BUILDING_DLL, which defines DLLIMPORT __attribute__((dllexport))
* Building the client code:
* - DO NOT define BUILDING_DLL, which defines DLLIMPORT to be one
*  __attribute__((dllimport))
*/

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

DLLIMPORT double
dll_double_square (double *);

#endif /* cdll_h_included */


となっています。


以上が詳細な説明なのですが、何とか伝えられるように書いたつもりですが、
見にくい文になってしまい、申し訳ありません。


結論から言うと、エクセルに入力した数値を、「cdll.dll」に移し、
その結果をエクセルに表示させるようにしたいのですが・・・


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

【34170】Re:EXCELデータを外部プログラムへ
回答  Blue  - 06/1/27(金) 16:39 -

引用なし
パスワード
   とりあえず
> DLLIMPORT double
> ll_double_square (double *);
ですので、
> Declare Function dll_double_square Lib "cdll.dll" _
>  (Dim d(0 To 4) As Double) As Double
ではなく
Private Declare Function dll_double_square Lib "cdll.dll" (ByRef d As Double) As Double
と宣言してください。
# そもそも Dim は使えない。

VBAであれば、
Sub test()
  Dim d(0 To 4) As Double
  Dim r As Double
  
  d(0) = 1.3
  d(1) = 3.9
  d(2) = 5.2
  d(3) = 10.3
  d(4) = -0.5
  
  r = dll_double_square(d(0))
End Sub

とすれば使用できます。

> =dll_double_square(B10:B14)
のように
ワークシート関数として使用できるかはワカリマセン。

【34171】Re:EXCELデータを外部プログラムへ
回答  Blue  - 06/1/27(金) 16:48 -

引用なし
パスワード
   ちなみに、
> DLLIMPORT double
> dll_double_square (double *d)
> {
>  return d[0]+d[1]+d[2]+d[3]+d[4];
> }
という使い方はあまりよろしくないです。
d は配列の先頭を指していますが、C言語ではそのは配列のサイズはワカリマセン。
たとえば、dll_double_squareに 配列数が 3 のやつを渡すと、アプリケーションエラーになってしまいます。

こういうときは、ついでにサイズも渡すようにします。
# または、多少高度になりますが、Variant型または、SafeArray型として渡す。

一例)
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;
}

【34189】Re:EXCELデータを外部プログラムへ
お礼  稲葉  - 06/1/28(土) 4:41 -

引用なし
パスワード
   ▼Blue さん:

丁寧なご回答、ありがとうございます(><)
ほんとに助かりました。

明日、大学に行って早速試してみたいと思います!

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

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