プログラミング

【PR】を含みます。

【VBA】ファイル名に連番を付けて重複を防ぐ方法

【VBA】ファイル名に連番を付けて重複を防ぐ方法

VBAでファイル名に連番を付けて重複を防ぐ方法を紹介します。VBAツール開発で頻繁に使用するため、コピペで使用できるように連番付きファイルパス作成部分を関数にまとめました。

コピペ用コード

連番付きファイルパスを作成する関数

下記コピペ用の関数は「Excel VBA」だけではなく、「Access VBA」などでも使用可能です。

VBA
Copy
  1. Public Function create_new_file_path(ByVal filePath As String) As String
  2.     Dim newFilePath As String '新ファイルパス格納用変数
  3.     If (Dir(filePath) = "") Then
  4.         '同名ファイルが存在しない場合
  5.         newFilePath = filePath
  6.     Else
  7.         '同名ファイルが存在する場合
  8.         '拡張子と拡張子を除いたファイルパス取得
  9.         Dim extensionPosition As Long
  10.         extensionPosition = InStrRev(filePath, ".")
  11.         Dim exceptExtensionFilePaht As String '拡張子を除いたファイルパス格納用変数
  12.         Dim extension As String '拡張子格納用変数
  13.         If (0 < extensionPosition) Then
  14.             extension = Right(filePath, Len(filePath) - extensionPosition)
  15.             exceptExtensionFilePaht = Left(filePath, extensionPosition - 1)
  16.         Else
  17.             extension = ""
  18.             exceptExtensionFilePaht = filePath
  19.         End If
  20.         '連番文字列を生成
  21.         Dim i As Long
  22.         i = 1
  23.         Dim num As String
  24.         num = i
  25.         '連番付きの新しいパスを生成
  26.         newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
  27.         '同名のの連番付ファイル名が存在しなくなるまでループ
  28.         Do While (Dir(newFilePath) <> "")
  29.             i = i + 1
  30.             num = i
  31.             newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
  32.         Loop
  33.     End If
  34.     create_new_file_path = newFilePath
  35. End Function

連番付きファイルパスを作成しFileCopyステートメントでコピーファイルを作成

デスクトップに用意した「test」フォルダ内の「text.txt」ファイルをデスクトップにコピーするというシンプルなサンプルコードを用意しました。

  1. デスクトップに「test」フォルダを作成し、その中に「text.txt」ファイルを格納します。
    VBAでファイル名に連番を付けて重複を防ぐ方法_説明画像1
  2. 下記コードを実行すると、下記画像のようにデスクトップに「text.txt」ファイルのコピーが作成されます。
    VBAでファイル名に連番を付けて重複を防ぐ方法_説明画像2
  3. ファイル名の重複がある場合、下記画像のようにファイル名の末尾に連番が付与されます。
    VBAでファイル名に連番を付けて重複を防ぐ方法_説明画像3 VBAでファイル名に連番を付けて重複を防ぐ方法_説明画像4
VBA
Copy
  1. Sub file_copy()
  2.     'デスクトップのパスを取得
  3.     Dim wsh As Object
  4.     Set wsh = CreateObject("WScript.Shell")
  5.     Dim desktopPath As String
  6.     desktopPath = wsh.SpecialFolders("Desktop")
  7.     'コピー対象のファイルパス
  8.     Dim copyFilePath As String
  9.     copyFilePath = desktopPath & "\test\test.txt"
  10.     '保存時のファイルパス
  11.     Dim saveFilePath As String
  12.     saveFilePath = desktopPath & "\test.txt"
  13.     'ファイル名に重複があれば連番付きファイルパスを作成
  14.     Dim newSaveFilePath As String
  15.     newSaveFilePath = create_new_file_path(saveFilePath)
  16.     'ファイルコピー
  17.     FileCopy copyFilePath, newSaveFilePath
  18.     Set wsh = Nothing
  19. End Sub
  20. Public Function create_new_file_path(ByVal filePath As String) As String
  21.     Dim newFilePath As String '新ファイルパス格納用変数
  22.     If (Dir(filePath) = "") Then
  23.         '同名ファイルが存在しない場合
  24.         newFilePath = filePath
  25.     Else
  26.         '同名ファイルが存在する場合
  27.         '拡張子と拡張子を除いたファイルパス取得
  28.         Dim extensionPosition As Long
  29.         extensionPosition = InStrRev(filePath, ".")
  30.         Dim exceptExtensionFilePaht As String '拡張子を除いたファイルパス格納用変数
  31.         Dim extension As String '拡張子格納用変数
  32.         If (0 < extensionPosition) Then
  33.             extension = Right(filePath, Len(filePath) - extensionPosition)
  34.             exceptExtensionFilePaht = Left(filePath, extensionPosition - 1)
  35.         Else
  36.             extension = ""
  37.             exceptExtensionFilePaht = filePath
  38.         End If
  39.         '連番文字列を生成
  40.         Dim i As Long
  41.         i = 1
  42.         Dim num As String
  43.         num = i
  44.         '連番付きの新しいパスを生成
  45.         newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
  46.         '同名のの連番付ファイル名が存在しなくなるまでループ
  47.         Do While (Dir(newFilePath) <> "")
  48.             i = i + 1
  49.             num = i
  50.             newFilePath = exceptExtensionFilePaht & "(" & num & ")" & "." & extension
  51.         Loop
  52.     End If
  53.     create_new_file_path = newFilePath
  54. End Function

create_new_file_path()関数の使用方法

第一引数のfilePathに保存時のファイルパスを指定することで使用可能です。

ファイルパスに重複がなければ、そのままのファイルパスを返します。

ファイルパスが重複している場合、ファイル名の末尾に連番を付与したファイルパスを返します。

引数について

  1. filePath (必須)
    保存時のファイルパスを指定します。

Excel VBAで初心者を卒業したいという方におすすめの1冊

アイコン画像

もみじ

入門書レベルの内容を理解できる方におすすめの1冊で、実務で必要なスキルを学ぶことができます。

具体的には、コーディングの作法や効率的なコーディング方法、CSVやWeb上のデータとの連携方法、そしてマクロの高速化などの実務で役立つスキルを学ぶことができます。

-プログラミング
-, ,