thumbnail 一問一答の一歩

【ExcelVBA】フォルダ内全てのエクセルファイルのセルの文字列を一括で置換する

仕事でエクセルの書類の作成を行う機会があったのだが、フォルダ内全てのファイルとなると、人力でエラーの部分の確認と修正も手間がかかるため、ExcelVBAにより作成したセルの確認と修正ツールを共有する。

STEP1プログラムの概要

本プログラムでは、以下のワ-クシ-トを前提とする。

以下のように、入力したフォルダパスの内部に複数のエクセルファイルがある時に、全てのエクセルファイルに対して検索対象の文字を含むセルがあった場合には、書き換えを行う。

STEP2:ソースコード

Sub replace_cell()
'----------------------------------------------
'概要: 指定したフォルダ内のテキストボックス内にを指定した文字列が含まれているかを確認する
'機能名: CheckTextBox
'引数: なし
'戻り値: なし
'備考:指定した文字がテキストボックスに含まれているファイルを検索する
'----------------------------------------------

	Dim myPath As String
	Dim kakutyoshi As String
	Dim search_str As String
	Dim replace_str As String
	Dim myBook_name As String
	Dim mySheet_name As String
	Dim book_number As Long
	Dim row_number As Integer
	Dim column_number As Integer
	Dim replace_flag As Integer

	myPath = ThisWorkbook.Worksheets(1).Cells(1, 2).Value & "\\"
	kakutyoshi = ThisWorkbook.Worksheets(1).Cells(2, 2).Value
	search_str = ThisWorkbook.Worksheets(1).Cells(3, 2).Value
	replace_str = ThisWorkbook.Worksheets(1).Cells(4, 2).Value
	'拡張子に値が設定されていなかったらデフォルトでxlsxをセット
	If kakutyoshi = "" Then
		kakutyoshi = "xlsx"
	End If
	'値の修正は行わないものと設定する
	replace_flag = 0
	'パス配下の設定した拡張子の最初のファイル名を返す
	myBook_name = Dir(myPath & "*" & kakutyoshi)
	book_number = 1
	'Dir関数がファイル名を返さなくなるまで繰り返す
	Do Until myBook_name = ""
		'ファイル名のブックを開く
		Workbooks.Open myPath & myBook_name
		For Each mySheet In Workbooks(myBook_name).Worksheets
			For row_number = 1 TO mySheet.Cells(Rows.Count,1).End(xlup).Row
				For column_number = 1 TO mySheet.Cells(Columns.Count,1).End(xlToLeft).Column
					If InStr(mySheet.Cells(row_number , column_number).Value, search_str) > 0 Then
						'1列目のセルにファイル名を書き込み
						ThisWorkbook.Worksheets(1).Cells(book_number + 9, 1).Value = myBook_name
						'2列目のセルにシート名を書き込み
						ThisWorkbook.Worksheets(1).Cells(book_number + 9, 2).Value = mySheet.name
						'3列目のセルに該当テキストを書き込み
						ThisWorkbook.Worksheets(1).Cells(book_number + 9, 3).Value = mySheet.Cells(row_number , column_number).Value
						If replace_flag <> 0 Then
							'検索した文字列の書き換え
							mySheet.Cells(row_number , column_number).Value = Replace(mySheet.Cells(row_number , column_number).Value, search_str, replace_str)
						End If
						'book番号を1増やす
						book_number = book_number + 1
					END IF
				Next column_number
			Next row_number
		Next mySheet
		'ブックが変更されていない
		IF Workbooks(mybook_name).Saved = True Then
			Workbooks(mybook_name).Close SaveChanges := False
		'ブックが変更されている
		Else
			Workbooks(mybook_name).Close SaveChanges := True
		End If
		myBook_name = Dir
	Loop

End Sub