EXCELのVBAより*.exeファイルや*.dllファイルを呼び出して 動作させる事が出来ます。 色々なサイトを見てみると解説は沢山ありますが実際の コードをあまり見かけないのでアップロードします 「とりあえず動いた」レベルなので間違えがあるかもしれません ■私の環境 EXCEL2013 - 64ビット Visual Studio 2005 pro EXCELは古くても大丈夫です。VSもexpressでも大丈夫と思います 絶対パスをVBAとsample_dll.cppに書き込んでいます。 それぞれの環境に合わせて変更してください。 ■コンパイル(圧縮ファイルはソースのみです) Hello.exe 標準出力に文字列を出すアプリ。VBAから起動して 標準出力の文字列を変数で取得することが出来ます VBAからexeを呼び出すたびにプロセス起動されます 同じPCでテストする限りはディバック版で良いです sample_dll VBAからDLLを呼び出して結果を返すサンプルDLL EXCELが32ビットなら必ずDLLは32ビットでビルドする (win32) EXCELが64ビットなら必ずDLLは64ビットでビルドする (x64) これを間違えるとDLLを置いているけれど、ファイルが見つかりません というエラーがでたり、不用意にEXCELが落ちます。 DLLですのでEXCELと同一プロセスの1DLLモジュールとして動きます DLLでPageFaultが発生するとEXCELごと終了します。 ■EXCELからのDLL呼び出し 変数の値渡し、値受け取り、文字列受け取り、配列渡しなどのケースの サンプルです。 DLLの中で配列の値をファイル出力する事も行っています。 ■実行 EXCELのシートの「Hello」ボタンを押すと順番に動作して、 メッセージボックスが現れます。 最後にファイル「fname.txt」を生成します ■DLLのディバック EXCELを終了しておいて、VisualStudioでソース上にブレークポイントを設定する F5で実行すると起動EXEを聞いてくるダイアログが出るので、 c:\program files\.....の中のexcel.exeを指定する。 すると、VSよりEXCELが立ち上がるり、「Hello」ボタンを押してVBAからDLLを 呼び出したら、該当するソースでブレークが掛る。 ■DLL内の関数の追加 sample_dll.cppに処理を追加して、dll_exports.defに 関数名を追加する。 これを忘れるとDLLエントリーポイントが見つからないエラーが出ます ■以下VBAのソースです 「EXE呼び出し.xlsm」を直接開きたくない場合にはこのソースを Editorで入力してください -------------------------------------------------------------------------------------------- Private Declare PtrSafe Function DllMain Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" () As Long Private Declare PtrSafe Function DllTest Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" () As Long Private Declare PtrSafe Function DllStr Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long Private Declare PtrSafe Function DllSet Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" (ByVal val As Long) As Long Private Declare PtrSafe Function DllGetNumber Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" (ByVal val As Long) As Long Private Declare PtrSafe Function DllSetNumber Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" (ByVal val As Long, val As Long) As Long Private Declare PtrSafe Function DllWrite Lib "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\sample_dll\x64\debug\sample_dll.dll" () As Long Sub test() Dim i As Integer Dim s As String Dim a(5) As Long i = DllMain() MsgBox (i) i = DllTest() MsgBox (i) s = String$(100, vbNullChar) i = DllStr(90, s) MsgBox (s) i = DllSet(2233) i = DllTest() MsgBox (i) For j = 0 To 5 a(j) = 2000 + j Next j i = DllSetNumber(6, a(0)) For j = 0 To 5 i = DllGetNumber(j) MsgBox ("配列 [" & j & "] = " & i) Next j i = DllWrite() End Sub Private Sub CommandButton1_Click() Set WSH = CreateObject("WScript.Shell") Dim str As String str = "X:\user\jin\home\EXCEL\VBA-EXE呼び出し\Hello\debug\hello.exe" Set wExec = WSH.Exec(str) DoEvents Do While wExec.Status = 0 DoEvents Loop result = wExec.StdOut.ReadAll MsgBox ("Hello.exe -- " & result) Call test End Sub -------------------------------------------------------------------------------------------- この資料の保存場所(圧縮したソースファイルも下記URLに保管) http://hp.vector.co.jp/authors/VA030157/ 2013/04/30 Jin