Excel/VBA

エクセル 囲まれた文字抽出

エクセルでは囲まれた文字の抽出をする専用の関数が用意されていないので、実現するにはちょっと手間がかかります。基本的な考え方としては囲む文字の位置を導出した後、mid()関数を使い抽出する事になります。

substitute()関数を使っての抽出

“/”が2つ以上含まれている場合、最初に出てきた位置から最後に出てきた位置で囲まれた文字を抽出する際の方法は以下となります。例えば D2カラムに『test/123/456/789』という文字列が入っている場合、”123/456″ を抽出する方法がこちらの例です。(”123” を抽出する事はできません)

最初に出てきた位置
=FIND("●",SUBSTITUTE(D2,"/","●",1))

上記例で使っている”●”は、対象文字列(D2)に含まれていない事が前提です。含まれていない文字なら何でもかまいません。
substituteの第4パラメータは発生回数を意味します。これを1にする事で最初に見つかった「/」を「●」で置き換えたのち、find()関数で位置を導出しています。

最後に出てきた位置
=FIND("●",SUBSTITUTE(D2,"/","●",LEN(D2)-LEN(SUBSTITUTE(D2,"/",""))))

SUBSTITUTE(D2,”/”,””) は第4パラメータを省略することで、文字列(D2)に含まれる「/」全てを””で置き換えることになりLEN(D2)-LEN(SUBSTITUTE(D2,”/”,””)は「/」の数を導出しています。この値をsubstitute()関数の第4パラメータに指定する事で “最後に出てきた「/」” を●に置き換える事になり、結果「最後に出てきた位置」となります。

find関数を使っての抽出

以下のようにX番目に出てきた位置を求める事ができるので、任意の囲まれた文字列を抽出できますが、記載する関数が長くなりがちで限界が見えています。

1番目に"/"が出てきた位置
=FIND("/", D2)

2番目に"/"が出てきた位置
=FIND("/", D2, FIND("/", D2)+1)

3番目に"/"が出てきた位置
=FIND("/", D2,FIND("/", D2, FIND("/", D2)+1)+1)

マクロを使い関数の記載を簡単にする

不本意ですが、マクロを使えば上記課題をクリアできます。以下マクロをAlt+F11でVBAエディタを開きモジュールとして登録します。(登録したエクセルブック内ではどのシートでも利用可能になります)

X番目に登場する位置を導出するマクロ
Function NthOccurrence(text As String, find_text As String, occurrence As Integer) As Integer
    Dim pos As Integer
    Dim i As Integer
    pos = 0
    For i = 1 To occurrence
        pos = InStr(pos + 1, text, find_text)
        If pos = 0 Then
            Exit For
        End If
    Next i
    NthOccurrence = pos
End Function
利用例

以下のように10番目であっても簡単の記載する事ができるようになりました。

1番目に"/"が出てきた位置
=NthOccurrence(D2, "/", 1)

2番目に"/"が出てきた位置
=NthOccurrence(D2, "/", 2)

3番目に"/"が出てきた位置
=NthOccurrence(D2, "/", 3)
スポンサーリンク
タイトルとURLをコピーしました