Microsoft Visual C++ 2010 Express EditionでExcelから呼び出せるDLLを作る
すぐ忘れそうなので超丁寧にメモ。
VC++を起動後、「ファイル」→「新規作成」→「プロジェクト」と選択
「Win32 プロジェクト」を選択して適当に名前を付けて保存。ここでは名前、ソリューション名共に”dll_vba”とした。
「次へ」を押下して、「DLL」を選択して「空のプロジェクト」にはチェックを入れて完了を押下。
「空のプロジェクト」を入れないと余計なもんがゴチャゴチャ入ってくる。
ソースファイル&ヘッダーファイルを追加する。それぞれファイル名はmain.cppとmain.hとした。
次にDLLの関数として外から呼び出し可能な物一覧を書いておくdefファイルを作成したいのだけれどもVC++2010では該当する項目がなかった。
しょうがないので、cppファイルを選んで保存する時にファイル名の拡張子を.defにしておいた。
あとは、それぞれのファイルに以下のようなコードを書いた。
とりあえず足し算関数を定義。呼び出し規約は__stdcallを使わないとだめっぽい。
main.cpp
#include <windows.h> #include "main.h" double __stdcall Add(double x,double y) { return(x+y); } BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { return TRUE; }
main.h
#ifndef __main_h__ #define __main_h__ //Export用関数 double __stdcall Add(double x,double y); #endif
dll_vba.def
LIBRARY "dll_vba"
EXPORTS
Add
次に、モジュール定義ファイルをリンカがちゃんと見てくれるよう「プロジェクト」を右クリック→「プロパティ」で辿り着いた先で以下の画面のように設定。
あとはコンパイルさせればOK。
うまくコンパイルできていると「$プロジェクト保存フォルダ$\dll_vba\Debug」にdllができている。
同フォルダに適当なExcelファイル(私のバージョンは2007)を作成して標準モジュールに以下のように記述。
画面にはボタンを一個置いておいて、そのボタンを押下したらマクロが実行されるようにしてる。
'DLLから呼び出して関数を宣言しておく。 Private Declare Function Add Lib "dll_vba.dll" _ (ByVal x As Double, ByVal y As Double) As Double Sub ボタン1_Click() 'カレントディレクトリをこのフォルダに ChDir ThisWorkbook.Path 'DLLで計算させた結果を画面に表示 MsgBox Add(3, 5) End Sub
もちろんディレクトリの変更は一回でいいんで本来auto_open関数に書くべき、今回は1ファイルで全部済ませたかったのでこうしてる。
で、実行すると
こんな感じでちゃんと3と5を足した結果が返ってくる。
ソリューションファイル+Excelファイルはここ(zip)に置いておくのでご自由にどぞ〜。
(無保証・やたらでかい一時ファイルのようなものは削除済)
【参考にしたサイト】
VC++.NETで外部DLLの作り方
Excelのアドイン関数を.dllに書いてみる
DLL作成方法・呼出方法