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, ",", "") で取り除く

確かめて分かったこと

  1. Replace に start を指定すると、戻り値は start の位置から始まります。 Replace("abcabc", "b", "X", 3) は caXc になり、先頭の ab は含まれませんでした。Microsoft Learn のページにも、戻り値は元の文字列の先頭からのコピーではないと書かれています。
  2. InStrRev が返すのは、先頭から数えた位置です。 InStrRev("report_2026.final.xlsx", ".") は 18 で、そのまま Mid や Left に渡せます。
  3. Split は空の要素も1つとして数えます。 Split("a,,b", ",") の最後の番号は 2(要素は3つ)でした。区切り文字を省略した Split("a b c") も、連続したスペースのあいだを空の要素として数え、最後の番号は 3 でした。
  4. 長さ0の文字列を Split すると、最後の番号が -1 の空の配列になります。 UBound(Split("")) は -1 でした。要素を取り出す前に UBound を確かめると、空の入力でも止まりません。
  5. Trim は全角スペースを取り除きませんでした。 Trim(" 全角 ") の結果は前後の全角スペースが残ったままです。
  6. Mid ステートメントは文字列を伸ばしません。 13文字の変数に15文字を書き込むと、入る分だけが書き換わり The cow jumpe になりました。
  7. 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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?