VBAで自動化 VBA一覧 セル・値の取得と貼り付け 値の一部

【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)

Excel VBAで文字列を扱う処理は、業務自動化やデータ整形において避けて通れません。
中でも「セル内の特定の文字が、何文字目にあるかを調べたい」という要件は、非常に高い頻度で登場します。

たとえば、

  • メールアドレスの「@」の位置を知りたい
  • ファイル名の区切り文字「_」の位置を基準に分割したい
  • CSVデータの区切り位置を取得したい
  • ログ文字列から特定キーワードの開始位置を知りたい

といったケースです。

このような処理の中心となるのが InStr関数 です。
しかし、InStrは単純に見えて、引数の意味・戻り値・失敗時の挙動を正しく理解していないと、思わぬバグや誤判定を生みます。

この記事では、
VBAの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

・コード解説

  1. セルA1の値を文字列として取得
  2. InStrで「@」を検索
  3. 見つかった位置をposに格納
  4. メッセージボックスで表示

「@」が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

・このチェックが重要な理由


✅ 大文字・小文字を区別して検索する方法

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での文字列処理は一気に安定します。
今回の内容をベースにすれば、
セル内文字列検索で迷うことはなくなるはずです。

参考:【VBA】文字列操作関数【Mid・Left・Right】|実務で使い倒す完全ガイド

    -VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 値の一部