こんにちは、わたあめです。Excelの機能に検索・置換ってありますよね。この置換機能を使って、シート全体という範囲で文字列の置換を行いたい時にどうすれば?という記事です。サンプルマクロを紹介しています。
シート全体の置換をするマクロ(VBA)なのに、ブック全体の範囲で置換が行われてしまう…という場合は「」の章を参照してみてください!それでは、行ってみましょう。
シート全体に対して文字列置換を行うマクロ
シート全体の範囲で文字列置換を行うサンプルマクロ(VBA)を紹介していきます。完全一致・部分一致・大文字の区別あり/なしで少し記述が異なるので、分けて紹介していきます。
シート全体を指定するには、基本的にシート名を指定してCells.Replaceメソッドを使います。
完全一致で置換(小文字・大文字区別なし)
完全一致とは、文字数や文字の並びが完全に一致する検索方法です。例えば、「AAA」という文字列を検索するとします。すると「AAA」は検索対象となりますが、「AAAB」や「CAAAB」などは"AAA"が含まれているのにも関わらず、検索結果に現れず置換されません。
ThisWorkbook.WorkSheets("シート名").Cells.Replace What:="置換したい文字列", Replacement:="置換後の文字列", LookAt:=xlWhole
このLookAtのxlWholeが完全一致のセルを検索するという指定になっています。
完全一致で置換(小文字・大文字区別あり)
次は、完全一致検索だけど大文字と小文字を区別する場合。前章のマクロだと検索したい文字列「AAA」を検索すると「AAA」でもヒットしますが実は「aaa」の小文字でもヒットします。という事で、大文字小文字の区別も行い「aaa」が対象とならないマクロとなります。
ThisWorkbook.WorkSheets("シート名").Cells.Replace What:="置換したい文字列", Replacement:="置換後の文字列", LookAt:=xlWhole, MatchCase:=True
大文字小文字を区別する場合は、MatchCase:=Trueを指定します。
部分一致で検索(大文字・小文字区別なし)
次は部分一致です。完全一致と違い一部分でも一致すればOKという検索方法です。「AAA」を検索値とした場合、「AAA」はもちろん「BAAA」や「OAKAAA」などでもヒットします。
ThisWorkbook.WorkSheets("シート名").Cells.Replace What:="置換したい文字列", Replacement:="置換後の文字列", LookAt:=xlPart
LookAtの値が"xlWhole"から"xlPart"になっただけです。
部分一致で検索(大文字・小文字区別あり)
部分一致で、大文字小文字を区別したい場合、完全一致で述べたマクロと同じくMatchCase:=Trueを指定してあげればOKです。
ThisWorkbook.WorkSheets("シート名").Cells.Replace What:="置換したい文字列", Replacement:="置換後の文字列", LookAt:=xlPart, MatchCase:=True
おまけ:範囲を指定して置換するマクロサンプル
シート全体ではなく、範囲を指定して置換したいという場合もあると思いますので、おまけ的に指定した範囲のみ文字列を置換するマクロサンプルも載せておきます。
ThisWorkbook.WorkSheets("シート名").Range("セル範囲").Replace What:="置換したい文字列", Replacement:="置換後の文字列", LookAt:=xlWhole
範囲を指定するには、Cells.ReplaceをRangeで範囲指定すればOKです。例えばA1~C5の範囲を指定したいならRange("A1:C5")と言う書き方。A列~C列の範囲で文字列置換を行いたいならRange("A:C")と指定します。
シート全体指定なのにブック全体で置換されてしまう場合の対処法
シートを指定して一括置換するマクロ(VBA)にもかかわらず、実行するとブック全体が置換されている…ということありませんか?
これは、Excelの[検索と選択]という機能で[検索場所]を"ブック"にして、検索または置換すると、シートを指定をしていてもブック全体で置換されてしまうということが起こりました。
ブックを指定して検索という作業が発生しなければ発生しない問題ではありますが、ブック全体に対して手作業で検索と選択・置換作業を行う可能性もなきにしもあらずですよね。対処法としては、以下マクロです。
' シートを指定した検索処理
ThisWorkbook.WorkSheets("Sheet1").Columns(1).Find("")
' 置換処理
ThisWorkbook.WorkSheets("Sheet1").Cells.Replace What:="AAA", Replacement:="BBB", LookAt:=xlWhole
検索の範囲が「ブック」となってしまっているものを、「シート」でわざわざ検索しなおします。ここでは何かを検索したいという訳ではないので、検索文字列を指定せず(Find(""))検索しています。これで、検索範囲がブックからシートに無理やり変更となります。
Findをシート指定して走らせればOKなので、検索範囲はColumns(1)ではなくRange("A1:B1")とかでも良いのです。とにかく、どこでもいいから検索Findすれば良いみたいです。
さいごに
いかがだったでしょうか。Replaceの使い方の情報は出てきても、細かいところの情報に辿り着くのに時間がかかったのでまとめてみました。少しでも参考になれば幸いです。それでは、また!