|
▼mitu さん:
おはようございます。
>早速のご回答ありがとうございました。
>具体的な方法をご教示して頂き助かりました。
>
>ついでで恐縮ですが、ちょっとつまづきましたので、質問させてください。
>
>呼び出される側のマクロは、bookのモジュールで、標準モジュールでは、ダメなんですね。
投稿した方法は、オブジェクトモジュールを呼び出す方法ですから
標準モジュールではできません。呼び出し元のブック(b.xls)でブック(a.xls)を
参照設定等しておけば可能です(この方法でもよいなら、方法を説明しますが、
私も可能な事を確認はしていますが、実際のこの手のコードを使用した事はないです)。
>そして、bookは事前に開いておく必要があるのですね。
これは、Runメソッドだって同じなんですけどね!!
ただ、1行で記述できるか否かの問題でRUNメソッドだってブックを開いていますよ。
前回の投稿のブックB.XLSの標準モジュールで
'============================================
Sub test()
Dim aa As Long
Dim bb As Long
Dim cc As Long
aa = 2
bb = 3
Call Workbooks.Open("D:\My Documents\a.xls").caller_proc(aa, bb, cc)
MsgBox cc
End Sub
とすれば、予め開いておかなくてもよいです。
これだって、ブックのオープンとプロシジャー呼び出しを1行に記述しただけです。
前回の投稿で
>Runメソッドの引数はByvalつまり、値渡しですからサブプロシジャーの
出力変数として使えませんよ!!
と申し上げました。これは、引数として変数を渡したときの話で、
絶対に無理ということではなく
工夫すればいくつかの方法はあります。
例えば、
D:\My Documents\a.xlsにブックa.xlsは、保存されているとしましょう。
このブックの標準モジュールにサブプロシジャーではなくファンクションプロシジャーを
記述します。
'============================================================
Function call_test(a As Long, b As Long)
Dim ans(1 To 4)
ans(1) = a + b
ans(2) = a - b
ans(3) = a * b
ans(4) = a / b
call_test = ans()
Erase ans()
End Function
これは、入力引数として与えられたa,bに対して四則演算の結果を返すFunctionです。
これをb.xlsから呼び出すには、
'================================
Sub test2()
Dim aa As Long
Dim bb As Long
Dim cc As Variant
aa = 2
bb = 3
cc = Application.Run("'D:\My Documents\a.xls'!call_test", aa, bb)
For idx = LBound(cc) To UBound(cc)
MsgBox cc(idx)
Next
End Sub
なんてすると、四則演算の結果が得られます。
これは、Functionを使用しても外部呼出しでは、call_testという手続きを通してしか出力データを得る事が出来ないので、配列にして複数の結果を得るという例です。
他にも出力先にセルアドレスを指定して指定したセルに値を返す
と言う方法も考えられます(ブックには、必ず、セルが付いているのですから
このセルを利用すると言う方法です)。
というように工夫すればやりようはあります。
試してみて下さい。
|
|