Excel VBA質問箱 IV

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

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


10337 / 13644 ツリー ←次へ | 前へ→

【22340】他のファイルにあるマクロの作動のさせ方 mimi 05/2/16(水) 17:22 質問[未読]
【22349】Re:他のファイルにあるマクロの作動のさせ方 ichinose 05/2/16(水) 21:18 発言[未読]
【22389】Re:他のファイルにあるマクロの作動のさせ方 mimi 05/2/17(木) 17:40 質問[未読]
【22390】Re:他のファイルにあるマクロの作動のさせ方 ichinose 05/2/17(木) 18:26 発言[未読]
【22415】Re:他のファイルにあるマクロの作動のさせ方 mimi 05/2/18(金) 16:27 お礼[未読]

【22340】他のファイルにあるマクロの作動のさせ方
質問  mimi E-MAIL  - 05/2/16(水) 17:22 -

引用なし
パスワード
   application.run を使って他のエクセルファイルにある macro1 という
マクロを作動させているのですが、
複数のファイル(aaa.xls,bbb.xls,ccc.xls ・・)にその macro1 という
マクロが存在しているため

ループを使って

Application.Run "'" & Path & "'!macro1"
 '#Path には C\〜\aaa.xls というようにフルパスを指定している

という方法を使ってマクロを作動させています

この時、aaa.xlsには3枚のシートがあって、1枚目にはmacro1は無く
2枚目、3枚目にはmacro1が存在します。

ファイル内で、各シートを見ていき、macro1 が存在する場合にはマクロを
作動させたいのです。

特にapplication.run にはこだわっていません。

複数のファイルを順に見ていき、さらにその中に存在する複数シートがあるとき
1枚目から順に見ていき、そのとき macro1 というマクロがあるときに
マクロを作動させたいのです。

なんとか、シートごとにマクロを作動させるという処理方法を教えてください

お願いします。

【22349】Re:他のファイルにあるマクロの作動のさ...
発言  ichinose  - 05/2/16(水) 21:18 -

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

>application.run を使って他のエクセルファイルにある macro1 という
>マクロを作動させているのですが、
>複数のファイル(aaa.xls,bbb.xls,ccc.xls ・・)にその macro1 という
>マクロが存在しているため
>
>という方法を使ってマクロを作動させています
それぞれのシートモジュールにMacro1が記述されていると言う事ですか?

だとしたら、

>Application.Run "'" & Path & "'!macro1"
> '#Path には C\〜\aaa.xls というようにフルパスを指定している

これで作動しますか?

'==============================
Sub main()
  On Error Resume Next
  For idx = 1 To 3
   Application.Run "'D:\My Documents\TESTエリア\aaa.xls'!sheet" & idx & ".macro1"
   Next
  On Error GoTo 0
End Sub

とすると、Macro1が記述されているシートのみ実行しますが・・・・。

私には、考えもつかないモジュール呼び出しです。
私もブックから、ブックを呼び出すという仕様で
コードを書くことはありますが、このような手法を使った事はありません。

この手法を使用しなければならない事情に私は興味があります。
(複数のシートモジュールに同じ名前のプロシジャーを作成して、
 プロシジャーの存在するシートのコードだけ実行する)
その事情にもよると思いますが、
別の方法があるかもしれませんよ!!

【22389】Re:他のファイルにあるマクロの作動のさ...
質問  mimi E-MAIL  - 05/2/17(木) 17:40 -

引用なし
パスワード
   ichinoseさん。ご返信ありがとうございます。
とても親切に教えてくださり、大変感激しております。

私の文章表現が分かりにくいため、ご迷惑をお掛けしております。

ichinoseさんに教えて頂いた方法でやってみました。

実際に書いたコードは、
Application.Run "'" & Path & "'!sheet" & idx & ".macro1"
(PathにはC:\〜\aaa.xmlというフルパスが格納されています)
と、書きました。

1枚目から順に3枚目までのシートでループを回して処理させました。
結果としましては、macro1は動作しておりませんでした。

今の状況を詳しく述べますと、
ブック内には標準モジュールとして、macro1というマクロが存在しております。
その、macro1 というマクロは シートに貼り付けてあるボタンを押すことで
動作するようになっております。

そのボタンは、2枚目と3枚目のシートにのみ貼り付けてあります。
(2枚目と3枚目のシートにのみmacro1というマクロが存在するという
 紛らわしい言い方をしていました。すみません。)

このブックにたいして、他のブックから、いちいちボタンを押すことなく
このmacro1というマクロを作動させたいのです。
(さらに詳しくいうとこのmacro1というマクロは、そのシート内にある
 数値を計算して、そのシート内に結果を返すマクロです)

なんとか汎用的に、他のブックからのマクロの作動を試みているのですが
うまくいきません。

どうぞ、もう少しお知恵をかしてくださいませんか?
よろしくお願いいたします。

【22390】Re:他のファイルにあるマクロの作動のさ...
発言  ichinose  - 05/2/17(木) 18:26 -

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

>
>実際に書いたコードは、
>Application.Run "'" & Path & "'!sheet" & idx & ".macro1"
>(PathにはC:\〜\aaa.xmlというフルパスが格納されています)
>と、書きました。
>
>1枚目から順に3枚目までのシートでループを回して処理させました。
>結果としましては、macro1は動作しておりませんでした。
ははっ、標準モジュールにあるのなら動きませんね!!
では、例題仕様です。

まず、標準モジュールにMacro1というプロシジャーが存在しているブックの
名前を callsample.xls としましょう。

Macro1の内容は、
'=========================================================
Sub Macro1()
  MsgBox ActiveSheet.Name
End Sub
アクティブシート名を表示するコード
このブックcallsample.xlsには、
Sheet1、Sheet2、Sheet3というシート名が付けられたシートがあります。

この中のSheet2とSheet3には、「フォーム」ツールバーのボタンを配置します。
このボタンには、Macro1が関連付けされています。


次に呼び出しを行うブック、これを「calltest.xls」という名前を付けましょう。
二つのブックは、同じフォルダ内に保存して下さい。

では、calltest.xlsの標準モジュールのコードです。
直接呼び出すのではなくOpenメソッドで対象ブックを開きました。

'===============================================================
Sub main()
  Dim opnbk As Workbook
  Dim sht As Worksheet
  Dim btn As Button
  Set opnbk = Workbooks.Open(ThisWorkbook.Path & "\callsample.xls")
  '↑対象ブックを開く
  For Each sht In opnbk.Worksheets
   sht.Activate
   For Each btn In sht.Buttons
     Application.Run btn.OnAction
     Next
   Next
End Sub

こんなコードで実行してみて下さい。
ボタンがあるシートだけMacro1が実行されます。
つまり、上の例の場合、ボタンのあるシートのシート名が表示されます。
上記の内容のブックを新規に作成して試してみてください。


>

【22415】Re:他のファイルにあるマクロの作動のさ...
お礼  mimi E-MAIL  - 05/2/18(金) 16:27 -

引用なし
パスワード
   ichinoseさん

mimiです。
親切且つ丁寧なご解説、大変ありがとうございました。
シートにあるmacro1だけ作動させたかったので、以下のような
コードにしました。

For Each sht In Sheets
    sht.Activate
    For Each btn In sht.Buttons
     'Application.Run btn.OnAction
     Application.Run "'" & Path & "'!macro1"
    Next
    
  Next

おかげさまで、ちゃんと動くようになりました。
本当に親切に教えてくださって、ありがとうございます。
大変感謝しております。
ありがとうございました!

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