2017-08-17 13 views
1

Excelを使用して異なるファイルを開くvbaコードがあります。ファイルが存在しないため、エラーが発生する可能性があります。私はMsgBoxを特定のファイルが存在しないというメッセージと共にこのようなエラーで作成したいと思います。Excel vba On Errorエラーに応じて異なるハンドラに移動する

は今、私は唯一の

On Error GoTo ErrorHandler 

ErrorHandler: 
    MsgBox("File is absent") 

しかし、私は正確にファイルが存在しないかを指定することはできません。エラーハンドラを使ってそれを達成する方法はありますか?たぶんいくつかの追加変数を介して?

EDIT:私は

Workbooks.Open Filename:=... 

を介してファイルを開くしかし、私は場合は、同様に

Dim fileTitle As String 
filetitle=Dir() 

ある場合は、1つは何をすべきかについて興味があります。

+0

何のコードファイル(複数可)を開くために使用していますか?Dir()ステートメントですか?そうであれば、s = Dir()は見つかった場合はファイルの名前を返し、見つからない場合は空の文字列を返します。それはすべてファイルをループする方法に依存します。あなたのコードを提供してください –

+3

*あなたが何をすべきかは、プログラムがファイルを開こうとする前にファイルが存在することを確認してから、適切にルーティングすることです(つまり、プログラムは利用できません)。エラーハンドラを使用してコードをスパゲッティにしないでください。代わりに、コードに適切なロジックを組み込んで、エラーを引き起こす未処理の例外を避け、正常終了してください。 –

+0

ファイルを開く前にFileSystemObjectを使ってファイルが存在するかどうかを確認するだけです – Zac

答えて

3

ではなくハードコーディングを経由してファイルパスを:それは前に存在を確認してください、そして、

Dim fileName As String 
fileName = "C:/path/to/my/file.xlsx" 

:ファイルパス/名を表すために変数を使用

Workbooks.Open Filename:=... 

あなたはそれを開こうとします:

If FileIsAccessible(fileName) Then 
    ' Do stuff 
Else 
    MsgBox fileName & " doesn't exist or cannot be opened" 
    Exit Sub 
End If 

Function FileIsAccessible(path$) As Boolean 
    Dim FF As Long 
    On Error GoTo EarlyExit 
    FF = FreeFile 

    'Does file exist? 
    ' Raises Error 53 if file not found 
    Open path For Input Access Read As FF 
    Close FF 

    'If file exist, is it accessible? 
    ' Raises error 70 if file is locked/in-use 
    FF = FreeFile 
    Open path For Binary Access Write As FF 
    Close FF 

EarlyExit: 
FileIsAccessible = (Err.Number = 0) 
End Function 
+0

ありがとう。私はあなたの方法を使用すると思います。あなたがコメントで話した 'FileSystemObject'の使い方を尋ねるのは大変ですか?あなたのカスタム機能は私には難しいようです。 – Ans

+0

はい、あまりにも多くの質問をしています。 FileSystemObjectで作業するために使用できる十分な文書があります:)それに問題がある場合は、特にFSOに関する別の質問をしてください。また、このカスタム関数は実装がはるかに簡単でなければなりません。文字通りコピー&ペーストしてコードに挿入し、必要に応じて呼び出すことができます。 –

2

これについては2つの方法があります。まず、提案したように(2つの方が簡単です)、各ファイルが正常に読み込まれた後に再割り当てするファイル名を持つ変数を作成できます。その名前は、失敗した場合にメッセージボックスに渡すことができます。この名前を渡すことだけが必要な場合は、これがより良い解決策です。

2番目のオプションは、複数のエラーハンドラを作成することです。エラーの処理方法をカスタマイズする必要がある場合は、ファイルの種類が不足しているために別のメッセージを表示したい場合にのみ、これをお勧めします。このオプションを使用すると、コードを厄介なものにすることができます(On Error GoTo ...ステートメントを複数回再割り当てする必要がありますが、より複雑なソリューションが必要な場合は考慮する価値があります)。

+0

あなたの答えをありがとう。私は、2番目のソリューションがどのように見えるのか不思議で、カスタマイズされたエラー処理構文を見つけることができませんでした。 – Ans

+0

@Ansそれはかなり醜いでしょう。基本的には、複数のエラーハンドラ(例えば、 'ErrorHandler1'、' ErrorHandler2'など)を用意し、別のものを使う必要があるたびに 'On Error GoTo'ステートメントを再割り当てする必要があります。 – RGA

1

これを試して、これはエラー処理に対処するための出発点です。

あなたのデスクトップにあるabc.xlsxファイルを開こうとしていて、このファイルがデスクトップに見つからない場合は、

エラー処理ラベルの前にExit Subを使用して、ファイルが見つかった場合に実行されないようにしてください。

Dim wb As Workbook 
Dim FilePath As String 

FilePath = Environ("UserProfile") & "\Desktop\abc.xlsx" 

On Error GoTo ErrorHandler 
Set wb = Workbooks.Open(FilePath) 
'Other stuff here if file was found and opened successfully 
' 
' 
' 
' 
Exit Sub 
ErrorHandler: 
    MsgBox Err.Number & vbNewLine & Err.Description, vbCritical, "File Not Found!" 
2

ファイルエラーが起こるその中で知っているので、あなたはまだ、エラーハンドラであなたの変数へのアクセス権を持っている:

Sub ... 
    Dim filename As String 
    On Error GoTo ErrorHandler 
    filename = Dir(...) 
    While filename>"" 
     Set wb = Workbooks.Open(filename) 
     ... 
     filename=Dir 
    Wend 
    Exit Sub 
ErrorHandler: 
    MsgBox "Error " & Err.Number & ": " & Err.Description & " File: " & filename 
End Sub 
関連する問題