エラー内容
エラー55(ファイルは既に開かれています)はファイルを開く処理を行う際に出るエラーです。ファイル操作を行わない場合には発生しません。
エラーの原因
エラーの原因はメッセージの通りで「他処理がファイルを開いていること」と分かりやすいのですが、ではどの処理がファイルを開いているのかを調べるのは簡単ではありません。
そのため、実際にコードを書くときは、ファイルを開いた処理を探したりするのではなく、エラーが発生したときにはエラー処置を行う内容が扱いやすくなります。そのサンプルを後述しています。
1つのファイルを同時に複数の処理で書き込みは出来ない
VBAでファイルを扱う場合、ファイルを開いた処理やアプリケーションでしか書き込みが出来ません。ファイルを開いた処理やアプリケーションが読み込みのアクセスを不可としてファイルを開いた場合は読み込みも出来ません。
環境やプログラミング言語によっては1つのファイルに対して複数の処理から同時に書き込みを行うことは出来ますが、VBAでは出来ません。
エラーの対応方法
ネット上にある対応方法は「ファイルを閉じましょう」と紹介して終わっているものが多いのですが、VBAで自動処理をしようとしているのに手作業でファイルを開いている処理を探して閉じるという方法は現実的ではありません。
現実的な対応は、ファイルを開いて、エラーが発生した場合はエラー処理を行う、という方法です。
以下のサンプルコードではその対応方法で書いています。
サンプルコード
ファイルを開く関数です。エラーが発生した場合はエラー番号とエラー内容をイミディエイトウィンドウに出力します。
引数1=ファイルパス
引数2=ファイル番号
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub OpenFile(sFilePath, iFileNumber) On Error GoTo ERR iFileNumber = FreeFile Open sFilePath For Append Access Write As iFileNumber Exit Sub ERR: If ERR.Number <> 0 Then Debug.Print "エラー" & ERR.Number & ":" & ERR.Description End If End Sub |
上の関数を呼び出す関数です。
8行目で最初に開き、11行目で上の関数で再度開く際にエラー55が発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Err55Test() Dim sFilePath Dim iFileNumber sFilePath = "C:\web\abc111.txt" '// 1回目ファイルオープン Open sFilePath For Append Access Write As #100 '// 2回目ファイルオープン(関数内でエラー55発生) Call OpenFile(sFilePath, iFileNumber) Close iFileNumber Close #100 End Sub |