Excel VBA の実行時エラー辞典
実行時エラー '54':ファイル モードが正しくありません
Open で指定したモード(Input・Output・Append・Binary・Random)と、読み書きの命令が合っているか確認します。
よくある原因
- For Input で開いたファイルに Print # や Write # で書き込んでいます。
- For Output や For Append で開いたファイルを、Input # などの読み込み用の命令で読んでいます。
- シーケンシャル モード(Input・Output・Append)で開いたファイルに Put や Get を使っています。
- 読み取り専用のファイルに書き込もうとしています。
直し方
- 停止した行のファイル番号を使っている Open 文を探し、For の後のモードを確認します。
- 読むなら For Input、新しく書くなら For Output、追記するなら For Append で開きます。読み書きを切り替えるときは Close してから開き直します。
- Put・Get を使う場合は For Binary または For Random で開きます。
- 書き込み先のファイルが読み取り専用になっていないか、ファイルのプロパティや保存場所の設定を確認します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
保存済みのブックと同じフォルダーにある log.txt へ 1 行追記する例です。修正後のコードは log.txt がなければ作成し、あれば末尾に追記します。修正前のコードは log.txt がないとエラー 53 になります。エラーで止まった後はファイルが開いたままになるため、イミディエイトで Close を実行してから再実行してください。
修正前
Dim fileNo As Integer
fileNo = FreeFile
Open ThisWorkbook.Path & "\log.txt" For Input As #fileNo
Print #fileNo, "処理を開始しました"
Close #fileNo
修正後
Dim fileNo As Integer
fileNo = FreeFile
Open ThisWorkbook.Path & "\log.txt" For Append As #fileNo
Print #fileNo, "処理を開始しました"
Close #fileNo
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- Open の行と停止した行でファイル番号が同じか確認します。FileAttr の 2 番目の引数に 1 を指定すると、開いたモードが数値で返ります(1=Input、2=Output、4=Random、8=Append、32=Binary)。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? fileNo, FileAttr(fileNo, 1)
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '52':ファイル名または番号が正しくありません
- 実行時エラー '55':ファイルは既に開かれています
- 実行時エラー '62':ファイルにこれ以上データがありません
- 実行時エラー '75':パス/ファイルのアクセス エラー