- ベストアンサー
ExcelVBAで他ブックのマクロを動かす
- ExcelVBAを使用して、別ブックのコマンドボタンに埋め込まれたマクロを実行する方法について質問があります。
- マクロを実行する際に発生するエラーについても解説しています。
- 別ブックのマクロを動かすための宣言方法についても疑問を持っています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 別プロセスでExcelアプリケショーンを立ち上げる必要があるのかどうか、 こちらでは判断つきませんが、仮に必要なのだとして、、、。 直接的な答えとしては、 Public Sub setブック処理() '別ブックのマクロを動かす xlApp.Run (strName & "!CmdClick") End Sub ということになります。 別プロセスのアプリケーションで開いたブックのマクロなのですから、 そちらのApplicationオブジェクト(xlApp)に対してRunメソッドを実行することになります。 仮に同一のApplicationで"別ブック"を開いた場合の記述としては、 Application.Run (strName & "!CmdClick") が正解、ということになります。 Application.Runの引数群に , ThisWorkbook と書かれているのは、 状況から考えて、何かしら転記ミスのようなものだと思っています。 コマンドボタンのマクロを呼び出す場合は、Application.Runの引数は、 プロシージャ名、ひとつ、だけです。 実際にダミーサンプルブックを2通り作成し動作を確認しました。 動作の条件として、 ブック[A]のシート[名前]について、 1◆B2(strName)には、"別ブック"のショートネーム ex.) "別ブック.xlsm" 2◆B2(strPath)には、"別ブック"のフルネーム ex.) "D:\フォルダ\別ブック.xlsm" が正しく設定されていること。 呼び出そうとしている"別ブック"のマクロ CmdClick は、 3◆"別ブック"の標準モジュールに書かれていること。 以上の3点は確認が必要です。 また、別ブックのコマンドボタン、 これは、フォームコントロールのコマンドボタンという前提でお応えしています。 提示した方法でうまく行かない場合は、上記確認の上、 未提示の条件を整理した形の補足を頂ければ、改めて対応します。 以下、余談です。 Public Function テスト処理() は、ここで開示されている限りでは、Functionプロシージャとしての要件、 つまり、値を返す関数としての記述、が見当たりません。 値を返さないならSubプロシージャで書いた方が解り易いです。 どちらの場合でも、テスト処理を呼び出す元のプロシージャが、 もしもイベントプロシージャだった場合は、 └呼び出し元のイベントプロシージャ └テスト処理 └ブック処理 └別ブック!CmdClick というようなネストは、外部アプリケーションを扱う場合にはややリスキーで、 思わぬ結果に繋がる場合もありますから、呼び出し元の方で、 Application.OnTime Now, "テスト処理" のようにコールして、イベントプロシージャを抜けてから処理するように └テスト処理 └ブック処理 └別ブック!CmdClick した方が安全ですし、以後の書き換えに困る機会を減らせます。 呼び出し元のイベントプロシージャ と テスト処理 とが 独立して非同期で動作するように書いておく、 呼び出し元のイベントプロシージャ の処理が終わってから イベントを抜けた後にスケジュールされているアプリケーション由来の処理が終わってから テスト処理 を実行する ということです。 以上です。
お礼
とても親切な回答ありがとうございました。 おかげさまで望み通りの処理が可能となりました。