概要
「複数のExcelファイル内の文字列を全置換する方法」を説明する上で、文字列置換ツールを作成する手順を用いて説明していきます。作成するツールの仕様は、文字列を置換したいExcelファイルを「置換ファイル格納フォルダ」に格納し、マクロを実行することで、格納したフォルダ内のExcelファイルの文字列を置換します。
ツール作成手順
今回成するツールは、以下の2つの手順を実施するだけになります。
・文字列を置換するために必要な情報を入力
・Excelファイル内の文字列を置換
文字列を置換するために必要な情報を入力
文字列を置換する情報として以下の4点の入力情報が必要となります。
・置換対象ファイル格納フォルダ(置換したいファイルを格納するフォルダ)
・置換範囲(オブジェクト内文字列を含むか、オブジェクト内文字列を含まないか)
・置換前の文字列(置換前の文字列を指定する)
・置換後の文字列(置換後の文字列を指定する)
に情報を打ち込むダイアログを作成してもいいですが、今回は入力情報を設定するシートを作成しております。イメージは以下の用なシートになります。
「置換対象ファイル格納フォルダ」と「置換前の文字列」、「置換後の文字列」については説明は不要かと思いますので、「置換範囲」について説明致します。置換範囲は、図形などのオブジェクトの中に入力した文字列を置換するかしないかを選択することができる項目になります。詳細は以下で説明致します。
オブジェクト内文字列の置換
オブジェクト文字列を置換しないとどのような挙動になるかを以下で説明致します。以下の例では、「AAA」を「BBB」に文字列変換しています。右側のオブジェクト側は文字列の置換がされていません。「置換範囲」を【オブジェクト内文字列を含まない】にした場合、このような挙動となります。
【オブジェクト内文字列を含む】にした場合、以下のような挙動となります。
Excelファイル内の文字列を置換(VBAマクロ作成)
次に実際のソースコードを書いて説明していきます。最後に全体のソースコードを載せます。
以下の構成で説明していきます。
・変数定義
・入力情報のチェック
・文字列を置換
変数定義
マクロを作成する上で、使用する変数を一番初めに定義していきます。コードは以下になります。
'======================================================
' 変数定義箇所
'======================================================
Const BOOK_MODE = "オブジェクト内文字列を含まない"
Const OBJ_MODE = "オブジェクト内文字列を含む"
'置換対象ファイル格納フォルダ
Dim inputDir As String
'置換範囲
Dim mode As String
'置換前の文字列
Dim searchStr As String
'置換後の文字列
Dim replaceStr As String
入力情報のチェック
入力情報を入力するシートに値が設定されていることを確認します。入力するシート名称は仮に「出力設定」としてコードを書いていきます。
'======================================================
' 入力チェック箇所
'======================================================
'出力設定シートの値取得
inputDir = Cells(3, 3).Value '入力ファイル格納フォルダ
mode = Cells(6, 3).Value '置換範囲
searchStr = Cells(9, 3).Value '置換前の文字列
replaceStr = Cells(12, 3).Value '置換後の文字列
'入力ファイルパスに値が設定されているか
If inputDir = "" Then
MsgBox "置換対象ファイル格納フォルダの値が設定されていません。"
Exit Sub
End If
'置換範囲に値が設定されているか
If mode = "" Then
MsgBox "置換範囲が設定されていません。"
Exit Sub
End If
'置換前の文字列が設定されているか
If searchStr = "" Then
MsgBox "置換前の文字列が設定されていません。"
Exit Sub
End If
文字列の置換
置換対象ファイル格納フォルダに格納したExcelファイル内の文字列を指定した文字列に置換する箇所のコードを記載致します。置換する箇所は「置換対象」項目より、オブジェクト内まで置換するかオブジェクト内は置換しないかを選択できるようにしております。
'======================================================
' 文字列の置換
'======================================================
'入力フォルダにある全てのファイルを取得
Set FSO = New FileSystemObject
Set TARGET = FSO.GetFolder(inputDir).Files
'入力フォルダにあるファイル数分ループ
For Each TEMP In TARGET
'文字列を置換するファイルを開く
Workbooks.Open Filename:=inputDir & "\" & TEMP.Name
'ブック内の文字列を置換する
Dim worksh As Worksheet
Dim targetShape As Shape '置換対象の図形
Dim targetText As String '置換対象のテキスト
For Each worksh In ActiveWorkbook.Worksheets
'文字列置換処理
worksh.UsedRange.Replace What:=searchStr, Replacement:=replaceStr, LookAt:=xlPart
'オブジェクト内の文字列を置換する
If mode = OBJ_MODE Then
'ブック内の全てのオブジェクト数分ループ
For Each targetShape In worksh.Shapes
'テキストが存在するか確認
If targetShape.TextFrame2.HasText Then
targetText = targetShape.TextFrame.Characters.Text
targetShape.TextFrame.Characters.Text = Replace(targetText, searchStr, replaceStr)
End If
Next targetShape
End If
Next worksh
'開いたブックを閉じる
ActiveWorkbook.Close True
Next
ソースコード全体
上記で説明したソースコードをまとめて記載したものが以下になります。
'文字列置換マクロ
Sub replaceStr()
'======================================================
' 変数定義箇所
'======================================================
Const BOOK_MODE = "オブジェクト内文字列を含まない"
Const OBJ_MODE = "オブジェクト内文字列を含む"
'置換対象ファイル格納フォルダ
Dim inputDir As String
'置換範囲
Dim mode As String
'置換前の文字列
Dim searchStr As String
'置換後の文字列
Dim replaceStr As String
'======================================================
' 入力チェック箇所
'======================================================
'出力設定シートの値取得
inputDir = Cells(3, 3).Value '入力ファイル格納フォルダ
mode = Cells(6, 3).Value '置換範囲
searchStr = Cells(9, 3).Value '置換前の文字列
replaceStr = Cells(12, 3).Value '置換後の文字列
'入力ファイルパスに値が設定されているか
If inputDir = "" Then
MsgBox "置換対象ファイル格納フォルダの値が設定されていません。"
Exit Sub
End If
'置換範囲に値が設定されているか
If mode = "" Then
MsgBox "置換範囲が設定されていません。"
Exit Sub
End If
'置換前の文字列が設定されているか
If searchStr = "" Then
MsgBox "置換前の文字列が設定されていません。"
Exit Sub
End If
'======================================================
' 文字列の置換
'======================================================
'入力フォルダにある全てのファイルを取得
Set FSO = New FileSystemObject
Set TARGET = FSO.GetFolder(inputDir).Files
'入力フォルダにあるファイル数分ループ
For Each TEMP In TARGET
'文字列を置換するファイルを開く
Workbooks.Open Filename:=inputDir & "\" & TEMP.Name
'ブック内の文字列を置換する
Dim worksh As Worksheet
Dim targetShape As Shape '置換対象の図形
Dim targetText As String '置換対象のテキスト
For Each worksh In ActiveWorkbook.Worksheets
'文字列置換処理
worksh.UsedRange.Replace What:=searchStr, Replacement:=replaceStr, LookAt:=xlPart
'オブジェクト内の文字列を置換する
If mode = OBJ_MODE Then
'ブック内の全てのオブジェクト数分ループ
For Each targetShape In worksh.Shapes
'テキストが存在するか確認
If targetShape.TextFrame2.HasText Then
targetText = targetShape.TextFrame.Characters.Text
targetShape.TextFrame.Characters.Text = Replace(targetText, searchStr, replaceStr)
End If
Next targetShape
End If
Next worksh
'開いたブックを閉じる
ActiveWorkbook.Close True
Next
MsgBox "文字列の置換が完了致しました。"
End Sub
上記のソースをそのまま転記していただければ使用できますが、「FileSystemObject」を使用しているのでExcel側の設定を入れないといけない可能性があります。その場合「FileSystemObject 参照設定」でGoogle検索してください。参照設定する詳細がすぐに出てくると思います。(設定は手間かからずできます。
最後に
エンジニアとして細かくても技術力を上げていけば、個人でも会社でもお金を稼げるようになっていきます。私から3点お金を稼ぐための方法をおススメします。
副業サイトでお金を稼ぐ
一番最初が副業サイトでお金を稼ぐです!
私は、副業サイトのココナラで月にVBAを作成し月に2~3万円ほど稼いでいます。VBAを作成している人の提案を購入したり、自身でVBAを作成し販売することもできます。
プログラミング関連だけでなく、私のProfileのアイコンもココナラで頼んで1000円で作成してもらいました!登録は無料なので、是非登録してみてください。
キャリアアップのための転職をする
転職というと、そりゃ給料上がるだろ!って思う方が多いと思いますが、エンジニアは転職してなんぼの職種です。就職難の昨今でもエンジニアは現場に人が足りていません。そのため、ある程度のお金を払っても入社してくれる方を探している企業が多いのが現状です。
また、会社にもよりますが、多くの会社は入社してから数年間は雀の涙程度の給料しかあがっていきません。ただ、転職することで、100万円単位で年収が上がっていくこともざらにあります。
エンジニアは転職してキャリアアップしていく職種と言えます。
私も使用していましたが、やはり転職サイトは大手がいいでしょう!大手の方が、企業との付き合いも多く給与面も福利厚生面も手厚いところを紹介してくれます。
フリーランスエンジニアになる
最後はハードルが高そうに見えるフリーランスエンジニアになります。副業と転職に比べると確かにハードルは高いですが、皆さんが思っているような、何でもできるエンジニアの方はあまりいません。フリーランスエンジニアの方に話を聞くとやっぱり給与面でフリーランスになる方が多いです。
ただ、フリーランスエンジニアは、大手の用にはいかないですが、子会社と同じぐらいの100万円程度で雇ってもらい。そこから企業の取り分がないため、全額自分に入ってきます。福利厚生等はありませんが、金額だけ聞くと驚愕ですねw最近はフリーランスの人が入る団体等もあり、フリーランスの方が活躍できる環境が整ってきています。
フリーランスの方専用のスクール等もあるので、相談してみるのもいいと思います。
コメント