エクセルで開いたファイルを保存する
説明
上書き保存する
ファイルを上書きする方法です。
ブックオブジェクト.Saveで上書き保存をします。
Workbooks.Save
ただ、これが存外くせもので下記条件の場合、上書きでない処理をします。
VBAにより、ブックを作成、ブックオブジェクトを用いて、そのブックオブジェクトを保存する場合です。
これは、数多くのVBAユーザーを葬ってきた(?)悪手です。
下記サンプルを見てください。
Sub Sample1()
Dim wb As Workbook
Set wb = Workbooks.Add
' 【wb.SaveAs "保存するパス"】が正しい
wb.Save
End Sub
上記サンプルの何がマズいのかというと、どこに保存するかが指定されていません。
その上、エラーにならず、PCの各個人のドキュメントフォルダに保存されるため、バグとしても見つけにくいのです。
具体的には「C:\Users\●●●(ユーザー名)\Documents\Book1.xlsx」といった具合です。
サンプル等を試しに実行する場合にやりがちな例です。
Sub Sample2()
'タブのファイル→新規より作成したブックに対して次の命令
ThisWorkbook.Save
End Sub
実行してしまうと、下の画像が表示されます。
上記の画像が表示されたら、回答するまでマクロが止まってしまいます。
「はい」を選択するとドキュメントフォルダに「Book1.xlsx」が保存されます。この時、マクロ入りのブックでも「.xlsx」の拡張子で保存してしまうため、マクロが全て破棄されます。
「いいえ」を選択すると、下記エラーが発生します。
実行時エラー '1004':
マクロなしのブックには、VB プロジェクトや XLM シートを保存できません。
どちらにしても、ユーザーは困惑させる作りになってしまうため、新規エクセルファイルを保存する場合には、次項の「名前を付けて保存する」を参照してください。
名前を付けて保存する
名前を付けて保存(別名保存)する方法です。
xlsx形式だけでなく、xlsm形式、csv形式等のフォーマットを選べます。
' 赤字部分が大事です。
Workbooks.SaveAs 保存するエクセルファイルのフルパス(拡張子省略可), 保存形式, _
パスワード, 書き込み用パスワード, 開いたときに読み取り専用を勧めるか
- 「保存するエクセルファイルのフルパス」は保存したいパス+ファイル名です。
拡張子を省略すると、第二引数で指定した保存形式の拡張子が自動的に追加されます。 - 「保存形式」は次の表を参考にしてください。
なお、Microsoft社のリファレンスを参考にさせてもらっています。 - 「パスワード」は開くために必要なパスワードです。
- 「書き込み用パスワード」は書き込みために必要なパスワードです。
この引数を設定したエクセルファイルを開くと、次の3択になります。 - パスワードを入力して書き込める状態で開く
- パスワードの入力が不要な読み取り専用で開く
- 開くこと自体をキャンセルするか
- 「開いたときに読み取り専用を勧めるか」はその名の通りです。
引数名 | 説明 |
---|---|
xlWorkbookDefault | xlsx 形式で保存します。 指定しない場合、原則としてこの形式で保存します。 |
xlOpenXMLWorkbookMacroEnabled | xlsm 形式で保存します。 マクロが入りのエクセルはこの形式です。 なお、第一引数のファイル名を指定するとき、拡張子を".xlsm"とつけて、第二引数で本項目の値を設定しないとエラーになります。 |
xlCSVUTF8 | CSV形式(UTF-8形式)で保存します。 |
xlWorkbookNormal | xls ブック(旧型式)で保存します。 |
xlHtml | HTML 形式で保存します。 |
なお、これでも引数の一部を省略しています。
さらに詳しく知りたい方は、Microsoft社のリファレンスをご参照ください。
次にサンプルです。
実行しているブックをファイル名「abc.xlsm」で保存します。
'実行しているブックをファイル名「abc.xlsm」で保存する。
Sub Sample3()
'パスを指定しないと、ユーザー → ドキュメントに保存されます。
ThisWorkbook.SaveAs "abc", xlOpenXMLWorkbookMacroEnabled
End Sub
次のサンプルは、新規ブックを作り、セルB2に"test"と書き込み保存します。
尚、マクロを実行する時は、ブックを保存してから実行してください。
'新規ブックを作り、セルB2に"test"と書き込み保存する。
Sub Sample4()
Dim wb As Workbook
Set wb = Workbooks.Add
wb.Worksheets("Sheet1").Range("B2") = "test"
'保存場所はマクロを実行しているエクセルと同じ場所。
wb.SaveAs ThisWorkbook.Path & "\NewBook"
wb.Close
Set wb = Nothing
End Sub
既に保存しようとしたファイル名と同名のファイル名が存在していた場合は、上書き保存をするかが問われます。
そのため、次のような『既に同名のファイルが存在している時の処理』が必要でしょう。
'Sample4の改良版
Sub Sample5()
Dim wb As Workbook
Set wb = Workbooks.Add
wb.Worksheets("Sheet1").Range("B2") = "test"
'同名のファイルが存在しているか
If (Dir(ThisWorkbook.Path & "\NewBook.xlsx") = "") Then
wb.SaveAs ThisWorkbook.Path & "\NewBook"
wb.Close
Else
'同名のファイルが保存しようとした場所に存在していたときの処理
MsgBox "同名のファイル名が存在していたため、保存しませんでした。"
End If
Set wb = Nothing
End Sub