ブックを保存できないフォルダ


次のコードは、カレントフォルダにあるBook1.xlsxを開きます。

Sub Sample1()
    Workbooks.Open "Book1.xlsx"
End Sub

カレントフォルダにBook1.xlsxがあれば、問題なくBook1.xlsxが開かれます。あ、すでにBook1.xlsxを開いているとエラーになりますが、今回はそういうのナシです。

こうして開いたアクティブブックに、名前を付けて保存します。保存するフォルダは同じところ。名前をSample.xlsxにしましょうか。

Sub Sample2()
    Dim SaveFileName As String
    SaveFileName = ActiveWorkbook.Path & "\Sample.xlsx"
    ActiveWorkbook.SaveAs SaveFileName
End Sub

何も問題はありませんよね。でもエラーになりました。

コードだけをいくら眺めていても原因はわかりませんね。実は、これがマズイんです。

指定したファイルの名前に次のいずれかの文字も含まれていないことを確認します :

< > ? [ ] : | *

保存しようとしたファイル名を表示して確認してみましょう。

Sub Sample2()
    Dim SaveFileName As String
    SaveFileName = ActiveWorkbook.Path & "\Sample.xlsx"
    MsgBox SaveFileName
    ActiveWorkbook.SaveAs SaveFileName
End Sub

実は、ファイルを保存しようとしたパス名に[]が含まれていたんです。

Excelでファイル名に[]を使えない理由

Windowsでは、フォルダ名に[]を使うことは許されています。

では、なぜExcelではファイル名に[]を使えないのでしょう。それは、Excelが、ほかのブックやシートを参照するときのルールが理由です。試しに、Book1.xlsxとBook2.xlsxを開いている状態で、Book2からBook1のセルを参照してみましょう。

Excelでは、ほかのブックへの参照式は、次のように記述します。

[ブック名]シート名!セルのアドレス

おわかりですね。[]はブック名を区切る記号として使われるので、もしファイル名やシート名に[]が含まれていると、ブック名の区切りが分からなくなってしまうんです。だから、シートの名前にも[]は使えません。

手動操作では、そもそもシート見出しに[]を入力できませんし、マクロで設定しようとしても

あるいは、[名前を付けて保存]ダイアログボックスから、[Test].xlsxのような名前で保存しようとしてもエラーになります。

さきほど見たように、Windowsでは[]をパス名やファイル名に指定できます。これを嫌うのはExcelの事情です。

でも、待ってください。それなら、どうして「C:\sample\[Test]\Book1.xlsx」を開けたのでしょう。実は、ファイル名を含むパスに[]が使われていても、そのブックを開いたり、上書き保存することはできるんです。次のコードは、どちらもエラーになりません。

Sub Sample3()
    Workbooks.Open "C:\Sample\[Test]\Book1.xlsx"
End Sub

Sub Sample4()
    ActiveWorkbook.Save
End Sub

[]を含むフォルダに保存するには

Excelで名前を付けて保存するとき、ファイル名に[]が使えないのは、しかたがないと思います。Excelのデータを、Excelのルールに従って保存するのですから、ファイル名に[]が使えないと言われれば、それまでです。しかし、フォルダに罪はありません。たとえば「C:\Work\東京\[2009]\実績\」みたいなフォルダを作って、ここにさまざまなファイルを保存していたとして、ほかのアプリは問題なくデータを保存できるのに、Excelだけ「保存できません」ってのは、ちょっと困ります。だって、別の場所(フォルダ)に保存して、エクスプローラなどを使って手動で移動すれば保存できるのですから。まったく無理ならともかく、手動でやればできるんだったら、新規保存もさせてよって思います。

では、[]を含むフォルダに名前を付けてブックを保存するには、どうしたらいいでしょう。実は、答えは上に、すでに書いています。たとえば「C:\Sampe\[Test]\」というフォルダに、名前を付けてブックを保存するとき、

Sub Sample5()
    ActiveWorkbook.SaveAs "C:\Sample\[Test]\Sample.xlsx"
End Sub

のように指定することはできません。保存するファイル名(のパス)に[]が含まれていてはいけないからです。では、パスを指定しないで

Sub Sample5()
    ActiveWorkbook.SaveAs "Sample.xlsx"
End Sub

としたらどうでしょう。このときアクティブブックはカレントフォルダに、Sample.xlsxとして保存されます。保存するファイル名に[]を含めることができないのなら、カレントフォルダを「C:\Sample\[Test]\」に移動しておき、SaveAsメソッドにはパスを指定しないでブック名だけを指定すればいいんです。

Sub Sample5()
    ChDrive "C"
    ChDir "C:\Sample\[Test]"
    ActiveWorkbook.SaveAs "Sample.xlsx"
End Sub

これで、[]が含まれるパスにブックを保存することができます。

言うまでもありませんが、この方法は「[]が含まれるパス(フォルダ)に、[]が含まれないブック名」を保存できるだけです。SaveAsメソッドで、[]が含まれるブック名で保存することはできません。どうしてもやるなら、保存した後でリネームでしょうね。