前回の記事では1つのエクセルブックを選択して、1番目のシートをマクロブックにコピーと自動リネームするコードを紹介しました。
今回は応用として、フォルダを選択してキーワードを含むエクセルブックのシートをコピーして自動リネームするコードを紹介します。

同じフォルダに各自治体の様式が入っていて、それを1つのブックにまとめて串刺し集計をするといった想定です。
Test()内でキーワードを「様式」と設定して実行すると

一撃でこの状態にできます。
Function SetSheetsName(ByVal fileName As String) As String
'-----------------------------------------
'
'ファイル名に自治体名が入っていれば
'01千代田区のようなシート名にする。
'
'-----------------------------------------
If InStr(fileName, "千代田") > 0 Then
SetSheetsName = "01千代田区"
ElseIf InStr(fileName, "中央") > 0 Then
SetSheetsName = "02中央区"
ElseIf InStr(fileName, "港") > 0 Then
SetSheetsName = "03港区"
ElseIf InStr(fileName, "新宿") > 0 Then
SetSheetsName = "04新宿区"
ElseIf InStr(fileName, "文京") > 0 Then
SetSheetsName = "05文京区"
ElseIf InStr(fileName, "台東") > 0 Then
SetSheetsName = "06台東区"
ElseIf InStr(fileName, "墨田") > 0 Then
SetSheetsName = "07墨田区"
ElseIf InStr(fileName, "江東") > 0 Then
SetSheetsName = "08江東区"
ElseIf InStr(fileName, "品川") > 0 Then
SetSheetsName = "09品川区"
ElseIf InStr(fileName, "目黒") > 0 Then
SetSheetsName = "10目黒区"
ElseIf InStr(fileName, "大田") > 0 Then
SetSheetsName = "11大田区"
ElseIf InStr(fileName, "世田谷") > 0 Then
SetSheetsName = "12世田谷区"
ElseIf InStr(fileName, "渋谷") > 0 Then
SetSheetsName = "13渋谷区"
ElseIf InStr(fileName, "中野") > 0 Then
SetSheetsName = "14中野区"
ElseIf InStr(fileName, "杉並") > 0 Then
SetSheetsName = "15杉並区"
ElseIf InStr(fileName, "豊島") > 0 Then
SetSheetsName = "16豊島区"
ElseIf InStr(fileName, "北区") > 0 Then
SetSheetsName = "17北区"
ElseIf InStr(fileName, "荒川") > 0 Then
SetSheetsName = "18荒川区"
ElseIf InStr(fileName, "板橋") > 0 Then
SetSheetsName = "19板橋区"
ElseIf InStr(fileName, "練馬") > 0 Then
SetSheetsName = "20練馬区"
ElseIf InStr(fileName, "足立") > 0 Then
SetSheetsName = "21足立区"
ElseIf InStr(fileName, "葛飾") > 0 Then
SetSheetsName = "22葛飾区"
ElseIf InStr(fileName, "江戸川") > 0 Then
SetSheetsName = "23江戸川区"
'ファイル名に市町村名を含まない場合は末尾10文字をシート名にする
Else
'シート名に使えない文字列が含まれていれば削除する
fileName = DeleteInvalidChars(fileName)
SetSheetsName = Right(fileName, 10)
End If
End Function
Function DeleteInvalidChars(fileName As String) As String
'シート名で扱えない文字列が含まれているときは削除する
Dim invalidChars As String
Dim i As Long
invalidChars = "/\?*:[]"
DeleteInvalidChars = fileName ' 元のファイル名を初期値として設定
For i = 1 To Len(invalidChars)
DeleteInvalidChars = Replace(DeleteInvalidChars, Mid(invalidChars, i, 1), "")
Next i
End Function
Function SelectFolder() As String
With Application.fileDialog(msoFileDialogFolderPicker)
.Title = "フォルダを選択してください"
.AllowMultiSelect = False
If .Show = -1 Then
SelectFolder = .SelectedItems(1)
End If
End With
End Function
Function GetExcelFilesWithKeyword(ByVal keyword As String) As Collection
Dim folderPath As String
Dim file As String
Dim files As New Collection
folderPath = SelectFolder()
' ユーザーがフォルダを選択しなかった場合は処理を終了
If folderPath = "" Then Exit Function
' フォルダパスの末尾にバックスラッシュがない場合は追加
If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
' 最初のファイルを検索
file = Dir(folderPath & "*.xls*")
' 全ファイルをループ
Do While file <> ""
' キーワードを含む場合にリストに追加
If InStr(1, file, keyword) > 0 Then
files.Add folderPath & file
End If
' 次のファイルを検索
file = Dir()
Loop
Set GetExcelFilesWithKeyword = files
End Function
Sub Test()
Dim fileList As Collection
Dim file As Variant
Dim sourceWorkbook As Workbook
Dim sourceSheet As Worksheet
Set fileList = GetExcelFilesWithKeyword("様式")
' キーワードを含むブックの1番目のシートをコピー
For Each file In fileList
Set sourceWorkbook = Workbooks.Open(file)
Set sourceSheet = sourceWorkbook.Sheets(1)
sourceSheet.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.count)
sourceWorkbook.Close SaveChanges:=False
'名前をセットする
ThisWorkbook.Sheets(ThisWorkbook.Sheets.count).Name = SetSheetsName(file)
Next file
End Subシートの名前の条件はSetSheetsName()、Test()でシートの選択やキーワード設定をしてください。
ChatGPTさんによる超詳細解説
Function SetSheetsName(ByVal fileName As String) As String
- Function SetSheetsName(ByVal fileName As String) As String
SetSheetsName関数は、引数として与えられたfileName(ファイル名)をもとに、シートの名前を設定するための関数です。
- If InStr(fileName, “千代田”) > 0 Then
InStr関数を使用して、fileNameに “千代田” という文字列が含まれているかどうかをチェックします。含まれていれば、その位置は0より大きくなります。
- SetSheetsName = “01千代田区”
- “千代田” が含まれている場合、シートの名前を “01千代田区” に設定します。
(以下の ElseIf ステートメントも同様に、異なる自治体名に対して異なるシート名を設定します。)
- Else
- もし
fileNameに上記のいずれの自治体名も含まれていない場合、Elseブロックのコードが実行されます。
- もし
- fileName = DeleteInvalidChars(fileName)
DeleteInvalidChars関数を使用して、fileNameからシート名に使えない文字を削除します。
- SetSheetsName = Right(fileName, 10)
Right関数を使用して、変更後のfileNameの右側から10文字を取り出し、それをシート名として設定します。
Function DeleteInvalidChars(fileName As String) As String
- Dim invalidChars As String
- シート名に使用できない文字を格納するための変数
invalidCharsを宣言します。
- シート名に使用できない文字を格納するための変数
- Dim i As Long
- ループのカウンタとして使用する変数
iを宣言します。
- ループのカウンタとして使用する変数
- invalidChars = “/?*:[]”
- シート名に使用できない文字を
invalidCharsに設定します。
- シート名に使用できない文字を
- DeleteInvalidChars = fileName
- 処理するファイル名を
DeleteInvalidChars関数の初期値として設定します。
- 処理するファイル名を
- For i = 1 To Len(invalidChars)
invalidCharsの各文字に対してループを行います。
- DeleteInvalidChars = Replace(DeleteInvalidChars, Mid(invalidChars, i, 1), “”)
Replace関数を使用して、invalidCharsに含まれる各文字を空文字列で置換します。
- Next i
- ループの次のイテレーションに進みます。
Function SelectFolder() As String
- With Application.FileDialog(msoFileDialogFolderPicker)
Application.FileDialogを使用して、フォルダ選択のダイアログを開きます。ここでのmsoFileDialogFolderPickerはフォルダを選択するためのダイアログを指定しています。
- .Title = “フォルダを選択してください”
- ダイアログのタイトルを “フォルダを選択してください” に設定します。
- .AllowMultiSelect = False
- 複数のフォルダを選択できないように設定します(一度に一つのフォルダのみ選択可能)。
- If .Show = -1 Then
- ダイアログが表示され、ユーザーがフォルダを選択した場合の処理を定義します。
.Showが -1 の場合は、ユーザーがフォルダを選択したことを意味します。
- ダイアログが表示され、ユーザーがフォルダを選択した場合の処理を定義します。
- SelectFolder = .SelectedItems(1)
- 選択されたフォルダのパスを
SelectFolder関数の戻り値として設定します。
- 選択されたフォルダのパスを
- End With
Withブロックの終了を示します。
Function GetExcelFilesWithKeyword(ByVal keyword As String) As Collection
- Dim folderPath As String
- フォルダのパスを格納する変数
folderPathを宣言します。
- フォルダのパスを格納する変数
- Dim file As String
- ファイル名を格納する変数
fileを宣言します。
- ファイル名を格納する変数
- Dim files As New Collection
- キーワードを含むファイルのパスを格納するための新しいコレクション
filesを作成します。
- キーワードを含むファイルのパスを格納するための新しいコレクション
- folderPath = SelectFolder()
SelectFolder関数を呼び出してユーザーが選択したフォルダのパスを取得し、folderPathに格納します。
- If folderPath = “” Then Exit Function
- ユーザーがフォルダを選択しなかった場合(
folderPathが空の場合)、関数から抜け出します。
- ユーザーがフォルダを選択しなかった場合(
- If Right(folderPath, 1) <> “” Then folderPath = folderPath & “”
folderPathの末尾がバックスラッシュ(\)でない場合、バックスラッシュを追加します。
- file = Dir(folderPath & “.xls“)
Dir関数を使用して、指定されたフォルダパス(folderPath)内の “.xls” または “.xlsx” 拡張子を持つ最初のファイル名を取得します。
- Do While file <> “”
- ファイル名が空でない間、ループを続けます。これによりフォルダ内の全てのExcelファイルをチェックできます。
- If InStr(1, file, keyword) > 0 Then
InStr関数を使用して、ファイル名にキーワードが含まれているかをチェックします。含まれていれば、その位置は0より大きくなります。
- files.Add folderPath & file
- キーワードを含むファイルの場合、そのパス(フォルダパス + ファイル名)を
filesコレクションに追加します。
- キーワードを含むファイルの場合、そのパス(フォルダパス + ファイル名)を
- file = Dir()
Dir関数を再度呼び出して、次のファイル名を取得します。
- Loop
Do Whileループの終わりを示します。
- Set GetExcelFilesWithKeyword = files
filesコレクションを関数の戻り値として設定します。これにより、キーワードを含む全てのExcelファイルのパスが格納されたコレクションを取得できます。
Sub Test()
- Dim fileList As Collection
fileListという名前のコレクション型の変数を宣言します。この変数は、キーワードを含むファイルのパスのコレクションを保存します。
- Dim file As Variant
fileという名前の変数を宣言します。これは、後でコレクションから取り出される各ファイルのパスを保持するために使用されます。
- Set fileList = GetExcelFilesWithKeyword(“様式”)
GetExcelFilesWithKeyword関数を呼び出して、”様式” というキーワードを含むファイルのパスのコレクションをfileListに設定します。
- For Each file In fileList
fileListコレクション内の各ファイルに対してループを行います。
- Set sourceWorkbook = Workbooks.Open(file)
Workbooks.Openメソッドを使用して、ループ内の現在のfile(ファイルパス)を開き、sourceWorkbookに設定します。
- Set sourceSheet = sourceWorkbook.Sheets(1)
sourceWorkbookの最初のシートをsourceSheetに設定します。
- sourceSheet.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
sourceSheetをコピーして、現在開いているワークブック(ThisWorkbook)の最後のシートの後に挿入します。
- sourceWorkbook.Close SaveChanges:=False
sourceWorkbookを保存せずに閉じます(SaveChanges:=False)。
- ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = SetSheetsName(file)
- 新しく挿入されたシートの名前を
SetSheetsName関数を使用して設定します。この関数はファイル名(file)を基に適切なシート名を生成します。
- 新しく挿入されたシートの名前を
- Next file
For Eachループのこの行は、コレクションfileList内の次のアイテム(つまり次のファイル)に移動します。ループはfileList内のすべてのアイテム(ファイル)に対して繰り返され、各ファイルに対して設定された処理(ワークブックを開いてシートをコピーし、名前を設定する)が実行されます。
- End Sub
- この行は
Sub Test()プロシージャの終わりを示します。このプロシージャは、特定のキーワードを含むExcelファイルを検索し、それらのファイルから最初のシートを現在開いているワークブックにコピーし、SetSheetsName関数を用いて適切な名前を付ける処理を行います。
- この行は











コメントを残す