Excel VBA質問箱 IV

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

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


9971 / 13646 ツリー ←次へ | 前へ→

【24512】別のブックのマクロの実行と結果について mitu 05/4/23(土) 20:39 質問[未読]
【24513】Re:別のブックのマクロの実行と結果について ichinose 05/4/23(土) 21:37 発言[未読]
【24522】Re:別のブックのマクロの実行と結果について mitu 05/4/24(日) 3:28 質問[未読]
【24525】Re:別のブックのマクロの実行と結果について ichinose 05/4/24(日) 9:58 発言[未読]
【24528】Re:別のブックのマクロの実行と結果について mitu 05/4/24(日) 13:18 お礼[未読]

【24512】別のブックのマクロの実行と結果について
質問  mitu  - 05/4/23(土) 20:39 -

引用なし
パスワード
   あるブックから別のブックに引数を渡して別のブックのマクロを実行させるべく、下記のようにしました。その結果を戻したいのですが、うまくいきませんのでご教授お願いします。

RPth = "'" & "データ処理.xlsのあるディレクトリ名"
Application.Run (RPth & "データ処理.xls'!マクロ1"), "引数1","引数2,・・・"

sub マクロ1(引数1,引数2,・・・・)
 -----------
end sub

"引数1"のデータはデータ処理.xlsに引き渡され実行されるのですが、その結果を元のあるブックの引数でアンサーとして得ることができません。

対処の方法をご教授ねがいます。

【24513】Re:別のブックのマクロの実行と結果につ...
発言  ichinose  - 05/4/23(土) 21:37 -

引用なし
パスワード
   ▼mitu さん:
こんばんは。

>あるブックから別のブックに引数を渡して別のブックのマクロを実行させるべく、下記のようにしました。その結果を戻したいのですが、うまくいきませんのでご教授お願いします。
Runメソッドの引数はByvalつまり、値渡しですからサブプロシジャーの
出力変数として使えませんよ!!
やるとしたら、Functionにして返してもらう方法ですが・・・。


>
>RPth = "'" & "データ処理.xlsのあるディレクトリ名"
>Application.Run (RPth & "データ処理.xls'!マクロ1"), "引数1","引数2,・・・"
>
>sub マクロ1(引数1,引数2,・・・・)
> -----------
>end sub
>
>"引数1"のデータはデータ処理.xlsに引き渡され実行されるのですが、その結果を元のあるブックの引数でアンサーとして得ることができません。
>
>対処の方法をご教授ねがいます。
私は、以下のようにしています。

例えば、ブックA.Xlsの
Thisworkbookのモジュールに
'======================================
sub caller_proc(a as long,b as long,c as long)
  c=a+b
end sub


これをブックb.xlsの標準モジュールから呼び出すには、
'============================================
sub test()
 dim aa as long
 dim bb as long
 dim cc as long
 aa=2
 bb=3
 call workbooks("a.xls").caller_proc(aa,bb,cc)
 msgbox cc
end sub
 
というように呼び出されるプロシジャーをオブジェクトモジュールに記述する
方法を使っています。
試してみて下さい。

【24522】Re:別のブックのマクロの実行と結果につ...
質問  mitu  - 05/4/24(日) 3:28 -

引用なし
パスワード
   ▼ichinose さん:
早速のご回答ありがとうございました。
具体的な方法をご教示して頂き助かりました。

ついでで恐縮ですが、ちょっとつまづきましたので、質問させてください。

呼び出される側のマクロは、bookのモジュールで、標準モジュールでは、ダメなんですね。
そして、bookは事前に開いておく必要があるのですね。

【24525】Re:別のブックのマクロの実行と結果につ...
発言  ichinose  - 05/4/24(日) 9:58 -

引用なし
パスワード
   ▼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という手続きを通してしか出力データを得る事が出来ないので、配列にして複数の結果を得るという例です。

他にも出力先にセルアドレスを指定して指定したセルに値を返す
と言う方法も考えられます(ブックには、必ず、セルが付いているのですから
このセルを利用すると言う方法です)。

というように工夫すればやりようはあります。

試してみて下さい。

【24528】Re:別のブックのマクロの実行と結果につ...
お礼  mitu  - 05/4/24(日) 13:18 -

引用なし
パスワード
   ▼ichinose さん:
早速ご教示して頂きありがとうございました。

Call Workbook.Open方式では、2重に開く?と表示されることがありますので、当初に教えていただきましたCall Workbooks方式で、手前で、呼び出される側のbookが開いていない場合には、開くことで対処することにしました。


呼び出される側のマクロは、bookのモジュールとして、bookのモジュールを経由して標準モジュールに移行することで対処できました。

再三にわたり、ご丁寧に指導を賜りまして感謝感激いたしております。
今後ともよろしくお願いします。

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