ExcelVBAでのファイル保存

Excel
スポンサーリンク

今回の記事では以下のことを紹介します。

  1. VBAでファイルを保存する場合の基本的な方法
  2. 同じファイル名があった場合にファイル名に連番を付けて保存する方法
スポンサーリンク
スポンサーリンク

名前を付けて保存

VBAでファイルに名前を付けて保存するには「Save as」メソッドを使います。


ThisWorkbook.SaveAs Filename:="C:\Users\Desktop\サンプル.xlsm"

「Save as」メソッドの引数:Filenameに保存したい場所を指定します。

ファイル名:サンプル
保存場所:C:\Users\Desktop(Cドライブのデスクトップ)

同じファイルパスが存在している場合、アラートが表示されます。

「いいえ」または「キャンセル」を選択するとエラーになります。

アラート
エラー

Application.DisplayAlerts = Falseを使用することで、自動的に上書き処理されます。

Sub 名前を付けて保存()
  Application.DisplayAlerts = False
    ThisWorkbook.SaveAs Filename:="C:\Users\Desktop\サンプル.xlsm"
End Sub

【注意】現在操作しているファイル名が「サンプル」で、「サンプル2」に名前を付けて保存する場合、アクティブワークブックは保存後の「サンプル2」となります。
これはもちろん手動で処理した場合と同じ動きです。

VBAで処理する場合、どのファイルがアクティブなのか?を把握しておくことは重要です。

保存前
保存後
スポンサーリンク

コピーを保存

では、現在操作しているファイルをアクティブにしたまま、別ファイルとして名前を付けて保存する場合は「SaveCopyAs」メソッドを使用します。
同じファイルパスがある場合は、自動的に上書き保存されます。

※ThisWorkbook.Pathで現在操作しているファイルのパスを表します。

Sub 名前を付けて保存()
    ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\サンプル2.xlsm"
End Sub
コピーを保存
スポンサーリンク

拡張子を変更して保存する

例えば、現在の拡張子「.xlsm」「.xlsx」に変更したい場合は、SaveAsメソッドの引数:FileFormatに定数を指定します。

※ThisWorkbook.Pathで現在操作しているファイルのパスを表します。

Sub 名前を付けて保存()
    ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\サンプル.xlsx", FileFormat:=xlOpenXMLWorkbook
End Sub

主なファイルフォーマットの定数(Excel形式)

定数拡張子詳細
xlOpenXMLWorkbook.xlsxExcel ブック51
xlOpenXMLWorkbookMacroEnabled.xlsmExcel マクロ有効ブック52
xlWorkbookNormal.xlsExcel 97-2003 ブック-4143
xlExcel8.xlsExcel 97-2003 ブック
Excel2007以降
56
ファイルフォーマット定数表

「.xlsm」「.xlsx」に変更する場合、アラートが表示されます。「いいえ」を選択するとエラーになります。
同じファイルパスが存在する場合もアラートが表示されます。

アラート
エラー

Application.DisplayAlerts = Falseを使用することで、自動的に保存されます。

スポンサーリンク

同じファイル名があった場合に連番をつけて保存する

これまで紹介したものは全て、同じファイルパスがあった場合に、エラーを除けば上書き保存される処理ですが、自動的にファイル名末尾に連番を付けて、上書き保存を回避する処理を紹介します。

Sub ファイルの連番処理()
  Application.DisplayAlerts = False
    Dim Fname As String
    Dim FN As String
    Dim j As Long
   
    Fname = "C:\Users\Desktop\サンプル" 'ファイルパスを変数に格納
    Do
    FN = Dir(Fname & "(" & j & ")" & ".xlsx", vbNormal) 'Dir関数でファイルの存在確認
    If FN <> "" Then 'ファイルが存在すれば(条件分岐)
        j = j + 1
    End If
    Loop Until FN = ""
    
    ActiveWorkbook.SaveAs ThisWorkbook.Path & Fname & "(" & j & ")", xlOpenXMLWorkbook  '拡張子をxlsxにして、名前を付けて保存
End Sub
連番保存

0から順番に番号を振っていきます。

または、(番号)はいらないという場合には、変数jをバリアント型にして、下記のようにもできます。

Sub ファイルの連番処理()
    Application.DisplayAlerts = False
    Dim Fname As String
    Dim FN As String
    Dim j 'バリアント変数
   
    Fname = "C:\Users\Desktop\サンプル" 'ファイルパスを変数:Fnameに格納
    Do
    FN = Dir(Fname & j & ".xlsx", vbNormal) 'Dir関数でファイルの存在確認
    If FN <> "" Then 'ファイルが存在すれば(条件分岐)
        If IsEmpty(j) Then '変数jが空ならば
            j = 2 'jに2を格納(ファイル名に2を付けるため)
        Else
            j = j + 1 'jを1ずつ加算していく
        End If
    End If
    Loop Until FN = "" '同じファイル名がなくなるまでループ
    
    ActiveWorkbook.SaveAs Fname & j, xlOpenXMLWorkbook  '拡張子をxlsxにして、名前を付けて保存
End Sub
連番保存

補足:数字に確固を付ける処理

ファイル名自体が数字の場合、連番の数字には括弧が付けないとファイル名をごっちゃになって紛らわしいですよね。稀なケースかもしれませんが。。。その場合は下記の通り記述します。
(ファイル名を123とします)

Sub ファイルの連番処理()
    Application.DisplayAlerts = False
    Dim j As Long
    Dim Fname As String
    Dim FN As String
    j = 2
    Fname = ThisWorkbook.Path & "\123" 'ファイルパスを変数:Fnameに格納
    FN = Dir(Fname & ".xlsx", vbNormal) 'Dir関数でファイルの存在確認
    If FN = "" Then 'ファイルが存在しなければ
        ActiveWorkbook.SaveAs Fname, xlOpenXMLWorkbook
    Else
        Do
        FN = Dir(Fname & "(" & j & ")" & ".xlsx", vbNormal) 'Dir関数でファイルの存在確認
            If FN <> "" Then 'ファイルが存在すれば
                j = j + 1 'jを1ずつ加算していく
            End If
        Loop Until FN = "" '同じファイル名がなくなるまでループ
        ActiveWorkbook.SaveAs Fname & "(" & j & ")", xlOpenXMLWorkbook
    End If
End Sub

ファイルの存在を確認するDir関数については、こちらの記事で紹介しています。

ExcelVBAを使ったCSVデータの読み込み まとめ①
VBAを使用したCSVデータの一括読み込み方法について紹介しています。
スポンサーリンク

上書き保存

ファイルを上書き保存するには「Save」メソッドを使います。

Sub 上書き保存()
    ThisWorkbook.Save
End Sub

管理人Instagramはこちら(フォローお願いします!!)↓

・筆者オススメのVBAの本はこちら↓↓

ExcelVBA学習のおすすめの本5選
筆者オススメの「これは秀逸!」「これは1冊持っとくべき」と思えるExcelVBAの本を紹介しています。ExcelVBAの書籍選びで、どれを選んでよいか迷っておられる方に参考にしていただきたいです。
スポンサーリンク

まとめ

VBAのファイルの保存方法についてまとめてみました。是非、参考にしてみてください!

コメント

タイトルとURLをコピーしました