• ベストアンサー

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

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

  • r2san
  • お礼率25% (1309/5228)

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

  • ベストアンサー
  • 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/7940)
回答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/7940)
回答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

  • マクロブックを移してもプログラムを参照したい

    マクロからマクロを呼び出すとき、 Sub Macro2() Application.Run "Book1!Macro1" End Sub というマクロを作った場合、Book1!に保存されていないと実行されませんが、 これをほかのブックに移したときも使えるようにするにはどうしたらよいのでしょうか?

  • 既存のマクロをコピーして使いたい

    BOOK1に[新しいマクロの記録]で作ったMacro1があるとします。いま新たにBOOK2を作成し、ここでBOOK1のマクロMacro1をコピーして使いたいのですが、どうやってコピーしたらいいか教えて下さい。BOOK2とBOOK1を同時に開いておけばBOOK2でも同じ機能を得られるのですが、BOOK1を閉じるとマクロの機能が無くなってしまいます。ただし、マクロについては全くの無知で、[マクロの記録]だけを使っています。

  • エクセルのマクロ イベントプロシージャについて

    エクセルのマクロについて教えて下さい 今 book1を開いたら動くマクロを組んでいます 「Private Sub Workbook_Open()」を 使って 内容は この中で別のブック(仮にbook100とします) を開いてその中のデータ (すでに選択してあります) をコピーして book1に貼り付けて book100を閉じる。 という作業なのですが book100を選択しようとするとエラーが起きてしまいます。 Private Sub Workbook_Open() の中では違うブックに対して 作業ができないようになっているのでしょうか? よかったら御教授ください

  • マクロ 実行後にファイルを閉じたい

    マクロを実行した後、実行したファイルを閉じるようにしたいのですが、 どのように書いたらよいか分からず、どなたかご教授いただけませんでしょうか。 グーグルで検索したマクロを実行して、その後その実行したファイルを 閉じるように加えたかったため、以下のPrivate Sub book1close()を加えたのですが 何も起こらずファイルは開かれたままです。 まったく記述する構文を理解できてないのでお恥ずかしい質問で申し訳ございませんがどなたか、どうかよろしくお願い致します。 ---------------------------- Option Explicit  Sub 作業1()   ・・・・・・・  End Sub  Private Sub 作業2()   ・・・・・・・ End Sub Private Sub book1close()   この行以下を追加しましたが動きません! Application.DisplayAlerts = False Workbooks("Book1.xlsx").Save Workbooks("Book1.xlsx").Close Application.DisplayAlerts = True End Sub ----------------------------

  • excelマクロ記述

    EXCELのBOOKがあり、n枚のシートを含んでいます。 Macro1という名称のマクロで、 そのBook内のすべてのシートにMacro2というマクロを実行させる という場合、Macro1はどのように書けばいいのですか。 次次にシートを開くという操作をどう表すか? このMacro2では、例えばシートの文字の表示を75%のサイズで表示のようなものを考えています。 またそのときmacro2は、何か記述の追加が必要ならそれはどのようなものか。 よろしくお願いいたします。 Sub Macro1( ) ' Macro1 Macro ' 次次とシートを開き、75%サイズにする xxxxxxxx Sub Macro2( ) ' Macro1 Macro ActiveWindow.Zoom = 75 End Sub End Sub

  • エクセル-別のbookで同様のマクロ実行

    エクセル-別のbookで同様のマクロ実行 最初あるBook1に入っているmacro1はそのbook1のsheet1を処理するように作成しました。 次にBook1を開いたまま、Book2を開きそのsheet1に対してmacro1と同等の機能を実行したい場合は通常どうするのでしょうか。 (1) Book2にBook1のマクロをコピー (2) book2のマクロを開き、表示されるBOOK1 macro1を実行する。 (2) 場合でもうまくいくのでしょうか。Sheet1に対してやりたいことの論理は同じとします。試してみたらといわれそうですが、まず識者の説明をお聞きしたいのです。

  • Excel VBAで他のブックを選択する方法を教えてください。

    こんにちは。VBA初心者です。 ブックを2つ開いた状態で、 マクロを保存してあるブック〔Book1〕から、 毎回ブック名が異なる[Book2]の選択されている2枚のシートを新しいブックに(仮Book3)コピーしたいのですが、どのように記述したらよいのでしょうか。(選択されるシートも毎回異なります。) 特に教えていただきたい部分は、 1.マクロが記録されているBOOK1以外のBookを操作する方法。 2.私以外の方が利用する為、Book1に保存したマクロから実行させる予定なのですが、Book1を毎回開いて実行させる方法がベストのやり方なのでしょうか。 マクロの記録では下記の感じになります。 Sub Macro4() Windows.Arrange ArrangeStyle:=xlVertical Windows("Book2.xls").Activate Sheets(Array("Sheet3", "Sheet4")).Select Sheets("Sheet4").Activate Sheets(Array("Sheet3", "Sheet4")).Copy End Sub 宜しくお願い致します。

  • マクロの中でマクロを実行中に中止させたい

    マクロの中で別のマクロを実行して、それをループさせてます 中のマクロで問題があったとき外のマクロ自体を停止させるのはどうすればいいのですか? Sub A() Do Application.Run "I" Application.Run "II" Loop End Sub ここから マクロIの途中で何らかの条件が合えば、 マクロAを終了するにはどうすれば良いのですか?

  • マクロの記録で何も記録できない理由は?

    「ブックを開く」という動作が知りたかったので、 現在開いているブック1から、マクロの記録ボタンを押し、 デスクトップにあるブック2をダブルクリックして開きました。 しかし記録終了ボタンを押した後、 ブック1の標準モジュールを確認しても Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/10/16 ユーザー名 : ' End Sub と何も記録できていません。 何故でしょう? ちなみにブックを開く方法は http://officetanaka.net/excel/vba/file/file01.htm で確認できました。 なのでマクロの記録で記載されない理由を教えてください。 エクセル2003です。

  • Application.Run実行時にエラー

     Excelファイルのマクロで、デスクトップ上の別ファイル「test.xlsm」のマクロ「Macro2」を実行させるため、以下のマクロを作成し実行したところ、 以下のエラーメッセージが出て正常動作できませんでした。 何が原因でしょうか? なお、Macro2は単独で実行した場合は正しく動作しています。 よろしくお願いします。 [作成したマクロ] Sub Macro1() Application.Run "C:¥Users¥****¥Desktop¥test.xlsm!Macro2" End Sub [エラーメッセージの内容] 実行時エラー’1004’ マクロ"C:¥Users¥****¥Desktop¥test.xlsm!Macro2"を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。

専門家に質問してみよう