よく使う Excel 数式 – 区切り文字以降/以前の文字列を抽出する(標準数式 / VB)

Excel

Excel の標準の数式とVB、それぞれを使って区切り文字以降 / 区切り文字以前を取得する方法です。

サマリ

前提:

  • B1 に区切り文字、B2 に対象の文字列がある場合
  • 数式中の @ は対象文字列中に存在しない文字である必要がある
やりたいこと数式
区切り文字(最初に見つかったもの)以降を取得 =RIGHT(B2,LEN(B2)-FIND(B1,B2))
区切り文字(最後に見つかったもの)以降を取得=RIGHT(B2,LEN(B2) – FIND(“@”,SUBSTITUTE(B2,B1,”@”,LEN(B2)-LEN(SUBSTITUTE(B2,B1,””)))))
区切り文字(最初に見つかったもの)以前を取得=LEFT(B2,FIND(B1,B2)-1)
区切り文字(最後に見つかったもの)以前を取得=LEFT(B2,FIND("@",SUBSTITUTE(B2,B1,"@",LEN(B2)-LEN(SUBSTITUTE(B2,B1,""))))-1)

結果は以下の通り

少し補足すると、最後に見つかったものを起点にする場合は、一度任意文字(上の例では @ )に変換し、その情報をもとに検索をしています。上の数式の SUBSTITUTE(B2,B1,"@",LEN(B2)-LEN(SUBSTITUTE(B2,B1,""))) の結果は aaaaa.bbb..ccc...ddd@eeeeeeeeeee です。

おまけ

最近うわさの chatGPT に上の数式を VB にしてもらいました。

上が 区切り文字以降を取得する関数 extractString で、後者が区切り文字以前を取得する関数 GetSubstringBefore です。
説明の付け方が違いますが、一瞬で作ってくれました。

' 文字列 str 中の最初の delim 以降の部分文字列を抽出する関数
' lastOccurrence が True の場合、文字列 str 中の最後の delim 以降の部分文字列を抽出する
Function extractString(str As String, delim As String, Optional lastOccurrence As Boolean = False) As String
    Dim pos As Long
    If lastOccurrence Then
        pos = InStrRev(str, delim)
    Else
        pos = InStr(str, delim)
    End If
    
    If pos > 0 Then
        extractString = Mid(str, pos + Len(delim))
    Else
        extractString = ""
    End If
End Function


'-----------------------------------------------------------------------------
' GetSubstringBefore - 指定された区切り文字より前の文字列を取得する
'-----------------------------------------------------------------------------
' 引数:
'   str           : 処理対象の文字列
'   delimiter     : 区切り文字。この文字の前方にある文字列を取得します。
'   startFromEnd  : オプションの引数。True を指定すると、文字列の最後にある
'                   区切り文字から前方の文字列を取得します。
'                   既定値は False で、先頭からの検索になります。
'
' 戻り値:
'   指定された区切り文字より前の文字列。区切り文字が見つからない場合は、
'   元の文字列をそのまま返します。
'-----------------------------------------------------------------------------
Function GetSubstringBefore(str As String, delimiter As String, Optional startFromEnd As Boolean = False) As String
    Dim index As Long
    
    If startFromEnd Then
        index = InStrRev(str, delimiter)
    Else
        index = InStr(str, delimiter)
    End If
    
    If index > 0 Then
        GetSubstringBefore = Left(str, index - 1)
    Else
        GetSubstringBefore = str
    End If
End Function

普通に独自関数として使えました。すごすぎる。