• ベストアンサー

マクロからマクロを呼び出す方法

ブックの中にあるマクロを呼び出すマクロを書きたいです。 Sub Macro2()   Application.Run "Book1!Macro1" End Sub とすると、book1のmacro1しか呼び出せませんが、マクロを書いているファイル(コピーして仮にbook2) のマクロを呼び出すにはどのように書けばよいでしょうか?(マクロブックだけ他のファイルにコピーして使う用途を想定しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

少し、こちらの回答を加えさせていただきます。 >マクロを書いているファイル(コピーして仮にbook2)のマクロを呼び出すにはどのように書けばよいでしょうか? それは、いずれにしても、アドイン型のマクロのことではありませんか? >マクロブックを別に作ってそれを呼び出した方が安全ですね。 安全性というなら、アドイン型でも同じことです。手数が少し増えるだけです。 以下の場合は、実際は登録したものを呼び出しているわけです。ただし、こういうファイルは決められた所に置いてください。あちこちに置かないほうがよいです。フリーツールなどても、独自のフォルダを作るものがありますが、それは良い習慣ではありません。 Sub CallmyAddin()  'Application.UserLibraryPath 'ユーザーアドインパスはここが良い  Const ADDINFN As String = "TestAddin"  With AddIns(ADDINFN)   Application.EnableEvents = False   '呼び出すとファイルが開いてしまう   Application.Run "'" & .FullName & "'!" & "Test1"   Application.EnableEvents = True   Workbooks(.Name).Close False  End With End Sub '---- アドインは、、一旦、アドインファイル自体を削除すれば、ワークシートのメニューからアドイン名をクリックすれば名称は消せます。アドイン型ファイルでも、アドイン型にしておいて、見えないワークシートを利用していることもあるようです。ブックのThisWorkbook のプロパティの IsAddin をTrue にすれば、開いてもブックは見えないです。取り扱いがややこしくなります。 Sub myReferenceMacro() '参照設定をする場合   myProject.TestMacro1    'myProject は、ユニークなプロジェクト名 TestMacro は、マクロ名 End Sub VBAの参照設定に設定します。その場合、IsAddin を True にすればよいです。元のファイルを開けば、見えなくてもファイルはオープンしていますし、元のブックを閉じれば、見えないファイルはクローズします。なお、ファイルが存在していれば、参照設定自体も、マクロで行うことが出来ます。

その他の回答 (3)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.4

>マクロブックを別に作ってそれを呼び出した方が安全ですね。 何を心配しての「安全」や「危険」なのか,あなたがこのご相談でどういう使い勝手を想定しているのか目的や状況が見えないので,ですねと言われてもちょっと回答に困ります。 以下にごく一般論としての使い勝手の範疇でお話ししますが,ご相談のような用途のマクロは「個人用マクロブック」に登録しておくことで十分と思われます。 個人用マクロブックについてご存じなければ,これは新しいマクロの記録で記録マクロを録った時にそれが記録される「Perusonal.xls」の事です。新しいマクロの記録の操作を行ったあと,改めてエクセルを起動してからVBE画面でプロジェクトエクスプローラを見てみれば,見つけることができます。 Personal.xlsに登録したマクロ,つまり自動記録マクロに限らずあなたが手動でPersonalxlslにModuleを挿入して手で書いたマクロでも構いません,は,Personal.xlsがエクセルを起動すると同時に常に開かれているため,どのブックからでも sub macro3() application.run "Personal.xls!macro1" end sub の形式で直ちに実行できます。 あなたが元のご相談に書いた「マクロだけ他のファイルにコピーして使う用途」の,そのコピー先のブックとして元々のエクセルの設計に組み込まれているのが個人用マクロブックだ,と解釈してもそんなに間違いじゃありません。 また,ワークシート画面のツールバーに登録したカスタムツールボタンに,Personal.xlsに登録したマクロそのものを登録しクリックして実行するよう仕込んでみるのも,標準的な使い方のひとつです。 この方式を利用すると,個別のデータブックに一切マクロを持たせたりせず,ただデータブックを開いてツールバーのツールボタンをぽちっとなと押すだけで処理を行わせるような仕込みが簡単にできます。 一方,あなたが極めて特別の用途(仕事)の時だけに使うマクロを,これまた不明の理由で別ブックに分けて取っておきたいといったお話であれば,それはまぁ特定のブックにマクロを登録して保存しておき,先の解凍の形式のマクロでapplication.runする(そのブックを都度開かせて実行する。開いておく必要はなくて,マクロを呼び出したいときだけマクロに開かせて使う)事もありです。 あんまり「たられば」でお話ししてもしょーがないので,明確に「このような使い方が必要」な意図があるのでしたら,少し丁寧に補足を投稿してみてください。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

「閉じたブック」からマクロだけ実行する方法はありません。 Sub macro1()  Application.Run "'c:\test\book1.xls'!macro1" End Sub などのような書きぶりで,マクロブックを開いて実行します。 当然マクロブックは開きますから,実際には ○マクロブックを非表示の状態にして保存しておく  もし必要なら,マクロ側に実行終了後に自分を閉じる命令を組み込んでおく ○Personal.xls(個人用マクロブック)と同様にxlstartフォルダ(もしくは代替フォルダ)にブック1を仕込んで,常に開かせておく ○アドインの形式にして組み込んで,常に開いておく などの手だてを併用すると良いかもしれません。

r2san
質問者

お礼

マクロブックを別に作ってそれを呼び出した方が安全ですね。 ご回答ありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

同じフォルダ内いあるブックでしたら実行するマクロが保存されているブックを開いてからとなりますがそうでないのでしたら次のようにしてはどうでしょう。 Sub Macro2()   Application.Run Macro:= "Book1.xls!Macro1" End Sub

r2san
質問者

お礼

ご回答ありがとうございました。 勉強になりました。

関連するQ&A