- ベストアンサー
VBA トラップを再開させるには?
一度ご質問させていただいたのですが、 どうも上手くできなくて・・・ <連番の付いた複数のFileを順に呼び出すプログラム> ForループでFileナンバーをインクリメントして行く方法で作成。 もしFileが存在しない場合、ラベルで警告して継続させたい。 この時、On Error GoTo をループ内で使って処理をしたのですが、 1回目は上手く行き、2回目がトラップできませんでした。何故?? Fileが存在しない場合、メッセージを出しますが、 2回目にエラーが発生したときは、トラップに掛かりません。 (***Fileが見当たりません…のコーションラベルが表示される) Resumeを使っても、エラーが発生した"後"から開始されるので それでは、Fileを開きにすら行きません。 何か、良い方法はないでしょうか???? Sub FileOpen() Dim N As Integer For N=1 To 100 On Error GoTo ErrorRtn: Workbooks.OpenText Filename:= N & ".csv" ErrorRtn: MsgBox "Fileが有りません" Next End sub
- rayde-su
- お礼率92% (12/13)
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 どうしてもエラートラップで処理したいんですね(笑)。 私なら、エラーをスルーした後でエラー番号で確認します。 Sub FileOpen() Dim N As Integer On Error GoTo Resume Next For N=1 To 100 Workbooks.OpenText Filename:= N & ".csv" If Err.Number <> 0 Then MsgBox "Fileが有りません" Err.Clear End If Next N End sub ちなみに、元の質問のコードだと、エラーではなくちゃんとファイルを開いても、メッセージを出してしまうと思います。 ラベル行はForループの外へ出しましょう。 また、Resume Nextで戻る前に、Err.Clearでエラーをリセットすればいいと思います。 Sub FileOpen() Dim N As Integer On Error GoTo ErrorRtn For N=1 To 100 Workbooks.OpenText Filename:= N & ".csv" Next N Exit Sub ErrorRtn: MsgBox "Fileが有りません" Err.Clear Resume Next End sub
その他の回答 (1)
「ファイルが存在しない」事象は必ずしもエラー処理にすべきとは思いません。 Dir関数なりFSO ( FileSystemObject ) でファイルの有無を判定すればよいのでは? ※ あるかないかわからないプロパティにアクセスする場合、敢えてエラーで処理してしまう場合はあります。 ( エラー処理を使わない、となると、全プロパティを総ナメすることになるので )
お礼
ありがとうございます。 フムフム なるほど、こういう方法もあるのですね。 今の私には ちょっと高度?かな、 この内容でも 勉強してみます。
関連するQ&A
- VBA エラートラップができない
<連番の付いた複数のFileを順に呼び出すプログラム> ForループでFileナンバーをインクリメントして行く方法で作成。 もしFileが存在しない場合、ラベルで警告して継続させたい。 この時、On Error GoTo をループ内で使って処理をしたのですが、 1回目は上手く行き、2回目がトラップできませんでした。何故?? Sub FileOpen() Dim N As Variant For N=1 To 100 On Error GoTo ErrorRtn: Workbooks.OpenText Filename:= N & ".csv" ErrorRtn: MsgBox "Fileが有りません" Next End sub
- ベストアンサー
- オフィス系ソフト
- デバッグでエラートラップが効かない
以下のようなトラップで EXEを実行させると ファイルがないことで起こる エラーは発生しないのですが デバッグ実行すると トラップが効かず ファイルが存在しません というエラーがでてしまいます エラートラップが効かないようなのですが なぜでしょう? On Error GoTo KILLERROR Kill "file" KILLERROR: Resume Next
- ベストアンサー
- Visual Basic
- EXCEL2000 VBA でエラートラップできません。
次のスクリプトで”Select Case Workbooks(saki).Worksheets(z).Name”のところで変数zに存在しないワークシートのインデックスが入った時にはエラーが出るので、On Erroe Goto で回避しようと思うのですができません(そのままマクロが止まってしまう)。 なぜ回避できないのか教えてください。 また回避するいい方法があれば教えてください。 Private Sub UserForm_Activate() moto = Cells(2, 5) saki = Cells(1, 5) For z = 1 To 50 On Error GoTo e0 Select Case Workbooks(moto).Worksheets(z).Name Case "検索" Case "結果" Case "エフ" Case "ツール" Case "記憶" Case Else On Error GoTo e0 UserForm3.ComboBox1.AddItem Workbooks(moto).Worksheets(z).Name End Select Next e0: For z = 1 To 50 On Error GoTo e1 Select Case Workbooks(saki).Worksheets(z).Name ’ここでエラーが出る(実行時エラー'9' インデックスが有効範囲にありません) Case "検索" Case "結果" Case "エフ" Case "ツール" Case "記憶" Case Else On Error GoTo e1 UserForm3.ComboBox2.AddItem Workbooks(saki).Worksheets(z).Name End Select Next e1: End Sub
- ベストアンサー
- オフィス系ソフト
- VBAでエラートラップがうまくいきません。
VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = " " Then ~コード~ END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error GoTo エラー処理 If Target.Value = " " Then On Error GoTo 0 ~コード~ END IF EXIT SUB エラー処理: EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- VBAのエラー処理がうまくいきません!?
下記のようなマクロを見よう見まねで作りました。 K13:K43に入れた文字列としての計算式を隣りのJ列に計算された答えを入れるというものです。 うまく動いたのですが、式が間違っている場合、エラーになるのでエラー処理をいれてみました。 On Error GoTo Trapと Exit Sub Trap: MsgBox "式が不正です。", vbCritical, "式" の3行を新たに挿入しましたが、どういうわけか全部がエラーになってしまいMsgBoxが出てしまいます。 どこが間違ったのでしょうか? Sub 包括料算() Dim i As Long Sheets("包括明細").Select For i = 1 To 30 If Range("K" & i + 13) <> "" Then 'K列14~43行で空白以外のセルの場合 On Error GoTo Trap 'エラーの時Trapへ Range("J" & i + 13).Formula = "=ROUND(" & Range("K" & i + 13).Value & ",2)" 'J列14~43行に式としていれる Exit Sub Trap: MsgBox "式が不正です。", vbCritical, "式" End If Next A% = MsgBox("入力完了ですか?" _ + Chr(&HD) + Chr(&HA) + "", vbYesNo + vbQuestion, "確認") Select Case A% Case vbYes 包括終了 '終了用マクロへ Case vbNo Exit Sub End Select End Sub
- ベストアンサー
- オフィス系ソフト
- Access VBA エラートラップでの終了処理
お世話様です。 Access2003 VBA にて、各プロシージャに貼ったエラートラップで、 メッセージを出力した後にAccessを終了したいと考えております。 ここで、通常終了時(フォームの×ボタン押下時)の 終了確認メッセージをForm_Unloadイベントで記述しているのですが、 エラートラップでの終了時にも、このメッセージが表示されてしまいます。 エラートラップでの終了時は、終了確認メッセージを表示させたくないので、 標準モジュールにパブリック変数のエラーフラグを用意し、 それで判断しようと考えたのですが、 エラートラップ内でエラーフラグに値を設定しても保持されず、 Form_Unloadイベントで終了確認メッセージがどうしても表示されてしまいます。 何か良い方法はありますでしょうか?よろしくお願いいたします。 例: '***ボタンAクリックイベント******************* Private Sub btn_A_Click() On Error GoTo ERR_LINE <何らかの処理> Exit Sub ERR_LINE: MsgBox "予期せぬエラーが発生しました。終了します。" & Chr(13) & _ "エラー番号: " & Err.Number & Chr(13) & _ "エラー内容: " & Err.Description, vbCritical + vbOKOnly, "例外エラー" bl_ErrFlg = True 'エラーフラグ設定←保持されない Application.Quit End Sub '***フォームアンロードイベント******************* Private Sub Form_Unload(Cancel As Integer) If bl_ErrFlg = False Then Cancel = MsgBox("終了します。よろしいですか?",vbQuestion + vbYesNo, "終了確認") = vbNo End If End Sub
- ベストアンサー
- その他(プログラミング・開発)
- VBAでon error goto文がきかない
エラーが発生しているにもかかわらずon error gotoが実行されません。 ファイルの存在チェックで存在したときは消すようにプログラムしたはずなのに。同僚いわく「何かOSのファイルが壊れているのでは?」とのこと。OSの再インストールでもすればいいのでしょうか?できれば参照設定かなんかでファイルをアサインしてon error gotoが実行されるようにしたいのですが・・・ムリですか?
- ベストアンサー
- その他([技術者向] コンピューター)
- VBA エラーハンドラーについて
VBAについてお教えください。テキストファイルを開いて、データ処理を行おうと思っています。 下記のような処理をおこなっています。 On Error GoTo ErrorHandler 'ファイル番号を取得 FNo = FreeFile Do While Not EOF(FNo) ~~処理 ~~処理 Loop 'ファイルを閉じる Close #FNo ErrorHandler: ~~処理 end sub ループが無事に終わって、ファイルを閉じるところまで行くのは良いのですが、Close #FNoの後に処理がErrorHandler:に移ってしまいます。 特に問題が無ければ、ErrorHanderを飛び越えてend subに行くと思っていたのですが、認識が違うのでしょうか? それとも何らかのエラーが起こっているのでしょうか?
- ベストアンサー
- Visual Basic
- エクセルVBA 「On Error GoTo 0」について
「On Error GoTo 」ステートメントの意味は、だいたい理解しています。 「On Error GoTo 0」 ステートメントについて、ご教授お願いします。 参考書には「エラーのトラップ処理を無効にする」と載っていましたが、よくわかりません。 具体的にどのような使い方をするのか、簡単なコードで説明していただければ幸いです。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- Access(VBA)のエラー処理
いつもお世話になりますm(__)m Access2003(VBA)のエラー処理について教えて下さい。 いつも、エラー処理は、各private sub毎に記述しています。 例えば private sub A() on error goto ErrShori (処理など) exit sub ErrShori: (エラー処理) end sub private sub B() on error goto ErrShori (処理など) exit sub ErrShori: (エラー処理) end sub 上記のようにしていますが、エラー処理は共通で、どうにか1つの記述(?)で全てのプロシージャに対してエラー処理が出来ればと思っています。 いろいろ調べましたが見あたらず、今は一つ一つのプロシージャに「on error...」と書いています。 MDBファイル単位で「エラーがあるとこれを実行」のような共通のエラー処理を実装する事は出来ないのでしょうか? お詳しい方、是非ご教授下さい。可能であればサンプルを記述頂くと助かります。 宜しくお願い致しますm(__)m
- ベストアンサー
- Visual Basic
お礼
maruru01さん ありがとうございます!! なるほど、Err.Clearですね。 まったく この知識ありませんでした。 お陰様で、できました。感謝です! また、「先にファイルの存在チェックをする」方法も 採用させて頂いております。 発想の転換ですね!