dポイントプレゼントキャンペーン実施中!

Aというブックのマクロを動かし、別ブックのコマンドボタンに埋め込まれているマクロの動作を行いたいのですがうまく行きません。
下記がコードになります。


Option Explicit

Public strName As String
Public strPath As String
Public xlApp As Object
Public xlBook As Object
Public xlSheet As Object


Public Function テスト処理()


'ファイル名
strName = Worksheets("名前").Range("B2")
'ファイルを置いている場所
strPath = Worksheets("名前").Range("B3")


Set xlApp = CreateObject("Excel.Application")
'別Excelを開く
Set xlBook = xlApp.Workbooks.Open(strPath, True)
'シートの選択
Set xlSheet = xlBook.Worksheets("操作画面")
xlApp.Visible = True
xlApp.UserControl = True

xlSheet.Activate

setブック処理

End Function

Public Sub setブック処理()


'別ブックのマクロを動かす
Application.Run (strName & "!CmdClick"), ThisWorkbook  

End Sub



上記のマクロを動かすと、Application.Runの部分で下記エラーが表示されます。

実行時エラー1004

'別ブック.xls'が見付かりません。ファイル名及びファイルの保存場所が正しいかどうか確認してください。

setで飛ぶ前に別のブックは開けているので、ファイル名や保存場所は正しいと思うのですがエラーが出てしまいます。
宣言の仕方が間違っているのでしょうか?


ちなみに、別ブックのコマンドボタンのマクロは下記の名称なので、マクロ名の間違いという事も無いと思います。

Private Sub CmdClick()

~処理~

End Sub

A 回答 (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
した方が安全ですし、以後の書き換えに困る機会を減らせます。
呼び出し元のイベントプロシージャ と テスト処理 とが
独立して非同期で動作するように書いておく、
 呼び出し元のイベントプロシージャ
  の処理が終わってから
  イベントを抜けた後にスケジュールされているアプリケーション由来の処理が終わってから
 テスト処理
  を実行する
ということです。

以上です。
    • good
    • 0
この回答へのお礼

とても親切な回答ありがとうございました。
おかげさまで望み通りの処理が可能となりました。

お礼日時:2014/08/21 20:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!