次のコードは、カレントフォルダにある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
実は、ファイルを保存しようとしたパス名に[]が含まれていたんです。
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メソッドで、[]が含まれるブック名で保存することはできません。どうしてもやるなら、保存した後でリネームでしょうね。