Excel VBAで文字列を扱う処理は、業務自動化やデータ整形において避けて通れません。
中でも「セル内の特定の文字が、何文字目にあるかを調べたい」という要件は、非常に高い頻度で登場します。
たとえば、
- メールアドレスの「@」の位置を知りたい
- ファイル名の区切り文字「_」の位置を基準に分割したい
- CSVデータの区切り位置を取得したい
- ログ文字列から特定キーワードの開始位置を知りたい
といったケースです。
このような処理の中心となるのが InStr関数 です。
しかし、InStrは単純に見えて、引数の意味・戻り値・失敗時の挙動を正しく理解していないと、思わぬバグや誤判定を生みます。
この記事では、
VBAのInStr関数を使って「セル内の特定文字の最初の位置」を正しく・安全に取得する方法を、
基礎から実務レベルまで段階的に解説します。
目次
- ✅ InStr関数がVBA実務で重要な理由
- ・文字列処理の起点になる
- ・セル内データは不規則
- ✅ InStr関数の基本構文と戻り値の意味
- ・InStr関数の基本構文
- ・各引数の意味
- ・戻り値の意味
- ✅ セル内の特定文字の最初の位置を取得する基本例
- ・基本コード例
- ・コード解説
- ✅ 検索文字が見つからない場合の正しい対処
- ・存在チェックを入れた例
- ・このチェックが重要な理由
- ✅ 大文字・小文字を区別して検索する方法
- ・比較方法を指定する例
- ・主な比較方法
- ✅ 開始位置を指定して検索する応用パターン
- ・開始位置を指定する例
- ✅ セル内の文字列処理でよくある実務例
- ・区切り文字の位置を取得して分割
- ・ファイル名の規則チェック
- ・入力値のフォーマット検証
- ・ログデータの解析
- ✅ InStrとMid関数を組み合わせた実践例
- ・組み合わせ例
- ✅ InStrを関数化して再利用性を高める
- ・関数化の例
- ✅ よくある失敗パターンとその回避策
- ✅ RPA・自動化を意識したInStr活用の考え方
- ✅ まとめ:InStrで最初の位置を正しく取得するために
✅ InStr関数がVBA実務で重要な理由
VBAで文字列を扱う処理の多くは、
「位置を知る → 切り出す → 判定する」という流れで構成されています。
この最初の「位置を知る」工程を担うのがInStr関数です。
ここを誤ると、その後のすべての処理が崩れます。
特にセルデータを相手にする場合、想定外の文字列が混ざることは日常茶飯事です。
InStrの仕様を正しく理解していないと、エラーや誤抽出が頻発します。
まずは、なぜInStrが重要なのかを整理しましょう。
・文字列処理の起点になる
InStrは「検索の起点」です。
Mid・Left・Right・Splitなど、
多くの関数はInStrと組み合わせて使われます。
・セル内データは不規則
セル内の文字列は、
人が入力したもの、外部から取り込んだものなど、
フォーマットが統一されていないことがほとんどです。
位置検索が安定していないと、処理全体が不安定になります。
✅ InStr関数の基本構文と戻り値の意味
まずはInStr関数の基本を正しく理解します。
ここを曖昧にしたまま使うと、
「なぜこの結果になるのか分からない」状態に陥ります。
特に戻り値の意味は非常に重要です。
この章では、構文・引数・戻り値を丁寧に整理します。
基礎ですが、実務では最重要ポイントです。
・InStr関数の基本構文
InStr([開始位置], 検索対象文字列, 検索文字列, [比較方法])
・各引数の意味
- 開始位置(省略可)
検索を開始する文字位置 - 検索対象文字列
元となる文字列(セルの値など) - 検索文字列
探したい文字・文字列 - 比較方法(省略可)
大文字小文字を区別するかどうか
・戻り値の意味
- 見つかった場合:最初に見つかった位置(1から始まる)
- 見つからない場合:0
この「0が返る」という仕様を理解していないと、
後続処理でエラーを引き起こします。
参考:【VBA】メソッドの戻り値(返り値)とは?取得方法と活用例
✅ セル内の特定文字の最初の位置を取得する基本例
ここからは、実際にセル内の文字列を対象にした基本例を見ていきます。
まずは最もシンプルなケースです。
この処理が、すべての応用の出発点になります。
動作原理を意識しながら確認してください。
・基本コード例
Sub FindFirstPosition_Basic()
Dim target As String
Dim pos As Long
target = Range("A1").Value
pos = InStr(target, "@")
MsgBox pos
End Sub
・コード解説
- セルA1の値を文字列として取得
- InStrで「@」を検索
- 見つかった位置をposに格納
- メッセージボックスで表示
「@」が5文字目にあれば、5が返ります。
✅ 検索文字が見つからない場合の正しい対処
実務では、
必ず検索文字が存在するとは限りません。
このチェックを怠ると、
Mid関数などで実行時エラーが発生します。
この章では、安全に処理するための基本対策を解説します。
ここを入れるかどうかで、コードの品質が大きく変わります。
・存在チェックを入れた例
Sub FindFirstPosition_Check()
Dim target As String
Dim pos As Long
target = Range("A1").Value
pos = InStr(target, "_")
If pos = 0 Then
MsgBox "指定した文字は見つかりません"
Else
MsgBox pos
End If
End Sub
・このチェックが重要な理由
- 実行時エラーを防げる
- データ欠損に強くなる
- 自動処理が止まりにくい
参考:【VBA】重複チェックの方法|1列・複数列・高速判定まで実務で役立つ完全ガイド
✅ 大文字・小文字を区別して検索する方法
InStrは、
比較方法を指定することで、
大文字・小文字を区別するかどうかを制御できます。
これを理解していないと、
意図しない位置が返ることがあります。
特に英数字を扱う場合は注意が必要です。
・比較方法を指定する例
pos = InStr(1, target, "abc", vbBinaryCompare)
・主な比較方法
- vbBinaryCompare:大文字小文字を区別
- vbTextCompare:区別しない
✅ 開始位置を指定して検索する応用パターン
InStrの強力な機能のひとつが、
「検索開始位置」を指定できる点です。
これにより、
2回目以降の検索や部分検索が可能になります。
この考え方は、後述の応用処理で非常に重要です。
・開始位置を指定する例
pos = InStr(5, target, "_")
5文字目以降から検索を開始します。
✅ セル内の文字列処理でよくある実務例
InStrは、
単体で使われることはほとんどありません。
多くの場合、
後続の処理と組み合わせて使われます。
ここでは実務で頻出するパターンを紹介します。
・区切り文字の位置を取得して分割
・ファイル名の規則チェック
・入力値のフォーマット検証
・ログデータの解析
✅ InStrとMid関数を組み合わせた実践例
位置を取得した後は、
その位置を基準に文字列を切り出します。
InStrとMidは、
VBA文字列処理の王道コンビです。
・組み合わせ例
Sub ExtractAfterCharacter()
Dim target As String
Dim pos As Long
Dim result As String
target = Range("A1").Value
pos = InStr(target, "_")
If pos > 0 Then
result = Mid(target, pos + 1)
MsgBox result
End If
End Sub
✅ InStrを関数化して再利用性を高める
実務では、
同じ処理を何度も書くのは非効率です。
InStrを使った処理は、
関数としてまとめることで品質が向上します。
RPAやバッチ処理では特に重要です。
・関数化の例
Function FindFirstPosition(ByVal src As String, _
ByVal findStr As String) As Long
FindFirstPosition = InStr(src, findStr)
End Function
✅ よくある失敗パターンとその回避策
InStrを使った処理で、
特に多い失敗を整理します。
- 見つからない場合を考慮していない
- 大文字小文字の違いを想定していない
- 空白や全角文字を意識していない
- 0始まりと勘違いしている
これらはすべて、
今回の内容を理解すれば回避できます。
参考:【VBA】「フィルター 空白以外」を設定する方法|空白を除外してデータ抽出する自動化手法
✅ RPA・自動化を意識したInStr活用の考え方
RPAや自動処理では、
「止まらないコード」が最重要です。
InStrは例外を投げない関数ですが、
使い方を誤ると後続処理で止まります。
- 必ず存在チェックを行う
- 関数化して共通処理にする
- 戻り値0を前提に設計する
この考え方は、
長期運用で大きな差になります。
✅ まとめ:InStrで最初の位置を正しく取得するために
- InStrは文字列検索の起点となる関数
- 戻り値は1始まり、見つからない場合は0
- 存在チェックは必須
- 大文字小文字の比較方法を理解する
- Midなどと組み合わせて使う
- 関数化で再利用性を高める
InStr関数を正しく理解すれば、
VBAでの文字列処理は一気に安定します。
今回の内容をベースにすれば、
セル内文字列検索で迷うことはなくなるはずです。