Anne-Mieは、ワイルドカード(?)を使用してExcelで検索できることを認識していますが、置換文字列でワ​​イルドカードを使用できるかどうか疑問に思っています。たとえば、彼女は「abde」を検索して「aa * de」に置き換えたいと考えています。ここで、アスタリスクは任意の数の文字を表すか、まったく表しません。

簡単に言うと、説明したように、Excelでこれを行う方法はありません。テキスト値の2番目の文字を「b」から「a」に変換したいだけの場合は、かなり簡単に行うことができます。

=REPLACE(A1,2,1,"a")

ただし、これはおそらくあなたがやりたいことではありません。 「置換」テキストでワイルドカードを使用する方法が必要です。このような文字列置換を行うための専門用語はREGEXと呼ばれ、_Regular Expressionsの略です。_REGEXはPerlなどの言語で始まりましたが、他の多くのプログラミング言語が追加するほど強力でした。

Excelで使用されるVBAも例外ではありません。 REGEXはVisualBasic 6.0に追加されました。これは、Excel2003でExcelのVBAに移行したことを意味します。REGEXを使用する最初のステップはそれをオンにすることです。これを行うには、VBAエディタで[ツール]、[参照してから、MicrosoftVBScript正規表現5.5オプションの横にチェックマークが付いていることを確認します。

この参照を有効にすると、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         SearchNReplace = reg.Replace(TestString, ReplaceString)

Else         SearchNReplace = TestString     End If End Function

このマクロを使用するには、列Aで変更する文字列から始めます。最初の文字列がセルA1にあるとすると、変更されたテキストを取得するために、次の文字列を別のセルに配置できます。

=SearchNReplace1("^ab.*de$","^ab","aa",A1)

これにより、検索するパターンが「^ ab。* de $」であることがマクロに通知されます

(最初のパラメーター)、および「^ ab」を「aa」に置き換えたいこと。

この数式を列に貼り付けると、列Aが変換され、文字列「abde」が「aade」に置き換えられます。

REGEXオブジェクトを作成できない古いバージョンのExcelを使用している場合、または作成したくない場合は、選択したセルのグループをステップスルーして任意のセルを探すだけのマクロを作成できます。これは「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トレーニングのソースです。

このヒント(3303)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。