- 技術 💻
VBA文字列関数一覧|Left・Mid・InStr・Replace・Split
VBAの文字列操作は、切り出しの Left・Mid・Right、検索の InStr・InStrRev、置換の Replace、分割と結合の Split・Join を押さえると、ほとんどの加工が書けます。 位置を InStr で調べ、その位置を Left や Mid に渡す、という組み合わせが基本の形です。
この記事では、やりたいことから関数を引ける逆引き表、構文・戻り値・省略時の既定値の一覧表、定番の加工をまとめたコード、名前が似ている機能の違いと選び方を載せます。配列やDictionaryを使った集計ではなく、文字列1本を加工する場面に絞っています。
確認環境:構文・引数・戻り値は、Microsoft Learn の Office VBA リファレンス(英語版)の各関数ページを 2026-10-06 に開いて照合しました。コードのコメントに書いた値は、同じコードを LibreOffice 24.2.7.2 の Basic(Option VBASupport 1 を付けた VBA 互換モード、Linux)で動かして得た値です。Excel だけにある Range.Replace メソッドと WorksheetFunction.Trim メソッドは、Microsoft Learn の記載にもとづいています。
この記事の結論
- 切り出しは Left・Right・Mid。位置が決まっていないときは、InStr(前から探す)・InStrRev(後ろから探す)で位置を調べて渡します。
- 置換と削除は Replace。削除は置換後の文字列を
""にします。 - 区切り文字で分けるなら Split、つなぐなら Join。
Split(s, ",")(1)と書くと、分けた結果の2番目を1行で取り出せます(番号は 0 から始まります)。 - InStr は見つからないと 0 を返します。 その値をそのまま
Left(s, 位置 - 1)に渡すと止まるので、先にIf 位置 > 0 Thenで確かめます。 - 大文字と小文字を区別せずに探す・比べるときは、compare 引数に vbTextCompare を指定します。
やりたいこと別のVBA文字列関数早見表
| 分類 | やりたいこと | 使う関数 | 書き方の例 | 結果 |
|---|---|---|---|---|
| 切り出し | 左から n 文字 | Left | Left("report_2026", 6) |
report |
| 切り出し | 右から n 文字 | Right | Right("report.xlsx", 4) |
xlsx |
| 切り出し | 途中から n 文字 | Mid | Mid("report_2026.xlsx", 8, 4) |
2026 |
| 切り出し | 途中から最後まで | Mid(length 省略) | Mid("report_2026", 8) |
2026 |
| 検索 | 前から探して位置を得る | InStr | InStr("a-b-c", "-") |
2 |
| 検索 | 後ろから探して位置を得る | InStrRev | InStrRev("a-b-c", "-") |
4 |
| 検索 | 含むかどうか | InStr | InStr(s, "VBA") > 0 |
True / False |
| 置換 | 文字を置き換える | Replace | Replace("2026/10/06", "/", "-") |
2026-10-06 |
| 置換 | 文字を取り除く | Replace | Replace("090-1234-5678", "-", "") |
09012345678 |
| 置換 | 決まった位置の文字を書き換える | Mid ステートメント | Mid(t, 5, 1) = "/" |
t の5文字目が / になる |
| 分割 | 区切り文字で分ける | Split | Split("東京,大阪,福岡", ",")(1) |
大阪 |
| 結合 | 区切り文字でつなぐ | Join | Join(a, " / ") |
東京 / 大阪 / 福岡 |
| 結合 | 文字列同士をつなぐ | & 演算子 |
"A" & "B" |
AB |
| 変換 | 大文字・小文字にする | UCase・LCase | UCase("Hello vba") |
HELLO VBA |
| 変換 | 単語の先頭を大文字にする | StrConv | StrConv("hello vba", vbProperCase) |
Hello Vba |
| 変換 | 全角を半角にする | StrConv | StrConv("ABC123", vbNarrow) |
ABC123 |
| 変換 | 半角を全角にする | StrConv | StrConv("ABC123", vbWide) |
ABC123 |
| 変換 | ひらがなとカタカナを入れ替える | StrConv | StrConv("ひらがな", vbKatakana) |
ヒラガナ |
| 変換 | 先頭の数字を数値にする | Val | Val("12abc") |
12 |
| 比較 | 大小・一致を調べる | StrComp | StrComp("abc", "ABC", vbTextCompare) |
0(一致) |
| 空白除去 | 前後の空白を取る | Trim・LTrim・RTrim | Trim(" a b ") |
a b |
| 長さ | 文字数を数える | Len | Len("日本語ABC") |
6 |
| 生成 | 同じ文字を並べる | String・Space | String(5, "-") |
----- |
| 生成 | 逆順にする | StrReverse | StrReverse("ABC") |
CBA |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「VBA文字列関数一覧|Left・Mid・InStr・Replace・Split」
構文・戻り値・省略時の既定値の一覧
角かっこの引数は省略できます。既定値は Microsoft Learn の各関数ページの記載です。
| 関数 | 構文 | 戻り値 | 省略できる引数と既定値 |
|---|---|---|---|
| Left | Left(string, length) |
Variant (String) | なし。length が文字数以上なら全体、0 なら長さ0の文字列 |
| Right | Right(string, length) |
Variant (String) | なし。length の扱いは Left と同じ |
| Mid | Mid(string, start, [length]) |
Variant (String) | length を省略すると start から最後まで。start が文字数より大きいと長さ0の文字列 |
| Len | Len(string) |
Long | なし |
| InStr | InStr([start], string1, string2, [compare]) |
Variant (Long) | start は 1。compare を指定するときは start も必須 |
| InStrRev | InStrRev(stringcheck, stringmatch, [start], [compare]) |
位置を表す数値 | start は -1(最後の文字から)。compare はバイナリ比較 |
| Replace | Replace(expression, find, replace, [start], [count], [compare]) |
文字列 | start は 1、count は -1(すべて置換) |
| Split | Split(expression, [delimiter], [limit], [compare]) |
0 から始まる1次元配列 | delimiter は半角スペース、limit は -1(すべて返す) |
| Join | Join(sourcearray, [delimiter]) |
文字列 | delimiter は半角スペース。"" を渡すと区切りなしで連結 |
| StrComp | StrComp(string1, string2, [compare]) |
Variant (Integer) | compare は Option Compare の設定に従う |
| StrConv | StrConv(string, conversion, [LCID]) |
Variant (String) | LCID はシステムのロケールID |
| UCase | UCase(string) |
Variant (String) | なし |
| LCase | LCase(string) |
String | なし |
| String | String(number, character) |
Variant (String) | なし。character が2文字以上なら先頭の1文字を使う |
| Space | Space(number) |
Variant (String) | なし |
| StrReverse | StrReverse(expression) |
文字列 | なし |
| Val | Val(string) |
数値 | なし |
Trim・LTrim・RTrim は引数に文字列を1つ渡す関数で、Trim は前後、LTrim は先頭、RTrim は末尾の空白を取り除きます(動作は後半のコードで確かめた結果を載せています)。
compare 引数に渡す定数
InStr・InStrRev・Replace・Split・StrComp の compare 引数は、同じ定数を受け取ります。
| 定数 | 値 | 意味 |
|---|---|---|
| vbUseCompareOption | -1 | Option Compare ステートメントの設定に従う |
| vbBinaryCompare | 0 | バイナリ比較(大文字と小文字を区別する) |
| vbTextCompare | 1 | テキスト比較(大文字と小文字を区別しない) |
| vbDatabaseCompare | 2 | Microsoft Access 専用 |
Option Compare ステートメントのページには、モジュールに Option Compare を書いていない場合の既定は Binary と書かれています。大文字と小文字を区別せずに扱いたい箇所では、その関数に vbTextCompare を渡すと、モジュール全体の設定に左右されません。
定番の加工をまとめたコード
標準モジュールに貼り付けて実行すると、イミディエイトウィンドウに結果が出ます。コメントは各行の値です。
Option Explicit
Sub StringSamples()
Dim s As String, p As String, pos As Long
s = "report_2026.final.xlsx"
p = "C:\work\data\report_2026.final.xlsx"
' --- 切り出しと長さ ---
Debug.Print Left(s, 6) ' report
Debug.Print Right(s, 4) ' xlsx
Debug.Print Mid(s, 8, 4) ' 2026
Debug.Print Mid(s, 8) ' 2026.final.xlsx
Debug.Print Len(s) ' 22
' --- 位置を調べる ---
Debug.Print InStr(s, "_") ' 7
Debug.Print InStr(s, ".") ' 12(最初のピリオド)
Debug.Print InStrRev(s, ".") ' 18(最後のピリオド)
Debug.Print InStr(s, "#") ' 0(見つからない)
' --- 区切り文字の前と後ろ ---
Debug.Print Left(s, InStr(s, "_") - 1) ' report
Debug.Print Mid(s, InStr(s, "_") + 1) ' 2026.final.xlsx
' --- 2つの区切り文字のあいだ ---
Debug.Print Mid(s, InStr(s, "_") + 1, InStr(s, ".") - InStr(s, "_") - 1) ' 2026
' --- 拡張子と、拡張子を除いた名前 ---
Debug.Print Mid(s, InStrRev(s, ".") + 1) ' xlsx
Debug.Print Left(s, InStrRev(s, ".") - 1) ' report_2026.final
' --- パスからファイル名とフォルダー ---
Debug.Print Mid(p, InStrRev(p, "\") + 1) ' report_2026.final.xlsx
Debug.Print Left(p, InStrRev(p, "\") - 1) ' C:\work\data
' --- 見つからない場合に備える形 ---
pos = InStr(s, "#")
If pos > 0 Then
Debug.Print Left(s, pos - 1)
Else
Debug.Print s ' 区切り文字が無ければ全体を使う
End If
End Sub
前から数える区切りは InStr、最後の区切りは InStrRev と使い分けています。ファイル名にピリオドが2つ以上あっても、InStrRev なら最後のピリオドの位置が取れるので、拡張子を正しく切り出せます。
置換・分割・結合・変換のコード
Option Explicit
Sub ReplaceSplitSamples()
Dim a As Variant, t As String
' --- 置換と削除 ---
Debug.Print Replace("2026/10/06", "/", "-") ' 2026-10-06
Debug.Print Replace("090-1234-5678", "-", "") ' 09012345678
Debug.Print Replace("a-b-c", "-", "/", 1, 1) ' a/b-c(最初の1個だけ)
Debug.Print Replace("Excel EXCEL excel", "excel", "Calc") ' Excel EXCEL Calc
Debug.Print Replace("Excel EXCEL excel", "excel", "Calc", 1, -1, vbTextCompare) ' Calc Calc Calc
' --- 改行を取り除く ---
t = "1行目" & vbCrLf & "2行目"
Debug.Print Replace(Replace(t, vbCr, ""), vbLf, "") ' 1行目2行目
' --- 分割して n 番目を取り出す(番号は 0 から) ---
Debug.Print Split("東京,大阪,福岡", ",")(1) ' 大阪
a = Split("東京,大阪,福岡", ",")
Debug.Print UBound(a) ' 2
Debug.Print a(UBound(a)) ' 福岡(最後の要素)
' --- 結合 ---
Debug.Print Join(a, " / ") ' 東京 / 大阪 / 福岡
Debug.Print Join(a) ' 東京 大阪 福岡(既定は半角スペース)
Debug.Print Join(a, "") ' 東京大阪福岡
' --- 区切り文字の個数を数える ---
Debug.Print (Len("a,b,c,d") - Len(Replace("a,b,c,d", ",", ""))) / Len(",") ' 3
' --- 大文字・小文字、全角・半角、かな ---
Debug.Print UCase("Hello vba") ' HELLO VBA
Debug.Print LCase("Hello VBA") ' hello vba
Debug.Print StrConv("hello vba world", vbProperCase) ' Hello Vba World
Debug.Print StrConv("ABC123", vbNarrow) ' ABC123
Debug.Print StrConv("ABC123 カタカナ", vbWide) ' ABC123 カタカナ
Debug.Print StrConv("ひらがな", vbKatakana) ' ヒラガナ
Debug.Print StrConv("カタカナ", vbHiragana) ' かたかな
' --- 空白除去 ---
Debug.Print "[" & Trim(" a b ") & "]" ' [a b]
Debug.Print "[" & LTrim(" a b ") & "]" ' [a b ]
Debug.Print "[" & RTrim(" a b ") & "]" ' [ a b]
' --- 桁をそろえる・比べる ---
Debug.Print Right("0000" & 42, 4) ' 0042
Debug.Print StrComp("abc", "ABC") ' 1
Debug.Print StrComp("abc", "ABC", vbTextCompare) ' 0
End Sub
StrConv の変換定数は次のとおりです。Microsoft Learn の StrConv 関数のページでは、vbWide と vbNarrow は東アジアのロケール、vbKatakana と vbHiragana は日本のロケールで使える定数と説明されています。
| 定数 | 値 | 変換の内容 |
|---|---|---|
| vbUpperCase | 1 | 大文字にする |
| vbLowerCase | 2 | 小文字にする |
| vbProperCase | 3 | 各単語の先頭を大文字にする |
| vbWide | 4 | 半角を全角にする |
| vbNarrow | 8 | 全角を半角にする |
| vbKatakana | 16 | ひらがなをカタカナにする |
| vbHiragana | 32 | カタカナをひらがなにする |
| vbUnicode | 64 | システムの既定のコードページを使って Unicode に変換する |
| vbFromUnicode | 128 | Unicode からシステムの既定のコードページに変換する |
定数は vbUpperCase + vbWide のように足して同時に指定できます。
名前が似ている機能の違いと選び方
Mid 関数と Mid ステートメント
| 比べる点 | Mid 関数 | Mid ステートメント |
|---|---|---|
| 書く場所 | 式の右辺(値を返す) | 代入の左辺(変数を書き換える) |
| 書き方 | x = Mid(s, 5, 3) |
Mid(s, 5, 3) = "abc" |
| 元の変数 | 変わらない | 書き換わる |
| 文字列の長さ | 取り出した長さ | 元の長さのまま変わらない |
Sub MidStatementSample()
Dim t As String
t = "2026-10-06"
Mid(t, 5, 1) = "/"
Debug.Print t ' 2026/10-06(5文字目だけが変わる)
t = "The dog jumps"
Mid(t, 5) = "cow jumped over"
Debug.Print t ' The cow jumpe(元の長さを超える分は入らない)
End Sub
Mid ステートメントは位置を指定して上書きする機能で、文字列の長さは変わりません。「この文字をすべて別の文字にしたい」なら Replace、「5文字目だけを書き換えたい」なら Mid ステートメント、と分けられます。
InStr と InStrRev
| 比べる点 | InStr | InStrRev |
|---|---|---|
| 探す向き | 前から | 後ろから |
| 引数の並び | InStr([start], 探される文字列, 探す文字列, [compare]) |
InStrRev(探される文字列, 探す文字列, [start], [compare]) |
| start の位置 | 1番目(省略可) | 3番目(省略可) |
| start の既定値 | 1 | -1(最後の文字から) |
| 返る位置 | 先頭から数えた位置 | 先頭から数えた位置(後ろからではない) |
| 見つからないとき | 0 | 0 |
start を書く場所が違う点に気をつけます。InStr(5, "a-b-c-d", "-") は5文字目以降で最初の - を探して 6 を返し、InStrRev("a-b-c-d", "-", 5) は5文字目から前に向かって探して 4 を返します。
Trim(VBA)と WorksheetFunction.Trim
| 比べる点 | Trim 関数(VBA) | WorksheetFunction.Trim メソッド |
|---|---|---|
| 書き方 | Trim(s) |
Application.WorksheetFunction.Trim(s) |
| 前後の空白 | 取り除く | 取り除く |
| 単語のあいだの連続した空白 | そのまま残る("a b") |
1個にまとめる |
| 使える場所 | VBA 全般 | Excel の VBA |
WorksheetFunction.Trim は、Microsoft Learn のページで「単語のあいだの1個のスペースを残して、すべてのスペースを取り除く」と説明されています。同じページには、対象は ASCII のスペース(文字コード 32)で、改行しないスペース(文字コード 160)は取り除かれないという注記もあります。あいだの空白も整えたいなら WorksheetFunction.Trim、前後だけでよいなら Trim を選びます。
Replace 関数と Range.Replace メソッド
| 比べる点 | Replace 関数 | Range.Replace メソッド |
|---|---|---|
| 対象 | 文字列1本 | セル範囲 |
| 書き方 | s = Replace(s, "/", "-") |
Range("A:A").Replace What:="/", Replacement:="-", LookAt:=xlPart |
| 戻り値 | 置換後の文字列 | Boolean |
| 元のデータ | 変わらない(戻り値を代入して使う) | セルの内容が直接書き換わる |
| 大文字小文字 | compare 引数 | MatchCase 引数 |
| 部分一致・完全一致 | 常に部分を置換 | LookAt 引数(xlPart/xlWhole) |
Range.Replace のページには、LookAt・SearchOrder・MatchCase・MatchByte の設定はメソッドを使うたびに保存され、次に省略すると保存された値が使われる、という説明があります。Range.Replace を使うときは、これらの引数を毎回書くと、前回の検索条件に影響されません。
選び方の判断表
| 条件 | 選ぶもの |
|---|---|
| 区切り文字が1つで、その前か後ろが欲しい | InStr と Left・Mid |
| 最後の区切り文字より後ろが欲しい(拡張子、ファイル名) | InStrRev と Mid |
| 区切り文字が複数あり、n 番目が欲しい | Split(s, 区切り)(n - 1) |
| 文字をすべて置き換える・取り除く | Replace 関数 |
| 決まった位置の文字だけを書き換える | Mid ステートメント |
| シート上の多くのセルをまとめて置換する | Range.Replace メソッド |
| 大文字と小文字を区別せずに一致を調べる | StrComp(a, b, vbTextCompare) = 0 |
つまずきやすい点と直し方
| 症状 | 原因 | 直し方 |
|---|---|---|
Left(s, InStr(s, "#") - 1) で実行時エラー 5 になる |
InStr が 0 を返し、Left の長さが -1 になっている | 先に pos = InStr(...) を変数に取り、If pos > 0 Then で分ける |
| Replace の結果の先頭が消える | start に 2 以上を指定している。戻り値は start の位置から始まる | 先頭も残したいときは Left(s, start - 1) & Replace(s, find, rep, start) とつなぐ |
| InStr で大文字小文字を区別せずに探せない | compare を省略している | InStr(1, s, "vba", vbTextCompare) と、start も書いて compare を指定する |
Split(s, ",")(3) でインデックスのエラーになる |
分けた結果の個数が足りない | UBound(Split(s, ",")) で最後の番号を確かめてから取り出す |
| Trim しても空白が残る | 全角スペースや単語のあいだの空白が対象になっていない | Replace(s, " ", "") で全角スペースを取り除く。あいだの空白は WorksheetFunction.Trim |
| Val の結果が途中で切れる | 数字として読めない文字のところで読み取りが終わる | カンマは先に Replace(s, ",", "") で取り除く |
確かめて分かったこと
- Replace に start を指定すると、戻り値は start の位置から始まります。
Replace("abcabc", "b", "X", 3)はcaXcになり、先頭のabは含まれませんでした。Microsoft Learn のページにも、戻り値は元の文字列の先頭からのコピーではないと書かれています。 - InStrRev が返すのは、先頭から数えた位置です。
InStrRev("report_2026.final.xlsx", ".")は 18 で、そのまま Mid や Left に渡せます。 - Split は空の要素も1つとして数えます。
Split("a,,b", ",")の最後の番号は 2(要素は3つ)でした。区切り文字を省略したSplit("a b c")も、連続したスペースのあいだを空の要素として数え、最後の番号は 3 でした。 - 長さ0の文字列を Split すると、最後の番号が -1 の空の配列になります。
UBound(Split(""))は -1 でした。要素を取り出す前に UBound を確かめると、空の入力でも止まりません。 - Trim は全角スペースを取り除きませんでした。
Trim(" 全角 ")の結果は前後の全角スペースが残ったままです。 - Mid ステートメントは文字列を伸ばしません。 13文字の変数に15文字を書き込むと、入る分だけが書き換わり
The cow jumpeになりました。 - Val はカンマを数値の一部として扱わない、と Microsoft Learn に書かれています。 桁区切りのある文字列は、Replace でカンマを取り除いてから渡します。
よくある質問
Q. VBAで文字列の一部を取り出す関数は? A. Left(左から)、Right(右から)、Mid(途中から)の3つです。取り出す位置が文字列によって変わるときは、InStr か InStrRev で位置を調べて渡します。
Q. InStr と InStrRev の違いは? A. 探す向きが違います。InStr は前から、InStrRev は後ろから探します。どちらも先頭から数えた位置を返し、見つからないときは 0 です。start 引数は InStr では1番目、InStrRev では3番目に書きます。
Q. Replace で大文字と小文字を区別しないで置換するには?
A. 6番目の引数に vbTextCompare を指定します。Replace(s, "excel", "Calc", 1, -1, vbTextCompare) のように、start(1)と count(-1)も書きます。
Q. Split で分けた結果の最後の要素を取り出すには?
A. 配列を変数に受けて a(UBound(a)) と書きます。拡張子のように「最後の区切り文字より後ろ」が欲しいだけなら、Mid(s, InStrRev(s, ".") + 1) のほうが短く書けます。
Q. 文字列に特定の文字が含まれるかを調べるには?
A. If InStr(s, "探す文字") > 0 Then と書きます。InStr は見つかった位置(1以上)を返し、見つからないと 0 を返すためです。
まとめ
- 切り出しは Left・Right・Mid、位置を調べるのは InStr・InStrRev。この2組を組み合わせるのが基本形。
- InStr が 0 を返す場合を先に分けると、Left や Mid に負の長さが渡らない。
- 置換と削除は Replace。start を指定したときは、戻り値が start の位置から始まる。
- n 番目の項目は
Split(s, 区切り)(n - 1)、最後の区切りより後ろは InStrRev と Mid。 - 全角半角・ひらがなカタカナは StrConv、大文字小文字は UCase・LCase。
- 大文字と小文字を区別しないときは vbTextCompare を compare 引数に渡す。
- 文字列1本なら Replace 関数と Trim 関数、セル範囲なら Range.Replace、あいだの空白まで整えるなら WorksheetFunction.Trim。
参考・出典
- Microsoft Learn「Office VBA Reference」Left・Right・Mid・Len・InStr・InStrRev・Replace・Split・Join・StrComp・StrConv・UCase・LCase・String・Space・StrReverse・Val の各関数、Mid ステートメント、Option Compare ステートメント(learn.microsoft.com、2026-10-06 に確認)
- Microsoft Learn「Range.Replace method (Excel)」「WorksheetFunction.Trim method (Excel)」(2026-10-06 に確認)
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「VBA文字列関数一覧|Left・Mid・InStr・Replace・Split」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。