よくある話が、セルに入った値をそのままでは使えず、VBAで加工してから使う場面。
ところが、文字列操作にはInStr・Mid・Split・Replace・Likeと、似たようなことができる関数が複数ある。
僕は普段、セル値のパース処理でこれらをよく使うが、どれを選ぶかは「何をしたいか」で決まる。悩む余地はあまりない。
そこで、この記事では「結局どの関数を使えばいいのか」という判断軸を中心に、それぞれの構文と実例をまとめた。

文字列操作、迷ったらどれを使うか
5つの関数はそれぞれ役割が違う。表にすると、こうなる。
| 関数 | 何をするか | 使うタイミングの目安 |
|---|---|---|
| InStr | 文字列内の位置を探す | 「含まれているか」「どこにあるか」を知りたいとき |
| Mid | 指定位置から文字列を抜き出す | 位置が決まっている固定フォーマットから一部を抜き出したいとき |
| Split | 区切り文字で分割し配列にする | 区切り文字で複数の値に分けたいとき |
| Replace | 文字列の一部を置き換える | 不要な文字を除去・置換したいとき |
| Like | パターンに一致するか判定する | 「特定の形式かどうか」を検証したいとき |
迷ったときは、「位置を知りたいのか」「抜き出したいのか」「分けたいのか」「変えたいのか」「判定したいのか」のどれに当てはまるかを考えると、自然と絞り込める。
位置を調べる:InStr
InStrは、指定した文字列の中から検索文字列がどこにあるかを返す関数。
見つかった場合は位置(何文字目か)を返し、見つからない場合は0を返す。
基本構文
InStr([開始位置], 対象文字列, 検索文字列, [比較方法])実際に使うと、こうなる。
Sub SampleInStr()
Dim baseText As String
Dim keyword As String
Dim result As Long
baseText = "今日の天気は晴れです"
keyword = "天気"
result = InStr(1, baseText, keyword, vbTextCompare)
If result > 0 Then
MsgBox "キーワードは" & result & "文字目にあります"
Else
MsgBox "キーワードは見つかりませんでした"
End If
End Sub- 第1引数の
1:検索の開始位置(先頭からなら1) vbTextCompare:大文字小文字を区別しない比較方法
同じ文字が複数回出てくる場合
2回目以降を探したいときは、前回見つかった位置+1を開始位置にして再検索する。
Sub InStrStartFrom()
Dim sentence As String
Dim target As String
Dim foundPos As Long
sentence = "リンゴとリンゴジュースとリンゴケーキ"
target = "リンゴ"
foundPos = InStr(1, sentence, target)
MsgBox "1回目: " & foundPos
foundPos = InStr(foundPos + 1, sentence, target)
MsgBox "2回目: " & foundPos
End Sub単に「含まれているか」を判定するだけなら、戻り値と0の比較だけで十分。
部分文字列を抜き出す:Mid
Midは、文字列の指定した位置から指定した長さ分を抜き出す関数。
Mid(対象文字列, 開始位置, [文字数])文字数を省略すると、開始位置から末尾まで全部を返す。
Sub SampleMid()
Dim code As String
code = "ORD-20260804-001"
' 先頭4文字("ORD-")を除いた日付部分を抜き出す
Dim datePart As String
datePart = Mid(code, 5, 8)
MsgBox "日付部分: " & datePart ' "20260804"
End Sub先頭からの固定文字数ならLeft、末尾からの固定文字数ならRightで書ける。Midはその中間、開始位置を自由に指定できる版と考えるとよい。
位置が毎回変わる場合は、InStrで先に位置を調べてからMidに渡す組み合わせがよく出てくる。
Sub ExtractAfterKeyword()
Dim fileName As String
Dim extPos As Long
fileName = "report_final.xlsx"
extPos = InStr(fileName, ".")
Dim ext As String
ext = Mid(fileName, extPos + 1)
MsgBox "拡張子: " & ext ' "xlsx"
End Sub区切り文字で分割する:Split
Splitは、区切り文字をもとに文字列を分割し、0始まりの配列として返す関数。
先ほどの注文コードのような、区切り文字がはっきりしている文字列を分けたいときに使う。
Sub SampleSplit()
Dim code As String
code = "ORD-20260804-001"
Dim parts() As String
parts = Split(code, "-")
MsgBox "種別: " & parts(0) & vbCrLf & _
"日付: " & parts(1) & vbCrLf & _
"連番: " & parts(2)
End SubMidとInStrを組み合わせて位置を計算するより、区切り文字が固定ならSplitで一気に配列化したほうが読みやすい。
件数が可変の区切りデータ(カンマ区切りの一覧など)を扱うときも同じで、ループでまとめて処理できる。
Sub SplitLoop()
Dim tags As String
tags = "VBA,Excel,自動化"
Dim tagList() As String
tagList = Split(tags, ",")
Dim i As Long
For i = LBound(tagList) To UBound(tagList)
Debug.Print tagList(i)
Next i
End Sub要素数を数えるときは、配列と同じくUBound - LBound + 1で求める。地味に見落としがちだが、Splitの戻り値も普通の配列として扱える。
置換する:Replace
Replaceは、文字列の中の指定した部分を、別の文字列に置き換える関数。
Replace(対象文字列, 検索文字列, 置換文字列, [開始位置], [置換回数], [比較方法])Sub SampleReplace()
Dim path As String
path = "C:\Data\2026\report.csv"
Dim unified As String
unified = Replace(path, "\", "/")
MsgBox unified ' "C:/Data/2026/report.csv"
End Sub不要な文字を消したいだけなら、置換文字列を空文字""にすればいい。
Sub RemoveSpaces()
Dim raw As String
raw = "1 2 3 4 5"
Dim cleaned As String
cleaned = Replace(raw, " ", "")
MsgBox cleaned ' "12345"
End Sub第4・第5引数で開始位置と置換回数を指定できるが、実務では省略して全部まとめて置換する使い方がほとんど。
パターンで判定する:Like演算子
Likeは、文字列が特定のパターン(ワイルドカード)に一致するかを判定する演算子。関数ではなく、比較演算子として使う。
*:0文字以上の任意の文字列?:任意の1文字#:任意の1桁の数字[文字リスト]:リスト内のいずれか1文字
Sub SampleLike()
Dim code As String
code = "ORD-20260804-001"
If code Like "ORD-########-###" Then
MsgBox "注文コードの形式です"
Else
MsgBox "形式が一致しません"
End If
End SubInStrは「含まれているか」しか判定できないが、Likeは「全体がその形式になっているか」まで検証できる。
SplitやMidで分解する前に、Likeで形式チェックを挟んでおくと、想定外のフォーマットのデータが混ざっていても気づきやすい。意外と見落としがちな一手間。
実務でよくある組み合わせ:セル値のパース
ここまでの関数は、単独より組み合わせて使う場面のほうが多い。
A列にORD-20260804-001形式の注文コードが並んでいて、日付と連番を別列に分解するケースで考えてみる。
Sub ParseOrderCodes()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
Dim code As String
code = Cells(i, 1).Value
' 想定外の形式は飛ばす
If Not code Like "???-########-###" Then
Cells(i, 2).Value = "形式エラー"
GoTo NextRow
End If
Dim parts() As String
parts = Split(code, "-")
Cells(i, 2).Value = parts(1) ' 日付
Cells(i, 3).Value = parts(2) ' 連番
NextRow:
Next i
End SubLikeで形式を検証してからSplitで分解するという流れは、そのままいろいろなフォーマットのパース処理に応用できる。
よくある質問
本文で触れきれなかった細かい疑問をQ&Aでまとめておきます。
InStrとLikeはどちらも文字列の判定に使えますが、何が違いますか?
InStrは「文字列の一部が含まれているか」を調べるのに向いています。一方Likeは、ワイルドカードを使って「文字列全体が特定の形式になっているか」を検証するのに向いています。部分一致ならInStr、フォーマット全体のチェックならLike、と使い分けてください。
SplitとMid+InStrはどちらを使うべきですか?
区切り文字が明確な文字列であれば、Splitのほうがコードがシンプルになります。Mid+InStrは、区切り文字が使えない、あるいは抜き出したい範囲が区切り文字とは無関係に決まっている場合に向いています。
Replaceで大文字小文字を区別せず置換するにはどうすればいいですか?
第6引数(比較方法)にvbTextCompareを指定してください。省略した場合はモジュールのOption Compare設定に従いますが、明示的に指定しておくほうが挙動が読みやすくなります。
Likeのワイルドカードで、リテラルの記号(*や?自体)を検索したい場合はどうしますか?
[*]や[?]のように角括弧で囲むと、ワイルドカードではなく通常の文字として扱われます。
まとめ
セル値を加工する場面では、位置を知りたいならInStr、抜き出すならMid、分けるならSplit、変えるならReplace、形式を確かめるならLike、という具合に役割で選べば迷わない。

コメント