アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

参考サイトでも、構いませんので皆さんの知恵を貸して下さい。
よろしくお願いします。

A 回答 (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でブックを開いて、そこから値をとるというのが、一般的なコードです。どこかの掲示板に書かれたものが便利そうだから用いたのだと思いますが、一過性のものでないなら、なるべく古い手法は避けたほうが無難なような気がします。それ以外の方法もありますが、極端にレベルが高くなりますので、やむをえないところです。
    • good
    • 0
この回答へのお礼

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

まだまだ駆け出しですが、少しずつ勉強しなければなりません。
どうか懲りずに今後もご指導よろしくお願いいたします。

お礼日時:2007/02/16 12:39

ON ERROR GOTO でjumpすればいかがでしょうか


下記でエラーコード2023の場合にメッセーボックスにてエラーメッセージが出せます。

sub aaa()
ON ERROR GOTO ERR
通常の処理
exit sub
ERR:
if ERR=2023 then
msgbox "該当のファイルが見つかりません"
end if
end sub

この回答への補足

taka0028様
アドバイス有難うございます。

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

も記述してみましたが、結果は同じです。
問題点をご教授下さい。よろしくお願いします。

補足日時:2007/02/16 09:55
    • good
    • 0

Dir() 関数でチェックしたらいかがですか?



http://officetanaka.net/excel/vba/file/file06.htm

この回答への補足

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

補足日時:2007/02/16 09:56
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 12:35

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

このQ&Aを見た人はこんなQ&Aも見ています