‘Replace With’テキストのワイルドカード(Microsoft Excel)
Anne-Mieは、ワイルドカード(?)を使用してExcelで検索できることを認識していますが、置換文字列でワイルドカードを使用できるかどうか疑問に思っています。たとえば、彼女は「abde」を検索して「aa * de」に置き換えたいと考えています。ここで、アスタリスクは任意の数の文字を表すか、まったく表しません。
簡単に言うと、説明したように、Excelでこれを行う方法はありません。テキスト値の2番目の文字を「b」から「a」に変換したいだけの場合は、かなり簡単に行うことができます。
=REPLACE(A1,2,1,"a")
ただし、これはおそらくあなたがやりたいことではありません。 「置換」テキストでワイルドカードを使用する方法が必要です。このような文字列置換を行うための専門用語はREGEXと呼ばれ、_Regular Expressionsの略です。_REGEXはPerlなどの言語で始まりましたが、他の多くのプログラミング言語が追加するほど強力でした。
Excelで使用されるVBAも例外ではありません。 REGEXを使用する最初のステップは、それをオンにすることです。これは、VBAエディタで[ツール] | [ツール]を選択して行います。参照してから、MicrosoftVBScript正規表現オプションの横にチェックマークが付いていることを確認します。利用可能なリファレンスのバージョンが複数ある場合は、最新バージョンを選択してください。
この参照を有効にすると、REGEXオブジェクトを作成できます。技術的には、マクロでバインディングをどのように発生させるかに応じて、オフのままにしておくことができます。後期対
の賛否両論に関する議論ただし、早期バインディングはこのヒントの範囲を超えているため、先に進んでREGEXリファレンスをオンにしてください。
REGEXオブジェクトには、TestメソッドとPatternプロパティがあります。これは、Patternプロパティを設定してから、Testメソッドがパターンが存在するかどうかを確認することを意味します。 REGEXオブジェクトには、置換を行うために使用されるReplaceメソッドもあります。
先に進む前に、正規表現は非常に複雑になり、「オタク」になる可能性があることを理解することが重要です。それを回避する方法はありません。正規表現をどのように扱うかは、本全体の主題となっています。幸い、このヒントの目的上、式は本質的にかなり単純です。この場合、パターン「^ ab.de $」を使用します。このパターンは、「ab」で始まり(^で示される)、その後に任意の式()で始まる単語を参照します
少なくとも1文字(ピリオドで示される)で構成され、「de」で終わる($で示される)。
これは、実際の置換を行うためのREGEXオブジェクトの使用を実装するコードです。
Public Function SearchNReplace1(Pattern1 As String, _ Pattern2 As String, Replacestring As String, _ TestString As String) Dim reg As New RegExp reg.IgnoreCase = True reg.MultiLine = False reg.Pattern = Pattern1 If reg.Test(TestString) Then reg.Pattern = Pattern2 SearchNReplace1 = reg.Replace(TestString, ReplaceString) Else SearchNReplace1 = TestString End If End Function
このマクロを使用するには、列Aで変更する文字列から始めます。最初の文字列がセルA1にあるとすると、変更されたテキストを取得するために、次の文字列を別のセルに配置できます。
=SearchNReplace1("^ab.*de$","^ab","aa",A1)
これにより、検索するパターンが「^ ab。* de $」であることがマクロに通知されます
(最初のパラメーター)、および「^ ab」を「aa」に置き換えたいこと。
この数式を列に貼り付けると、列Aが変換され、文字列「abde」が「aade」に置き換えられます。
何らかの理由でVBAでREGEX式を使用したくない場合は、選択したセルのグループをステップスルーし、「ab」で始まり「de」で終わるセルを探すマクロを作成できます。次に、最初の部分を「aa」に置き換えます。
Sub SearchNReplace2() Dim sFindInitial As String Dim sReplaceInitial As String Dim iLenInitial As Integer Dim sFindFinal As String Dim sReplaceFinal As String Dim iLenFinal As Integer Dim sTemp As String Dim rCell As Range sFindInitial = "ab" sReplaceInitial = "aa" sFindFinal = "de" sReplaceFinal = "de" For Each rCell In Selection sTemp = rCell.Value iLenInitial = Len(sFindInitial) iLenFinal = Len(sFindFinal) If Left(sTemp, iLenInitial) = sFindInitial And _ Right(sTemp, iLenFinal) = sFindFinal Then sTemp = Mid(sTemp, iLenInitial + 1) sTemp = Left(sTemp, Len(sTemp) - iLenFinal) sTemp = sReplaceInitial & sTemp & sReplaceFinal rCell.Value = sTemp End If Next Set rCell = Nothing End Sub
このルーチンを使用するには、変更するセルを選択してから、マクロを実行するだけです。必要に応じて、sFindInitial、sReplaceInitial、sFindFinal、およびsReplaceFinal変数にも変更を加える必要があります。
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(11170)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice 365のExcelに適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。