セルの値を使ってブック名にするには
ブックを保存するとき「名前を付けて保存」で別名を付けることが出来ます。VBAではWorkbookオブジェクトのSaveAsメソッドを使うことで名前を付けて保存をすることが出来ます。
SaveAsメソッドの詳細については「VBAでブックに名前を付けて保存する(SaveAs)」をご参照ください。
通常のExcelでの「名前を付けて保存」を行う場合は、保存時のダイアログが表示され、そこでブック名を入力して保存する操作になりますが、事前にセルに保存したいブック名を書いておき、それを使ってブックの保存を行うことも可能です。
このような方法を採用する場合、以下のようないくつかのルールを決めておく必要があります。
- ブック名を書くセルはA1セルとする。
- ブック名はフルパスで指定する。
- 同名のブックが存在する場合は上書きダイアログを表示せずに強制的に上書きする。
- マクロを実行する際には名前を付けて保存するブックをアクティブにしておく。
などです。後述するマクロはこのルールに従っています。
なお、ブック名をフルパスで書く理由ですが、ブック名だけの場合はカレントフォルダに保存されてしまうため、それを避けるのが目的です。
セルの値を使ってブック名を保存するコード
以下のコードは、マクロブック(ここではmacro.xlsmとします)に保存しておきます。
そして、名前を付けて保存したいブックは別に用意します。そのため、ブックが2つ開いている状態でマクロを実行することになります。
名前を付けて保存したいブックは、新規ブックでも既存ブックでもどちらでも構いません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub SaveByCellValue() Dim sBookPath As String '// ブックパス Dim wbMacro As Workbook '// 当関数が書いてあるマクロブック Dim wb As Workbook '// 保存するブック Dim iFormat As XlFileFormat '// 保存するブックのファイル形式(.xlsxか.xlsmか) '// 既に同名ファイルが存在する場合の上書き確認ダイアログを出さない(強制上書き保存する)ようにする Application.DisplayAlerts = False '// A1セルを指定する当マクロブックを指定 Set wbMacro = ThisWorkbook '// 保存するブックとしてアクティブブック(最前面で表示しているブック)を指定 Set wb = ActiveWorkbook '// A1セルから保存するブックのフルパスを取得 sBookPath = wbMacro.Worksheets(1).Range("A1").Value '// A1セルのブック名の拡張子がxlsm(マクロブック)の場合 If (Right(sBookPath, 4) = "xlsm") Then '// .xlsmで保存 iFormat = xlOpenXMLWorkbookMacroEnabled Else '// .xlsxで保存 iFormat = xlOpenXMLWorkbook End If '// A1セルのパス+ブック名で名前を付けて保存 Call wb.SaveAs(Filename:=sBookPath, FileFormat:=iFormat) '// 確認ダイアログを元の設定に戻す Application.DisplayAlerts = True End Sub |
コードの説明
コメントに大体書いていますが、考え方を補足として説明します。
Excelで扱うブックには、通常のブック(.xlsx)とマクロブック(.xlsm)の2つがあります。
WorkbookオブジェクトのSaveAsメソッドは、ファイル形式を指定する引数としてFileFormat引数があります。このFileFormat引数は省略することが可能ですが、省略した場合は通常のブック(.xlsx)として保存するように扱われます。
そのため、FileFormat引数を省略している状態で、マクロブックの.xlsmのファイル名で保存しようとするとエラーになります。
このエラーを避けるために、A1セルに書いてある拡張子がxlsmであればマクロブックとみなし、そうでなければ通常ブックとみなすようにしてSaveAsメソッドのFileFormat引数を指定するようにしています。
使い方
- まず、macro.xlsmの標準モジュールに上記コードを書きます。
- 次に、macro.xlsmの一番左のシートのA1セルに、名前を付けて保存したいブックのフルパスを書きます。
- 名前を付けて保存したいブックをアクティブにします。まだこの時点で新規ブックの「Book1」とか既に存在しているブックを開いた状態のどちらでも構いません。
- あとは、macro.xlsmの標準モジュールに書いてあるSaveByCellValue関数を実行します。
実行後に、A1セルに指定したブック名で保存されます。
もし、macro.xlsmがアクティブの状態で実行すると、macro.xlsmがA1セルに指定したブック名で保存されます。そうならないようにガードを掛けてもいいのですが、コードが長くなるのでやっていません。