こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2003-10-03 16:24:33

QNo.670457

すぐに回答ほしいです

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

こんにちは。maruru01です。

On Errorステートメントで逃げるのではなく、先にファイルの存在チェックをするべきでは?
あと、Variant型を使用するのは極力控えましょう。
ループカウンタは整数に決まっているので、IntegerかLongを使用しましょう。


Sub FileOpen()

  Dim N As Long
  Dim ret As String

  For N=1 To 100
    ret = Dir(ファイルの保存パス & N & ".csv")
    If Len(ret) = 0 Then
      MsgBox N & ".csvファイルが有りません"
    Else
      Workbooks.OpenText Filename:= N & ".csv"
    End If
  Next

End sub

投稿日時 - 2003-10-03 16:48:04

お礼

ありがとうございます。
このプログラム大変参考になりました!

ちなみに こういった処理で
On Error は あまり使わないのでしょうか?

投稿日時 - 2003-10-03 17:20:33

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

Sub FileOpen()

Dim N As Variant

On Error GoTo ErrorRtn:
Workbooks.OpenText Filename:= N & ".csv"

ErrorRtn:
MsgBox "Fileが有りません"
Resume
End sub

Resumeキーワードを使えばループを使わなくても戻れます。
ただ、このままではずっとファイルが存在しない限り処理が進まないので、Resumeで戻る前に何かしらの判断をつけてあげればいいでしょう。

もしくは、どうしてもループで処理したいのであれば、On Error Resume Nextを使用し、エラーが発生する可能性のある処理を呼び出した後にエラー番号をチェックします。

投稿日時 - 2003-10-03 18:32:57

ANo.1

For~Next の間に
行ラベル入れては
まずいかと。

For N = 1 To 100

 On Error GoTo ErrorRtn:
 Workbooks.OpenText Filename:=N & ".csv"
Next
Exit Sub

ErrorRtn:
MsgBox "Fileが有りません"
Resume Next

投稿日時 - 2003-10-03 16:45:23

お礼

ありがとうございます

ResumeNextの後は、エラー発生の "次"から再開としたら
再開後は、OpenFileには行かないのでしょうか??

投稿日時 - 2003-10-03 17:16:38

あなたにオススメの質問