もくじ
VBAでファイルを保存する際、同名ファイルが存在すると上書きされてしまうリスクがあります。
本記事では、ファイル名の重複を自動で回避し、連番(例:test(1).txt)の付いたファイルパスを生成する関数を紹介します。
Excel VBAやAccess VBAなど幅広く使えるコピペ用コード付きです。
【VBAで連番ファイル名を作成】ファイル名の重複を防ぐ関数
VBAでファイルを保存する際、同じ名前のファイルがある場合、重複しないように連番付きのファイル名を作成することができます。
【コピペOK】連番付きファイルパスを作成する関数(create_new_file_path)
以下の関数は「Excel VBA」だけではなく、「Access VBA」などでも使用可能です。
VBA
Copy
Public Function create_new_file_path(ByVal filePath As String) As String
Dim newFilePath As String
' 指定したパスにファイルが存在しなければ、そのまま返す
If Dir(filePath) = "" Then
create_new_file_path = filePath
Exit Function
End If
' ファイルの拡張子位置を取得
Dim extensionPosition As Long
extensionPosition = InStrRev(filePath, ".")
' 拡張子を分ける
Dim exceptExtensionFilePath As String
Dim extension As String
If extensionPosition > 0 Then
extension = Mid(filePath, extensionPosition)
exceptExtensionFilePath = Left(filePath, extensionPosition - 1)
Else
extension = ""
exceptExtensionFilePath = filePath
End If
' ファイル名が重複しないように連番を作成
Dim i As Long: i = 1
Do
newFilePath = exceptExtensionFilePath & "(" & i & ")" & extension
i = i + 1
Loop While Dir(newFilePath) <> "" ' ファイル名が存在すれば繰り返す
create_new_file_path = newFilePath
End Function
create_new_file_path関数の使い方
ファイル名に「(1)」「(2)」のような連番が自動的に付与されるため、既存ファイルを上書きしてしまう心配がありません。
第一引数のfilePath
に保存時のファイルパスを指定することで使用可能です。
ファイルパスに重複がなければ、そのままのファイルパスを返します。
ファイルパスが重複している場合、ファイル名の末尾に連番を付与したファイルパスを返します。
引数について
- filePath (必須)
保存時のファイルパスを指定します。
【サンプルコード】連番付きファイルパスを作成しFileCopyステートメントでコピーファイルを作成
デスクトップに用意した「test」フォルダ内の「test.txt」ファイルをデスクトップにコピーするVBAコードを作成しました。
- デスクトップに「test」フォルダを作成し、その中に「test.txt」ファイルを格納します。
- 下記コードを実行すると、下記画像のようにデスクトップに「test.txt」ファイルのコピーが作成されます。
- ファイル名の重複がある場合、下記画像のようにファイル名の末尾に連番が付与されます。
VBA
Copy
Sub file_copy()
'デスクトップのパスを取得
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
Dim desktopPath As String
desktopPath = wsh.SpecialFdivders("Desktop")
'コピー対象のファイルパス
Dim copyFilePath As String
copyFilePath = desktopPath & "\test\test.txt"
'保存時のファイルパス
Dim saveFilePath As String
saveFilePath = desktopPath & "\test.txt"
'ファイル名に重複があれば連番付きファイルパスを作成
Dim newSaveFilePath As String
newSaveFilePath = create_new_file_path(saveFilePath)
'ファイルコピー
FileCopy copyFilePath, newSaveFilePath
Set wsh = Nothing
End Sub
Public Function create_new_file_path(ByVal filePath As String) As String
Dim newFilePath As String
' 指定したパスにファイルが存在しなければ、そのまま返す
If Dir(filePath) = "" Then
create_new_file_path = filePath
Exit Function
End If
' ファイルの拡張子位置を取得
Dim extensionPosition As Long
extensionPosition = InStrRev(filePath, ".")
' 拡張子を分ける
Dim exceptExtensionFilePath As String
Dim extension As String
If extensionPosition > 0 Then
extension = Mid(filePath, extensionPosition)
exceptExtensionFilePath = Left(filePath, extensionPosition - 1)
Else
extension = ""
exceptExtensionFilePath = filePath
End If
' ファイル名が重複しないように連番を作成
Dim i As Long: i = 1
Do
newFilePath = exceptExtensionFilePath & "(" & i & ")" & extension
i = i + 1
Loop While Dir(newFilePath) <> "" ' ファイル名が存在すれば繰り返す
create_new_file_path = newFilePath
End Function
リンク