の続き(なお、Excelのマクロに限る)
主な参考資料①にSaveAsメソッドについて(ベーシック受験者向けということもあり)ざっくり書いてあったけど、絶対パスによる使い方しかなく実用的ではないなと感じたので、ちょっと調べた時の備忘録
そもそも・・・SaveAsメソッドの基本的な使い方に関する諸注意
(1)保存ファイル名は SaveAsの後の引数の中にパスとして書く
詳細
Sub 絶対パスで名前をつけて保存する例1()
Workbooks("Book2").SaveAs "C:\Users\各ユーザー名\Desktop\hogehoge.xlsx"
'各ユーザー名は個人のPCに依ります
End Sub
ベテランの方からすると、たぶんしょうもないレベルだが、
まず、そもそもこのマクロで保存した際にデスクトップにできるExcelファイルは「Book2」ではなく、「hogehoge.xlsx」である。
少しくどいが整理すると以下のようになる。
Save「As」という名前だから言われてみたらまあそうなんだが・・
Sub 絶対パスで名前をつけて保存する例2()
Workbooks("エクセルファイル新規作成毎に上に連番で自動表示されるブック名").SaveAs "ブックを保存するディレクトリのパス\保存ファイル名.xlsx"
End Sub
なお、Excelを最初に開いたときは「Book1」のため、新規エクセルファイルを1つ開いた状態でVBEに冒頭の「絶対パスで名前をつけて保存する例1」のプロシージャを書いて実行すると、「Book2」のところが引っかかって以下のようにエラーになる
(2)マクロ有効ブック(.xlsm)として既に保存されているファイルにおいて、SaveAsを使われている場合、引数も.xlsmにしないと高い確率でエラーになる
詳細
要するに
Sub エラー例()
Workbooks("Book1.xlsm").SaveAs "ブックを保存するディレクトリのパス\hogehoge.xlsx"
'▲
End Sub
だと、保存されてできるhogehogeファイルが(親に当たるマクロ有効ファイルに対して)マクロ有効ファイルでないからエラーになる。実際に試してもらうと以下のようなメッセージが出る
なので以下のように繰り返しの使用を考えるなら、最後の拡張子は「.xlsm」にした方がおそらく安全
Sub 絶対パスで名前をつけて保存する例2()
Workbooks("Book1.xlsm").SaveAs "ブックを保存するディレクトリのパス\hogehoge.xlsm"
'▲
End Sub
(3)マクロ有効ブック(.xlsm)をマクロが有効なままコピーして保存する(バックアップ)には、SaveAsではなく、SaveCopyAsを使うらしい。
以下のマクロを標準モジュールに入れて実行すると、コピーはされるがマクロは保持されていない
Sub マクロ有効ブックをマクロなしでコピー()
ThisWorkbook.Sheets.Copy '全シートコピー → 新規ブック作成
ActiveWorkbook.SaveAs _
"ブックを保存するディレクトリのパス\hogehoge2.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
End Sub
そのため、マクロを有効にしたままコピーしたい場合は
Sub コピー保存()
ThisWorkbook.SaveCopyAs _
"ブックを保存するディレクトリのパス\hogehoge2.xlsm"
End Sub
(4)雛形.xlsm に入れる生成マクロ例の雛形をチャッピーに作ってもらった
Sub 作業用ファイル生成()
Dim 保存先 As String
Dim 新ファイル名 As String
'保存フォルダとして生成マクロがあるブックのあるフォルダの直下のworkフォルダ
保存先 = ThisWorkbook.Path & "\work\"
'ファイル名(日時付き)
新ファイル名 = "作業用_" & _
Format(Now, "yyyymmdd_hhnnss") & ".xlsm"
'雛形を丸ごとコピー
ThisWorkbook.SaveCopyAs 保存先 & 新ファイル名
'生成したブックを開く
'Workbooks.Open 保存先 & 新ファイル名
End Sub
主な参考資料
①この1冊で合格! 永井雅明のExcel VBA ベーシック テキスト&問題集
②Microsoft公式 Workbook.SaveAs メソッド
https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbook.saveas
③Microsoft公式 Workbooksオブジェクト
https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbooks
③現在のExcelファイルを基準に相対パスで指定したファイルを開く @ShineYamamoto(M Yamamoto)さん Qiita
https://qiita.com/ShineYamamoto/items/1e6545b47e5f27d5fbfc
④VBA カレントディレクトリと相対パスの書き方 Tipsfoundさん著
https://www.tipsfound.com/vba/18028-vba

