【2026年8月最新】Excelの文字列抽出、VBA Mid関数の使い方完全ガイド|Left・InStr関数との組み合わせとAI自動化
「Excelのセルに入っている文字列から、必要な部分だけを取り出したい」——伝票番号だけ、都道府県名だけ、メールアドレスのドメイン部分だけ。実務では毎日のようにこの手の作業が発生します。
VBAには、この「文字列の一部を抜き出す」処理に使うMid関数という命令があります。似た働きをするLeft関数や、文字の位置を調べるInStr関数と組み合わせることで、住所分割や伝票番号抽出といった定型作業を自動化できます。
この記事では、Mid関数の基本文法から、Left・InStrとの実践的な組み合わせ方、全角半角が混ざったときの注意点、よくあるエラーの直し方までを一気に解説します。さらに後半では、「そもそもVBAのコードを1行も書かずに、同じ処理をAIにやらせる」という2026年時点の選択肢についても、弊社(株式会社GENAI)の実運用データとあわせて紹介します。
この記事を最後まで読むと、次の7つが明確になります。
01 MID FUNCTION BASICS Mid関数とは何か:文字列の一部を抜き出す基本 開始位置と文字数を指定して、文字列の中身を切り取る
Mid関数は、ある文字列の「何文字目から」「何文字分」を取り出すかを指定して、その部分だけを返してくれるVBAの組み込み関数です。Excelのワークシート関数にも同名のMID関数がありますが、ここではVBA(マクロ)側のMid関数を前提に解説します。
📚 用語解説
VBA (Visual Basic for Applications):Excel・Word・AccessなどMicrosoft Office製品に組み込まれているプログラミング言語。「マクロ」と呼ばれる自動処理を作るときに使います。Alt+F11でエディタが開き、コードを書いて実行することで、手作業を自動化できます。
1-1. Mid関数の基本文法
Mid関数の書き方は次の通りです。
| 要素 | 内容 | 省略 |
|---|---|---|
| 文字列 | 抜き出し元になる文字列、またはセルの値を格納した変数 | 不可 |
| 開始位置 | 何文字目から抜き出すか(1文字目は"1"。0を指定するとエラーになる) | 不可 |
| 文字数 | 開始位置から何文字分抜き出すか | 省略可(省略時は末尾まで抜き出す) |
たとえば「Mid("GENAI-2026-0731", 7, 4)」と書くと、7文字目の「2」から4文字分、つまり「2026」が返ります。実際のコードでは次のように使います。
Dim denpyo As String
denpyo = "GENAI-2026-0731"
Dim nen As String
nen = Mid(denpyo, 7, 4)
MsgBox nen '' 実行結果: 2026
変数 denpyo に入っている伝票番号のうち、7文字目から4文字分(年の部分)だけを nen という変数に取り出しています。
1-2. 開始位置に0を指定するとどうなるか
よくあるつまずきポイントとして、開始位置に0を指定してしまうケースがあります。Mid関数の開始位置は1文字目を「1」として数えるルールのため、0を渡すと「実行時エラー5:プロシージャの呼び出し、または引数が不正です」というエラーが発生します。InStr関数の結果(後述)をそのまま開始位置に渡すコードでは、この0エラーが特に起きやすいので注意が必要です。
1-3. 文字数を省略した場合の挙動
第3引数の「文字数」は省略可能です。省略すると、開始位置から文字列の末尾までがまるごと返されます。「後ろの文字数が可変で、決まった長さで切れない」というケースでは、この省略記法が便利です。
📚 用語解説
引数(ひきすう):関数やプロシージャに渡す「材料」のこと。Mid関数でいえば「文字列」「開始位置」「文字数」の3つが引数にあたります。エクセルの関数でいう「=SUM(A1:A10)」のA1:A10の部分と同じ役割です。
1-4. MidB関数との違い(結論:通常業務ではほぼ不要)
VBAにはMid関数のほかにMidB関数という、文字列を1文字単位ではなく「バイト単位」で処理する関数も存在します。かつて文字コードの扱いが複雑だった時代の名残で用意されている関数ですが、現在の一般的な業務用マクロでは、Mid関数だけで十分なケースがほとんどです。「MidBという名前を見た」という前提知識として押さえておく程度で問題ありません。
1-5. Left関数だけでも書けるケースとの使い分け
「先頭から◯文字だけ抜き出したい」という単純なケースであれば、Mid関数を使わずLeft関数だけで済ませることもできます。次のコードは、同じ結果をMid関数とLeft関数それぞれで書いた比較です。
Dim code As String
code = "ABC-12345"
'' Mid関数で書く場合
MsgBox Mid(code, 1, 3) '' 実行結果: ABC
'' Left関数で書く場合(開始位置の指定が不要でシンプル)
MsgBox Left(code, 3) '' 実行結果: ABC
「先頭から」という条件であれば、開始位置を毎回「1」と書く必要がないLeft関数の方がコードが短くなります。逆に「途中から」の場合はMid関数一択です。
この使い分けのルールはシンプルです。先頭からならLeft、途中からや末尾からの範囲指定が必要ならMid、末尾からの固定長ならRightを使う、と覚えておけば迷いません。
02 PRACTICAL COMBINATIONS Left関数・InStr関数と組み合わせた実践パターン 「決まった位置」ではなく「区切り文字の位置」で抜き出す
Mid関数だけでも十分便利ですが、実務データは「開始位置が毎回同じ」とは限りません。氏名の長さも、住所の文字数も、商品ごとにバラバラです。そこで組み合わせて使うのがLeft関数とInStr関数です。
📚 用語解説
Left関数:文字列の「先頭から」指定した文字数だけを抜き出す関数。書き方は「Left(文字列, 文字数)」。Mid関数と違い、開始位置の指定は不要(常に1文字目から数える)です。
📚 用語解説
InStr関数:ある文字列の中に、特定の文字(区切り文字など)が「何文字目にあるか」を調べる関数。書き方は「InStr(検索対象の文字列, 探したい文字)」。見つからない場合は0が返ります。
2-1. InStrで区切り位置を調べてからMidで抜き出す
「メールアドレスの@より前だけ取り出したい」「住所の都道府県だけ取り出したい」といった、区切り文字の位置が毎回違うデータを扱うときは、InStrで区切り位置を先に調べ、その結果をMidやLeftに渡すのが定番パターンです。
Dim mail As String
mail = "yamazaki@genai-ai.co.jp"
Dim pos As Integer
pos = InStr(mail, "@")
Dim userName As String
userName = Left(mail, pos - 1)
MsgBox userName '' 実行結果: yamazaki
InStrで「@」の位置を調べ、そこから1文字前までをLeftで抜き出しています。
同じ考え方で、@より後ろの「ドメイン部分」を取り出したい場合はMid関数を使います。InStrで見つけた「@」の位置に1を足した位置を開始位置として、Mid関数に渡せば、ドメイン部分だけを抜き出せます。
2-2. 都道府県名を抜き出す実践例
住所データから都道府県名だけを抜き出したいケースはよくありますが、「東京都」は3文字、「神奈川県」は4文字と、文字数が一定ではありません。この場合、InStrで「都」「道」「府」「県」のいずれかが最初に現れる位置を探し、そこまでをLeftで切り出す、という工夫が必要になります。
「越谷市」のように「市」が先に来る、あるいは住所の途中に偶然「県」を含む文字列(施設名など)があるケースでは、単純なInStr判定だけでは誤爆することがあります。実務データで使う前に、必ず数十件〜数百件のサンプルでテストしてから本番運用に組み込んでください。
2-3. Right関数も覚えておくと便利
Left関数の逆で、文字列の末尾から指定文字数を抜き出すRight関数もあります。書き方は「Right(文字列, 文字数)」。拡張子を抜き出す、末尾の枝番だけ取り出す、といった場面で使います。
ここまでの「区切り文字の位置を調べてから切り出す」という一連の流れを図にすると、次のようになります。
yamazaki@genai-ai.co.jp
区切り位置を検索
"@"の位置=9
切り出す
Left(文字列, 8)
yamazaki
03 MIXED CHARACTER HANDLING 全角・半角が混在する文字列を扱う注意点 日本語データ特有のズレに気をつける
日本語の業務データでは、全角と半角の文字が同じ列に混在していることが珍しくありません。「株式会社ABC」のように、全角の日本語と半角のアルファベットが1つのセルに同居しているケースです。
📚 用語解説
全角・半角:同じ文字でも表示上の幅が異なる2種類の文字種。「A」(全角)と「A」(半角)、「1」(全角数字)と「1」(半角数字)はデータとしては別の文字として扱われます。見た目が似ていても、VBAの文字列比較では一致しません。
3-1. なぜ全角半角混在で結果がズレるのか
Mid関数・Left関数・InStr関数は、いずれも全角・半角を区別せず「1文字」を1文字としてカウントします(バイト数ではなく文字数ベース)。そのため、抜き出し自体が文字化けしたり途中で切れたりすることは基本的にありません。ただし、InStrで検索する文字が全角と半角で異なる場合、意図した位置が見つからずに0が返ってくるという形でズレが表面化します。
「株式会社」の後ろに続くスペースが、あるデータでは全角スペース「 」、別のデータでは半角スペース「 」になっているケース。InStrで半角スペースだけを検索していると、全角スペースのデータでは0(見つからない)が返り、後続のMid処理でエラーになります。
3-2. 対処法:StrConv関数で事前に統一する
この手のズレを防ぐ定番の対処法は、文字列処理を始める前にStrConv関数で全角・半角を統一しておくことです。「StrConv(文字列, vbNarrow)」で全角を半角に、「StrConv(文字列, vbWide)」で半角を全角に変換できます。抜き出し処理の前に一度そろえておけば、区切り文字の検索漏れを防げます。
📚 用語解説
StrConv関数:文字列の変換(全角⇔半角、大文字⇔小文字、ひらがな⇔カタカナなど)を行うVBAの関数。文字列処理の前処理として、データの表記ゆれをそろえるときによく使われます。
04 ERRORS AND MID STATEMENT よくあるエラーとMidステートメントとの違い つまずきやすいポイントを先回りして解消する
Mid関数まわりでよく遭遇するエラーと、紛らわしい「Midステートメント」との違いを整理します。
4-1. よくある実行時エラー3つ
| エラー番号・内容 | 主な原因 | 対処法 |
|---|---|---|
| 実行時エラー5(プロシージャの呼び出し、または引数が不正) | Mid関数の開始位置に0や負の数を渡している | InStrの結果をそのまま開始位置に使わず、0のときの分岐処理を入れる |
| 実行時エラー13(型が一致しません) | 数値が入るべき変数に文字列や空欄(Null)が渡っている | 変数の型宣言(Dim)を確認し、IsNumericなどで事前チェックする |
| 意図しない空文字・想定と違う結果 | InStrが0(見つからない)を返しているのに気づかず後続処理を続けている | InStrの戻り値が0かどうかを必ずIf文で判定してから次の処理に進む |
InStr関数は「見つからない」場合にエラーではなく0を返します。これを確認せずにMidやLeftの引数へ渡すと、実行時エラーになるか、あるいはエラーにならずに意図しない中途半端な文字列が返ってきて、気づかないままデータが壊れることもあります。必ず「If InStr(...) > 0 Then」で分岐を入れてください。
4-2. Mid関数とMidステートメントは別物
紛らわしいのが、Mid関数(値を取り出す)とMidステートメント(値を代入する)の違いです。見た目はどちらも「Mid(...)」ですが、書く場所によって役割が変わります。
| Mid関数 | Midステートメント | |
|---|---|---|
| 役割 | 文字列の一部を「読み取って」返す | 文字列の一部を「別の文字に置き換える」 |
| 書き方の位置 | =の右側(値として使う) | =の左側(代入先として使う) |
| 文字列の長さ | 変化しない(元の文字列はそのまま) | 変化しない(置き換えるだけで長さは伸びない) |
| コード例 | kekka = Mid(moto, 3, 2) | Mid(moto, 3, 2) = "AB" |
Midステートメントは「元の文字列の3文字目から2文字分を、"AB"という文字に置き換える」という意味になります。文字列を丸ごと作り直すのではなく、指定した位置の文字だけをピンポイントで書き換えたいときに使う、少し特殊な用途の書き方です。業務マクロで頻繁に使う機能ではありませんが、「Midという名前が2つの意味で登場する」ことを知らないと、コードを読むときに混乱の原因になります。
📚 用語解説
ステートメント:VBAにおいて「値を返す関数」ではなく「何かを実行する命令文」のこと。Midステートメントのほか、代入や制御構文(If、For等)もステートメントの一種です。
05 REAL-WORLD PATTERNS 【独自】現場でよくある文字列抽出パターン7選 「どの関数を組み合わせればいいか」を業務シーン別に整理
ここからは、実際の業務でよく発生する「文字列の一部を抜き出したい」というシーンを7つ集めて、それぞれどの関数を組み合わせればよいかを一覧にしました。自分の業務に近いものがあれば、そのまま応用できます。
| 業務シーン | 元データの例 | 抜き出したい部分 | 使う関数の組み合わせ |
|---|---|---|---|
| 伝票番号から発行年を取得 | GENAI-2026-0731 | 2026(発行年) | Mid(文字列, 7, 4) |
| メールアドレスのドメイン確認 | yamazaki@genai-ai.co.jp | genai-ai.co.jp | InStrで@の位置を調べ、Midで後半を抽出 |
| 住所から都道府県だけ抽出 | 東京都千代田区〇〇1-2-3 | 東京都 | InStrで「都道府県」の位置を調べ、Leftで抽出 |
| 氏名から姓だけ抽出 | 山崎 太郎 | 山崎 | InStrでスペース位置を調べ、Leftで抽出 |
| 商品コードから型番の分類部分を抽出 | AB-1234-XL | AB | Left(文字列, 2) |
| 日付文字列から年月だけ抽出 | 2026年07月31日 | 2026年07月 | Left(文字列, 8) |
| URLからページ末尾のスラッグを抽出 | https://example.com/blog/vba-guide | vba-guide | InStrRevで最後の/位置を調べ、Midで抽出 |
📚 用語解説
InStrRev関数:InStrと似ていますが、文字列を「後ろから」検索して、最後に見つかった位置を返す関数。URLの末尾のスラッグや、ファイルパスの拡張子を抜き出すときなど、「最後の区切り文字」を探したい場面で使います。
この表を作るときに意識したいのは、「区切り文字が1種類しかないか、複数あるか」という視点です。伝票番号や商品コードのように固定フォーマットのデータはMid・Leftだけで完結しますが、住所やURLのように区切り文字の位置が可変のデータはInStr系の関数と組み合わせる必要が出てきます。データを扱う前に、まずこの2パターンのどちらに当てはまるかを見極めるだけで、書くべきコードの方針がぐっと絞り込めます。
この一覧から分かる通り、実務の文字列抽出は「固定の位置から切る」(Mid・Left・Right)か「区切り文字の位置を調べてから切る」(InStr・InStrRev+Mid/Left/Right)の、大きく2パターンの組み合わせでほぼカバーできます。
このようなパターンをVBAのコードとして社内マニュアル化しておくと、担当者が変わっても同じ処理を再現しやすくなります。ただし、後述する通り「マニュアル化してもコードを読める人が限られる」という属人化の課題は残ります。
06 AI ALTERNATIVE 【独自データ】VBAを書かずにAIに任せるという選択肢 Mid・Left・InStrの組み合わせを、そもそも書かなくて済む方法
ここまでVBAでの正しい書き方を解説してきましたが、正直なところ「開始位置」「InStr」「エラー処理」といった専門用語を覚えるのが億劫だ、という方も多いはずです。実際、弊社(株式会社GENAI)に寄せられる相談でも、「VBAが書ける社員が辞めてマクロが誰にもメンテナンスできなくなった」という声は非常に多く聞きます。
2026年現在、この手の「文字列の一部を抜き出す」作業は、VBAのコードを1行も書かずにAI(Claude Code)に日本語で指示するだけで完結させることができます。「この列の伝票番号から年だけ抜き出して、隣の列に入れて」と話しかければ、AIが処理内容を組み立てて実行してくれる、というイメージです。
構文を覚える
↓
コードを書く
↓
デバッグする
日本語で
指示するだけ
6-1. VBAで自分で書く vs AIに任せる:比較
| 比較軸 | VBAで自分で書く | AI(Claude Code)に任せる |
|---|---|---|
| 学習コスト | 構文・関数名・エラーの意味を覚える必要あり | 日本語で伝えるだけ、構文の学習は不要 |
| 初回セットアップ | VBAエディタを開いてコード記述・デバッグ | チャットで「◯◯を抜き出して」と伝えるだけ |
| メンテナンス | データ形式が変わるたびコードを修正する必要あり | 都度AIに再指示すればよく、コード資産の管理が不要 |
| 属人化リスク | 書いた本人しか直せないことが多い | 誰でも自然言語で同じ処理を再現・引き継げる |
| 向いている用途 | 毎日同じ処理を大量・高速に反復する定型バッチ | 条件が毎回変わる非定型作業、非エンジニアの単発〜中頻度作業 |
弊社ではClaude Max 20xプラン(月額$200・約30,000円)を全社契約し、経理・秘書業務・広告運用・記事制作まで幅広い業務にAIを組み込んで運用しています。中でも経理領域では、請求書のチェックや経費仕訳、会計ソフト(freee)との連携といった、まさに「決まったフォーマットの文字列から必要な部分を抜き出す」作業が多く、月40時間かかっていた作業が月5時間程度まで圧縮できている肌感です。
秘書業務でも同様の傾向があります。日報や議事録から日付・担当者名・案件番号といった定型項目を抜き出してスケジュールに転記する作業は、以前は1日あたり2時間ほどかかっていましたが、AIに任せるようになってからは1日15分程度まで圧縮できている肌感です。これらの数値はいずれも弊社の運用実績に基づく概算であり、業種や担当者のスキルによって変動する点はご留意ください。
📚 用語解説
Claude Code:Anthropicが提供するAIエージェント。チャットで日本語の指示を出すだけで、Excelファイルの読み込み・文字列の抜き出し・表への書き出しといった一連の作業を自律的に実行します。VBAのようにコードを書く必要はなく、非エンジニアでも直感的に使えるのが特徴です。
「Maxプランは高そう」と感じる方もいるかもしれませんが、弊社の肌感では、複数業務を横断的にAIへ任せることで1名分の業務量(月間概算160時間相当)を分担して捌けている感覚があり、人件費換算で考えると投資回収は早い水準です(数値はあくまで弊社の運用実績に基づく概算です)。
VBAコードを書かずに、Excel業務をAIに任せてみませんか
文字列抽出だけでなく、集計・転記・ファイル整理まで、Excel周りの定型作業はAIに置き換えられるケースが数多くあります。
まずは無料相談で、御社のどの業務がAI化に向いているかを一緒に整理します。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
07 CONCLUSION まとめ VBAの基本を押さえつつ、AIという選択肢も持っておく
この記事では、VBAのMid関数を中心に、Left関数・InStr関数との組み合わせ、全角半角混在時の注意点、よくあるエラーとMidステートメントとの違い、そして業務でよくある抽出パターン7選までを解説しました。最後にポイントを振り返ります。
VBAの知識は、Excel業務を深く理解するうえで今でも役立ちます。同時に、2026年現在は「そのコードを書く手間そのものをAIに任せる」という選択肢も現実的になっています。自社の業務がどちらに向いているか迷ったら、まずは1つの作業を試してみることから始めてください。
よくある質問
Q. Mid関数とLeft関数、どちらを使えばいいですか?
A. 文字列の「先頭から」固定の文字数を抜き出したいだけならLeft関数の方がシンプルです。一方、文字列の途中(例えば7文字目から)を抜き出したい場合はMid関数を使います。用途によって使い分けるのが基本で、迷ったら「先頭からか、途中からか」で判断してください。
Q. Mid関数の開始位置に0を指定するとどうなりますか?
A. 実行時エラー5「プロシージャの呼び出し、または引数が不正です」が発生します。Mid関数の開始位置は1文字目を「1」として数えるルールのため、0や負の数を渡すとエラーになります。InStr関数の戻り値をそのまま開始位置に渡すコードでは、見つからない場合に0が返るため、このエラーが起きやすいので事前チェックが必要です。
Q. 全角と半角が混在するデータでMid関数を使うと結果がズレますか?
A. Mid・Left・Right関数自体は全角半角を区別せず「1文字」として数えるため、抜き出し処理そのものが文字化けすることは基本的にありません。ただし、InStr関数で検索する区切り文字(スペースなど)が全角・半角で異なると、検索位置が見つからずズレが発生します。StrConv関数で事前に表記をそろえておくと安全です。
Q. MidステートメントとMid関数は何が違うのですか?
A. Mid関数は文字列の一部を「読み取って」値として返すのに対し、Midステートメントは「=」の左側に書くことで、指定した位置の文字を別の文字に「置き換える」という異なる役割を持ちます。文字列の長さは変わらず、指定範囲の文字だけがピンポイントで書き換わります。
Q. VBAを使わずにExcelの文字列抽出をAIにやらせることは実際に可能ですか?
A. 可能です。Claude CodeのようなAIエージェントに「A列の住所から都道府県だけをB列に抜き出して」と日本語で指示するだけで、VBAのコードを書かなくても同様の処理を実行できます。特に非エンジニアの担当者が多い部署や、都度条件が変わる非定型作業では、VBAを学ぶよりAIに任せる方が結果的に早いケースが多いです。
Q. VBAのスキルはAI時代に不要になりますか?
A. 完全に不要にはなりません。毎日同じ処理を大量かつ高速に繰り返す定型バッチ処理では、VBAのマクロに今でも分があります。一方で、条件が都度変わる作業や、コードを書ける人がいない部署の業務については、AIに任せた方が学習コスト・属人化リスクの両面で有利になるケースが増えています。
Q. InStr関数で複数の候補(例:都道府県の「都」「道」「府」「県」)を検索したいときはどうすればいいですか?
A. それぞれの文字についてInStrを個別に実行し、0以外の結果(見つかった位置)の中から最も小さい値を採用する、という比較処理を書くのが一般的です。この分岐が煩雑に感じる場合は、AIに「住所から都道府県名を抜き出して」と指示する方が、条件分岐を意識せずに済みます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AIBPO by AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




