• ベストアンサー

Excel VBAのApplication.ExecuteExcel4Macro

こんにちは。 Excel VBAでファイル間集計のマクロを作りました。 変数MyStrに指定のパスとファイル名を代入するようにしてあります。 Application.ExecuteExcel4Macro(MyStr) を実行し指定のパスにファイル名が実在すれば、動作は上手くいきます。 ただし、指定のパスにファイルが存在しない場合、ファイル検索のダイアログが出てしまい、強制終了すれば、実行時エラー2023になってしまいます。 これを回避し、「該当のファイルが見つかりません」とメッセージを出したいのですが、IF文にどのように書けばいいのか分かりません。 参考サイトでも、構いませんので皆さんの知恵を貸して下さい。 よろしくお願いします。

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

Dir() 関数でチェックしたらいかがですか? http://officetanaka.net/excel/vba/file/file06.htm

Harmaiony
質問者

お礼

hana-hana3様 If Dir(MyStr) <> "" Then文で回避することができました。 サイトもとても参考になりました。 とっても嬉しいです!本当に有難うございました。

Harmaiony
質問者

補足

hana-hana3様 ご教授有難うございます。 難しそうですが、これから作成してみます。 改めて、ご報告させて頂きます。

その他の回答 (2)

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

こんにちは。 #1さんの回答で良いです。 Dir(パス\ファイル名) で、戻り値がないと、長さ0文字列("")を返してきますので、それで判定できます。 #2さんのものは、基本的にありえません。ダイアログでファイルを探しているのは、Excel.Application です。その間は、マクロは停止状態ですから、エラーは返しません。その後で、ExecuteExcel4Macro が、エラーを返してきています。「エラー 2023」のエラーコードでも分かりますが、ワークシート側の関数の戻り値の[エラー値]で、「#REF! 」のことです。だから、On Error トラップを用いる必要はありませんが、 If IsError(Application.ExecuteExcel4Macro(MyStr) = True Then On Error GoTo ERR else これは、コンセプトそのものが違っています。エラートラップというのは、VBA自身(Excel.Applicationではない)を停止させてしまうエラーを抜けることです。IsError というのは、その関数などが持っている[エラー値]を捕まえることで、そこに、On Error Goto は入れられません。ある程度のレベルになれば、そのエラーはどこで返しているか、知っておいたほうがよいと思います。 [エラー値]というのは、関数が持つひとつの値で、[エラー値]を返すことが出来るものだけが、IsError を用いることが出来るわけです。それ以外は、On Error トラップを用いるのですが、あまり頻繁に用いるべきものではありません。回避できるなら、その方法を選択するべきです。エラートラップというのは、VBAで使いこなすには、少し勉強が必要です。 ただ、ExecuteExcel4Macro(MyStr) というのは、「ブックを開かないで値をとる方法」というものだと思います。それについては、私も数回は書いたことがあるのですが、基本的には、VBAでブックを開いて、そこから値をとるというのが、一般的なコードです。どこかの掲示板に書かれたものが便利そうだから用いたのだと思いますが、一過性のものでないなら、なるべく古い手法は避けたほうが無難なような気がします。それ以外の方法もありますが、極端にレベルが高くなりますので、やむをえないところです。

Harmaiony
質問者

お礼

Wendy02様 ご多忙の中、とても丁寧な説明を有難うございます! Excel.Applicationで動作している事、 エラートラップというのは、VBA自身(Excel.Applicationではない)を停止させてしまうエラーを抜けることです。IsError というのは、その関数などが持っている[エラー値]を捕まえることで、そこに、On Error Goto は入れられません。 とても勉強になりました。 まだまだ駆け出しですが、少しずつ勉強しなければなりません。 どうか懲りずに今後もご指導よろしくお願いいたします。

  • taka0028
  • ベストアンサー率33% (19/57)
回答No.2

ON ERROR GOTO でjumpすればいかがでしょうか 下記でエラーコード2023の場合にメッセーボックスにてエラーメッセージが出せます。 sub aaa() ON ERROR GOTO ERR 通常の処理 exit sub ERR: if ERR=2023 then msgbox "該当のファイルが見つかりません" end if end sub

Harmaiony
質問者

補足

taka0028様 アドバイス有難うございます。 ご指導の通りに記述しましたが、一度ファイル検索のダイアログが出てしまい、そこでキャンセルボタンを押してからでないとErrルーチンに入ってくれません。 また、質問にイミディエイトウインドウの結果が「エラー 2023」と書きましたが、ファイル検索のダイアログでキャンセルボタンを押して返ってくる結果のようです。 そして、if ERR=2023 thenでは、「エラー 2023」は該当しないようです。 アドバイスを参考に If IsError(Application.ExecuteExcel4Macro(MyStr) = True Then On Error GoTo ERR else 通常処理 も記述してみましたが、結果は同じです。 問題点をご教授下さい。よろしくお願いします。

関連するQ&A

専門家に質問してみよう