文字列の中から文字列を検索して削除する方法を解説します。
目的に合わせて以下の3つを使い分けます。
- Replace関数で指定文字列を""に置換する
- Substitute関数で指定文字列を""に置換する
- Instr関数で見つかった位置の前方を取る(=後方を消す)
Replace関数で指定文字列を""に置換する
まずは一番基本となるReplace関数による置換です。
指定文字列を""に置換することでその文字列を削除できます。
Dim 元テキスト As String: 元テキスト = "ABC123あいうABC" MsgBox Replace(元テキスト, "ABC", "") ' 123あいう
単に指定文字列を消したいだけという場合は、
この基本コードを使用してください。
複数回指定文字列が登場する場合
文字列を削除する場合に処理が複雑になるのは、
対象の文字列が何度も登場する場合です。
その場合は目的に合わせて以下のコードで対応します。
第n文字目以降のみを削除
10文字目以降から文字列を検索して削除したい場合は、
Replace関数の第3引数「Start」を利用します。
Dim 元テキスト As String: 元テキスト = "ABC123ABCあいうABC" MsgBox Replace(元テキスト, "ABC", "", 10) ' あいう
ただしこのコードを見てわかる通り、
Startを指定すると10文字目以降を置換する |
のではなく、
Start以降の文字だけを取り出して、残った文字列を置換する |
という動きになります。
要するに、1~9文字目を消した上で、10文字目以降を置換します。
よって10文字目以降だけを検索して削除したい場合は、
Left関数で9文字目までを取得して結合する以下のコードを用いてください。
Dim 元テキスト As String: 元テキスト = "ABC123ABCあいうABC" MsgBox Left(元テキスト, 9) & Replace(元テキスト, "ABC", "", 10) ' ABC123ABCあいう
最初の1つだけを削除する
見つかった文字列のうち最初に見つかったものだけを削除したい場合は、
Replace関数の第4引数「Count」を指定します。
Dim 元テキスト As String: 元テキスト = "ABC123ABCあいうABC" MsgBox Replace(元テキスト, "ABC", "", , 1) ' 123ABCあいうABC ' または MsgBox Replace(元テキスト, "ABC", "", Count:=1) ' 123ABCあいうABC
今回は「1」を指定したため「最初の1つ」を削除しましたが、
2以降を指定すれば、「n個目までを削除」することが可能です。
Dim 元テキスト As String: 元テキスト = "ABC123ABCあいうABC" MsgBox Replace(元テキスト, "ABC", "", Count:=2) ' ABC123あいう
第n個目の文字列を削除する
2つ目の文字列をだけを削除したい場合は、
Replace関数で対応するのが難しくなります。
この場合はシート関数「SUBSTITUTE」の第4引数[置換対象]で対応できます。
Dim 元テキスト As String: 元テキスト = "ABC123ABCあいうABC" MsgBox WorksheetFunction.Substitute(元テキスト, "ABC", "", 2) ' ABC123あいうABC"
Substitute関数の第4引数[置換対象]は、
渡した数値番目に登場した文字列を置換します。
第n個目の文字列だけを削除したい場合はこちらを使用してください。
見つかった文字列の前後を削除する
見つかった文字列の前後も削除する場合は、
Instr関数で文字列の位置を調べて、その前後(左右)を取得します。
指定文字列より右側を削除
文字列より右側を削除 = Left(元の文字列, InStr(元の文字列, 検索文字列) - 1)
指定文字列より左側を削除
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列))
文字列から文字列を削除
削除開始位置 = InStr(元の文字列, 文字A) 削除終了位置 = InStr(元の文字列, 文字B) 文字Aから文字Bまでを消す = Left(元の文字列, 削除開始位置 - 1) _ & Mid(元の文字列, 削除終了位置 + 1)
今回は基本コードだけ記載しましたが、
これらの処理は状況に応じて細かい対応が必要な場合が多いです。
より詳しい解説は以下の記事を参照ください。
複数のセルに一括実行する
文字列の削除を多くのセルに対して一括実行する場合は、
RangeオブジェクトのReplaceメソッドを使う方法もあります。
セル範囲.Replace "ABC", "", Lookat:=xlPart
このコードでセル範囲に一気に実行することも可能です。
ただし、Replaceメソッドには以下の弱点があります。
- シートの「検索と置換」ダイアログと設定を共有してしまう
- 非表示セルに対して実行されない
よってなるべく使用を避けたいところなのですが、
ワイルドカードを使用できるという、Replace関数にはないメリットもあります。
' カッコの中身ごと消す セル範囲.Replace "ABC", "(*)", Lookat:=xlPart
詳しくは以下のページで違いを説明していますので、
用法、用量を守って正しく使用してください。