Wordで複数の空白スペースを一つに置換する方法をご紹介しました。
実務では、ExcelデータやCSVデータを受け取ったときなどにも、これと似たような処理を欲しくなることがあります。
同じ文字列が連続しているデータがあり、それを一つにしたいという要望が実務で出てくることがあります。
具体的な例をあげると、
「おめでとう!!!!!」
といったデータが入力されているときに
「!」が連続しているのでこれを一つだけにして
「おめでとう!」
にしたいといった要望です。
この例のように「!」が必ず5つ連続しているといいきれるのなら、Excel標準のワークシート関数・SUBSTITUTEを使ったり、置換機能で一つにすることも可能ですが、いくつ連続するか決まっていない場合、Excel標準の機能だけで対処するのはなかなか難しそうです。
こういった要望のためにVBA(Visual Basic for Applications)で、以下のようなユーザー定義関数を作ってみました。
Function RemoveConsecStrings(strOrg As String, strRem As String) As String
Dim lngLen As Long
Do
lngLen = Len(strOrg)
strOrg = Replace(strOrg, strRem & strRem, strRem)
Loop While lngLen > Len(strOrg)
RemoveConsecStrings = strOrg
RemoveConsecStringsの、第1引数に元データを、第2引数には一つにしたい文字列を指定すると、第2引数に指定された文字列の連続が削除され一つになった文字列を返してくれます。
▼サンプルファイル(003727.xls 30KByte)ダウンロード
サンプルファイルのA列に「!」の何度か繰り返されているデータを入力して、B列に上記のユーザー定義関数・RemoveConsecStringsを使った
「=RemoveConsecStrings(A1,"!")」
という数式を入力してあります。
VBAのReplace関数を使うと、第1引数に指定された文字列から、第2引数に指定された文字列を探し、第3引数に指定された文字列に置換することができます。
このVBAのReplace関数を、Do・Loop文で何度も呼ぶようにしたのが、このRemoveConsecStrings関数です。
strOrg = Replace(strOrg, strRem & strRem, strRem)
という部分ではVBAのReplace関数の
第2引数に、strRem & strRem
第3引数に、strRem
を指定して、ユーザー定義関数・RemoveConsecStringsの第2引数に指定された文字列が二つ連続したら一つにしています。
ループ処理に入ってすぐの
lngLen = Len(strOrg)
で、変数に文字列の長さを一旦格納しておいて、指定された文字列が二つ連続しているときに一つに置換する処理
strRet = Replace(strOrg, strRem & strRem, strRem)
を実行して、
lngLen > Len(strOrg)
で、置換処理後の文字列長と先に長さを格納しておいたlngLenを比べ、処理前の文字列長が長い限り何度もループするという処理を行っています。
文字列が二つ連続していたら一つにするという
strOrg = Replace(strOrg, strRem & strRem, strRem)
が何度も実行されることになり、文字列がいくつ連続していても一つになるというわけです。
Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » 連続した文字列を削除して一つにするユーザー定義関数