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
普通に独自関数として使えました。すごすぎる。