銀河鉄道

【VBA】指定の文字列が含まれているか & 前後の文字列を返す|InStr/InStrRev

サムネイル
[VBA]InStr文字列確認
位置を取ってから
文字列を取る

位置だけを取る場合はこちら

targetStringにkeywordが含まれているか

targetStringにkeywordが含まれているか

' Minimal, intent-revealing string utilities (contains/left-of/right-of)
' 含有判定・前方抽出・後方抽出に特化した最小ユーティリティ

Option Explicit

Public Enum FindOrigin
	FromStart = 0	' search from the beginning|前から探す
	FromEnd = 1		' search from the end|後ろから探す
End Enum

' ContainsText: check if keyword exists in targetString (case-insensitive by default)
' ContainsText: 指定語が含まれるか(既定は大文字小文字を無視)
Public Function ContainsText( _
                            		ByVal targetString As String, _
                            		ByVal keyword As String, _
                            		Optional ByVal compare As VbCompareMethod = vbTextCompare) As Boolean
	ContainsText = (InStr(1, targetString, keyword, compare) > 0)
End Function

含まれていたら、指定文字の直前まで(左)を返す

' slice the part before marker (choose first/last occurrence)
' 区切り語の手前を返す(最初/最後を選択可能)
Public Function LeftOf( _
                              		ByVal targetString As String, _
                            		ByVal keyword As String, _
                               		Optional ByVal origin As FindOrigin = FromStart, _
                            		Optional ByVal compare As VbCompareMethod = vbTextCompare) As String
	Dim p As Long
	If origin = FromEnd Then
		p = InStrRev(targetString, keyword, -1, compare)
	Else
		p = InStr(1, targetString, keyword, compare)
	End If
	If p > 0 Then
		LeftOf = Left$(targetString, p - 1)
	End If
End Function

含まれていたら、指定文字の後ろ(右)を返す

' slice the part after marker (choose first/last occurrence)
' 区切り語の後ろを返す(最初/最後を選択可能)
Public Function RightOf( _
                            		ByVal targetString As String, _
                            		ByVal keyword As String, _
                            		Optional ByVal origin As FindOrigin = FromEnd, _
                            		Optional ByVal compare As VbCompareMethod = vbTextCompare) As String
	Dim p As Long
	If origin = FromEnd Then
		p = InStrRev(targetString, keyword, -1, compare)
	Else
		p = InStr(1, targetString, keyword, compare)
	End If
	If p > 0 Then
		RightOf = Mid$(targetString, p + Len(keyword)) ' multi-char safe|複数文字でも安全
	End If
End Function

結果例

Debug.Print LeftOf("りんごは赤い", "赤")   ' → "りんごは"
Debug.Print RightOf("りんごは赤い", "赤")  ' → "い"

「Stringの中」だから、 InStr

使用例

メールアドレスからドメインを切り出す

Example: Extract domain from an email address

Dim email As String
email = "name@example.com"

Dim domain As String, localPart as String
domain = RightOf(email, "@", FromEnd)	' → "example.com"
localPart = LeftOf(email, "@", FromEnd)	' → "name"

CSV行の1列目を取る

Get the first column from a CSV line

Dim line As String
line = "12345,2025-10-04,Tokyo,Accepted"

Dim firstCol As String
firstCol = LeftOf(line, ",", FromStart)	' → "12345"

ログメッセージからレベルを抜き出す

Extract log level from a bracketed tag

Dim log As String
log = "[ERROR] Connection failed at 2025-10-04"

Debug.Print LeftOf(log, "]")  
' → "[ERROR"   (タグ部分)

Debug.Print RightOf(log, "]")  
' → " Connection failed at 2025-10-04"

構文|InStr

Dim source As String
Dim keyword As String

source = "りんごは赤い"
keyword = "赤"

If InStr(source, keyword) > 0 Then
    ' keywordが見つかったときの処理
End If
InStr([Start], String1, String2, [Compare])

戻り値:

  • 0 → 見つからない
  • 1以上 → 見つかった位置(先頭=1)

"りんごは赤い" の 4文字目が "赤" なので InStr = 4 が返る

vbTextCompareで大文字小文字を無視する

  • デフォルトでは 大文字小文字を区別する(vbBinaryCompare)
  • 英字のときは vbTextCompare を指定した方が安全な場合ある。

その逆が InStrRev
Reverse(逆方向)

Referenced Insights & Citations

Pythonだと、こんなに長いコードは不要

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧