ここから本文です

VBScript内でdll(参照渡しの引数含む)を利用したいと考えています。 ExecuteE...

tan********さん

2012/5/1222:28:30

VBScript内でdll(参照渡しの引数含む)を利用したいと考えています。

ExecuteExcel4Macro関数を利用して
ExcelのCALL関数を呼び出すのが簡便だと思うのですが、
引数が値渡しのdllしか呼び出せないのが現状です。

以下に詳細を説明します。

上記方法を利用してdllを呼び出す例を以下に示します。

【例】
----------------------------------------
Dim x, y
Dim Excel, Command

x = 10
y = 20

Set Excel = WScript.CreateObject("Excel.Application")
Command = "CALL(""user32.dll"", ""SetCursorPos"", ""JJJ"", "& x &", "& y &")"
Excel.ExecuteExcel4Macro(command)
----------------------------------------

このように、ExecuteExcel4Macro関数は文字列情報を引数としてExcelのCALL関数を呼び出すので、
変数の内容も文字列化して引数に組み込む必要があります。
⇒上の例のx、yがこれに該当します。

そのため、利用したいdllの引数の中に参照渡しのものが存在する場合、
どのようにコーディングしてよいのかわかりません。

Microsoftのサポートページには参照渡しの引数を含むdllも扱えるようなことが記載されているのですが↓
http://office.microsoft.com/ja-jp/excel-help/HP010062480.aspx

閲覧数:
6,717
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

nlf********さん

編集あり2012/5/1404:14:17

例えば、Calc.dll という DLL に Divide という割り算を行う関数があり、
第一引数 : Long 型 : 割られる数
第二引数 : Long 型 : 割る数
第三引数 : Long 型 : 割り算の余り ( 第一引数 Mod 第二引数 ) が返ってくる
戻り値:Long : 割り算の結果 ( 第一引数 / 第二引数 )
となっているとします。

Excel で Declare で宣言する場合は

Declare Function Divide Lib "Calc.dll" (ByVal a As Long, ByVal b As Long, ByRef r As Long) As Long

のようになります。

これを VBS で ExcuteExcel4Macro("CALL(...)") を使用して呼び出すとき、CALL の引数タイプを "JJJN" として、

Dim a
Dim b
Dim q
Dim command

a = 123
b = 8

Set Excel = WScript.CreateObject("Excel.Application")

command = "CALL(""Calc.dll"",""Divide"", ""JJJN"", " & a & "," & b & ", 0)"
q = Excel.ExecuteExcel4Macro(command)

とすると、q には割り算の結果の 15 がセットされます。

http://office.microsoft.com/ja-jp/excel-help/HP010062480.aspx?CTT=5...

の「指定した引数の変更: Void として宣言される関数」のところに非常にわかりにくい書き方で書いてありますが、
CALL の引数タイプの最初の文字に "3" ( 第三引数に値を返すという意味 ) を指定して、"3JJN" とし、

Dim a
Dim b
Dim r
Dim command

a = 123
b = 8

Set Excel = WScript.CreateObject("Excel.Application")

command = "CALL(""Calc.dll"",""Divide"", ""3JJN"", " & a & "," & b & ", 0)"
r = Excel.ExecuteExcel4Macro(command)

とすれば、r には余りの 3 がセットされます。

つまり、戻り値か、値を返す引数のどちらかしか取得できないようです。

両方取得しようとすると、

Dim a
Dim b
Dim q
Dim r
Dim command

a = 123
b = 8

Set Excel = WScript.CreateObject("Excel.Application")

command = "CALL(""Calc.dll"",""Divide"", ""JJJN"", " & a & "," & b & ", 0)"
q = Excel.ExecuteExcel4Macro(command)

command = "CALL(""Calc.dll"",""Divide"", ""3JJN"", " & a & "," & b & ", 0)"
r = Excel.ExecuteExcel4Macro(command)

MsgBox a & " ÷ " & b & " = " & q & ", 余り = " & r

のように二度呼び出さなければならないと思います。

質問した人からのコメント

2012/5/14 20:48:27

nlfotisさん

非常にわかりやすい回答をいただき、どうもありがとうございます。
自分でも試してみたところ、思ったようなコーディングをすることができました。
とても勉強になりました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる