今回の記事では以下のことを紹介します。
- VBAでファイルを保存する場合の基本的な方法
- 同じファイル名があった場合にファイル名に連番を付けて保存する方法
名前を付けて保存
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 | .xlsx | Excel ブック | 51 |
xlOpenXMLWorkbookMacroEnabled | .xlsm | Excel マクロ有効ブック | 52 |
xlWorkbookNormal | .xls | Excel 97-2003 ブック | -4143 |
xlExcel8 | .xls | Excel 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関数については、こちらの記事で紹介しています。
上書き保存
ファイルを上書き保存するには「Save」メソッドを使います。
Sub 上書き保存()
ThisWorkbook.Save
End Sub
管理人Instagramはこちら(フォローお願いします!!)↓
・筆者オススメのVBAの本はこちら↓↓
まとめ
VBAのファイルの保存方法についてまとめてみました。是非、参考にしてみてください!
コメント