VBAでファイル名に連番を付けて重複を防ぐ方法を紹介します。VBAツール開発で頻繁に使用するため、コピペで使用できるように連番付きファイルパス作成部分を関数にまとめました。
コピペ用コード
連番付きファイルパスを作成する関数
下記コピペ用の関数は「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
'同名ファイルが存在しない場合
newFilePath = filePath
Else
'同名ファイルが存在する場合
'拡張子と拡張子を除いたファイルパス取得
Dim extensionPosition As Long
extensionPosition = InStrRev(filePath, ".")
Dim exceptExtensionFilePaht As String '拡張子を除いたファイルパス格納用変数
Dim extension As String '拡張子格納用変数
If (0 < extensionPosition) Then
extension = Right(filePath, Len(filePath) - extensionPosition)
exceptExtensionFilePaht = Left(filePath, extensionPosition - 1)
Else
extension = ""
exceptExtensionFilePaht = filePath
End If
'連番文字列を生成
Dim i As Long
i = 1
Dim num As String
num = i
'連番付きの新しいパスを生成
newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
'同名のの連番付ファイル名が存在しなくなるまでループ
Do While (Dir(newFilePath) <> "")
i = i + 1
num = i
newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
Loop
End If
create_new_file_path = newFilePath
End Function
連番付きファイルパスを作成しFileCopyステートメントでコピーファイルを作成
デスクトップに用意した「test」フォルダ内の「text.txt」ファイルをデスクトップにコピーするというシンプルなサンプルコードを用意しました。
- デスクトップに「test」フォルダを作成し、その中に「text.txt」ファイルを格納します。
- 下記コードを実行すると、下記画像のようにデスクトップに「text.txt」ファイルのコピーが作成されます。
- ファイル名の重複がある場合、下記画像のようにファイル名の末尾に連番が付与されます。
VBA
Copy
Sub file_copy()
'デスクトップのパスを取得
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
Dim desktopPath As String
desktopPath = wsh.SpecialFolders("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
'同名ファイルが存在しない場合
newFilePath = filePath
Else
'同名ファイルが存在する場合
'拡張子と拡張子を除いたファイルパス取得
Dim extensionPosition As Long
extensionPosition = InStrRev(filePath, ".")
Dim exceptExtensionFilePaht As String '拡張子を除いたファイルパス格納用変数
Dim extension As String '拡張子格納用変数
If (0 < extensionPosition) Then
extension = Right(filePath, Len(filePath) - extensionPosition)
exceptExtensionFilePaht = Left(filePath, extensionPosition - 1)
Else
extension = ""
exceptExtensionFilePaht = filePath
End If
'連番文字列を生成
Dim i As Long
i = 1
Dim num As String
num = i
'連番付きの新しいパスを生成
newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
'同名のの連番付ファイル名が存在しなくなるまでループ
Do While (Dir(newFilePath) <> "")
i = i + 1
num = i
newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
Loop
End If
create_new_file_path = newFilePath
End Function
create_new_file_path()関数の使用方法
第一引数のfilePath
に保存時のファイルパスを指定することで使用可能です。
ファイルパスに重複がなければ、そのままのファイルパスを返します。
ファイルパスが重複している場合、ファイル名の末尾に連番を付与したファイルパスを返します。
引数について
- filePath (必須)
保存時のファイルパスを指定します。
Excel VBAで初心者を卒業したいという方におすすめの1冊
リンク
もみじ
入門書レベルの内容を理解できる方におすすめの1冊で、実務で必要なスキルを学ぶことができます。
具体的には、コーディングの作法や効率的なコーディング方法、CSVやWeb上のデータとの連携方法、そしてマクロの高速化などの実務で役立つスキルを学ぶことができます。