VBAでエクセルファイルやCSVファイルを保存する

説明

上書き保存する

ファイルを上書きする方法です。
ブックオブジェクト.Saveで上書き保存をします。

Workbooks.Save

ただ、これが存外くせもので下記条件の場合、上書きでない処理をします。

  • VBAでブックを追加し、保存していない状態で行う場合
    VBAにより、新規ブックを追加、そのブックを保存する場合です。
    これは、数多くのVBAユーザーを葬ってきた(?)悪手です。
    下記サンプルを見てください。

    Sub Sample1()
        Dim wb As Workbook
        Set wb = Workbooks.Add
        ' 【wb.SaveAs "保存するパス"】が正しい
        wb.Save
    End Sub
    

    上記サンプルの何がマズいのかというと、どこに保存するかが指定されていません。
    その上、エラーにならず、PCの各個人のドキュメントフォルダに保存されるため、バグとしても見つけにくいのです。
    具体的には「C:\Users\●●●(ユーザー名)\Documents\Book1.xlsx」といった具合です。

  • Excelの新規作成から新規エクセルファイルで実行する場合
    新規作成後、一度も保存していないエクセルファイルで実行すると生じるエラーです。

    Sub Sample2()
        'タブのファイル→新規より作成したブックに対して次の命令
        ThisWorkbook.Save
    End Sub
    

    実行してしまうと、下の画像が表示されます。

    上記の画像が表示されたら、回答するまでマクロが止まってしまいます。
    「はい」を選択するとドキュメントフォルダに「Book1.xlsx」が保存されます。この時、マクロ入りのブックでも「.xlsx」の拡張子で保存してしまうため、マクロが全て破棄されます。
    「いいえ」を選択すると、下記エラーが発生します。 実行時エラー '1004':
    マクロなしのブックには、VB プロジェクトや XLM シートを保存できません。

    どちらにしても、ユーザーは困惑させる作りになってしまうため、新規エクセルファイルを保存する場合には、次項の「名前を付けて保存する」を参照してください。

名前を付けて保存する

名前を付けて保存(別名保存)する方法です。
xlsx形式だけでなく、xlsm形式、csv形式等のフォーマットを選べます。

' 赤字部分が大事です。
Workbooks.SaveAs 保存するエクセルファイルのフルパス(拡張子省略可), 保存形式, パスワード, 書き込み用パスワード, 開いたときに読み取り専用を勧めるか

  • 「保存するエクセルファイルのフルパス」は保存したいパス+ファイル名です。
    拡張子を省略すると、第二引数で指定した保存形式の拡張子が自動的に追加されます。
  • 「保存形式」は次の表を参考にしてください。
    なお、Microsoft社のリファレンスを参考にさせてもらっています。
    引数名説明
    xlWorkbookDefaultxlsx 形式で保存します。
    指定しない場合、原則としてこの形式で保存します。
    xlOpenXMLWorkbookMacroEnabledxlsm 形式で保存します。
    マクロが入りのエクセルはこの形式です。
    なお、第一引数のファイル名を指定するとき、拡張子を".xlsm"とつけて、第二引数で本項目の値を設定しないとエラーになります。
    xlCSVUTF8CSV形式(UTF-8形式)で保存します。
    xlWorkbookNormalxls ブック(旧型式)で保存します。
    xlHtmlHTML 形式で保存します。
  • 「パスワード」は開くために必要なパスワードです。
  • 「書き込み用パスワード」は書き込みために必要なパスワードです。
    この引数を設定したエクセルファイルを開くと、次の3択になります。
    1. パスワードを入力して書き込める状態で開く
    2. パスワードの入力が不要な読み取り専用で開く
    3. 開くこと自体をキャンセルするか
  • 「開いたときに読み取り専用を勧めるか」はその名の通りです。

なお、これでも引数の一部を省略しています。
さらに詳しく知りたい方は、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

関連リンク

ページの先頭へ