【VBA】指定の文字列が含まれているか & 前後の文字列を返す|InStr/InStrRev
作成日:2022-11-01
更新日:2025-10-06

位置を取ってから
文字列を取る
文字列を取る

位置だけを取る場合はこちら
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
- Microsoft. (n.d.). InStr function (VBA). https://learn.microsoft.com/office/vba/language/reference/user-interface-help/instr-function
- Microsoft. (n.d.). InStrRev function (VBA). https://learn.microsoft.com/office/vba/language/reference/user-interface-help/instrrev-function
- Microsoft. (n.d.). Left function (VBA). https://learn.microsoft.com/office/vba/language/reference/user-interface-help/left-function
- Microsoft. (n.d.). Mid function (VBA). https://learn.microsoft.com/office/vba/language/reference/user-interface-help/mid-function

Pythonだと、こんなに長いコードは不要
2022-11-01
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-
[VBA]日付を文字列に 【VBA】日付型を文字列にする|Format -
[VBA]StrCompで文字列比較 【VBA】拡張子の存在確認|Right + StrComp -
[VBA]Merge1D Arrays 【VBA】一次元配列と一次元配列を結合する -
[VBA]開いているかwith FullName 【VBA】ブックが開いているか判定|StrComp で FullNameを調べる -
[VBA]Transpose2D Array 【VBA】配列の縦横変換|WorksheetFunction.Transpose は使わない -
Excelテーブル最終行に値を追加 【VBA】Excelのテーブルの最終行に値を追加する