はじめに
「書き込みできません。」のエラーは、ファイル操作の際、何らかの原因でシステムが書き込みを行えなかった場合に発生します。
よくある事例としては以下のようなものがあります。
・コピー先のファイルが開いている
・コピー元のファイルが開いている
・「読み取り専用」ファイルを削除する
などがあります。尚、ファイル操作のコマンドでは別のエラーメッセージで警告される場合があります。
ここでは、「書き込みできません。」のエラーを再現してみましょう。
FileCopyでのエラー
FileCopyステートメントは、ファイルのコピーを行いますが、コピー元やコピー先が開いた状態だと「書き込みできません。」のエラーが出ます。
尚、FileCopyステートメントはコピー先のファイルが既に存在していても上書きされますので注意してください。
'書き込みエラー
Sub ErrorTest1()
FileCopy ThisWorkbook.FullName, ThisWorkbook.Path & "\Book1.xlsm"
End Sub
このプログラムでは、コピー元のブックに自分自身(ThisWorkbook.FullName)を指定しています。
実行する際は当然 ThisWorkbook は開いているので必ずエラーとなります。
'書き込みエラー
Sub ErrorTest2()
FileCopy ThisWorkbook.Path & "\Book1.xlsm", ThisWorkbook.FullName
End Sub
今度は、書き込み先に自分自身を指定しています。同じように書き込み先が開いているためエラーとなります。
読み取り専用ファイルを削除しようとした
FileSystemObjectのDeleteFileメソッドで、第2引数をFalseにしているにも関わらず読み取り専用ファイルを削除しようとした場合に「書き込めません。」のエラーが発生します。
DeleteFileメソッドの第2引数は、読み取り専用ファイルを削除するか否かの指定になります。Falseの場合は、読み取り専用ファイルを削除しません。第2引数を省略した場合はFalseとなります。
'書き込みエラー
Sub ErrorTest3()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFile "C:\tools\ReadOnly.xlsx" '読み取り専用ファイルを削除しようとした。
End Sub
このプログラムでは、読み取り専用ファイル(ReadOnly.xlsx)を削除しようとしたため、「書き込めません。」のエラーが発生します。
エラーを防ぐには、読み取り専用の属性を外すか、第2引数にTrueを設定して読み取り専用ファイルを削除可能にします。
尚、ファイルを削除する Killステートメントでは、違うエラーメッセージが表示されます。
まとめ
「書き込みできません。」のエラーは、現在開いているファイルをコピーしようとしたり、読み取り専用ファイルを削除しようとした時に発生します。
ファイルシステムがコピー、移動、削除などを行おうとした時に失敗しているはずなので、扱うファイルに問題がないか確認してみましょう。