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

【VBA】セル内の文字を位置指定で切り出す方法(開始位置と文字数)

Excel VBAでデータ加工をしていると、
「セルの○文字目から△文字分だけを取り出したい」
という要件は非常に頻繁に登場します。

たとえば、

  • 商品コードの決まった桁だけを抽出したい
  • ファイル名の先頭◯文字を除いた部分を取得したい
  • CSVや固定長データから特定区間を切り出したい
  • システム連携用に文字位置が決まったデータを分解したい

こうした処理の中心になるのが、開始位置と文字数を指定して文字列を切り出す方法です。
VBAでは主に Mid関数 を使いますが、
使い方を正しく理解していないと、
・1文字ずれる
・空白や全角で崩れる
・エラーが出る
といったトラブルが頻発します。

この記事では、
セル内の文字を「開始位置」と「文字数」で安全・正確に切り出す方法を、
基礎から実務レベルまで体系的に解説します。

✅ VBAで「位置指定の文字切り出し」が重要な理由

VBAで扱うデータは、必ずしも区切り文字が存在するとは限りません。
特に基幹システムや外部データでは、
「◯桁目〜◯桁目までが意味を持つ」という固定長データが多く存在します。
このような場合、区切り文字検索では対応できません。
位置指定による切り出しができるかどうかで、
VBAの実務対応力は大きく変わります。
まずは、この処理がなぜ重要なのかを整理します。

・固定長データへの対応

CSVやテキストでも、
内部仕様として文字位置が決まっているケースは非常に多いです。

・文字列整形の基本処理

位置指定で切り出せるようになると、
データ整形・変換処理の幅が一気に広がります。


✅ VBAで使う基本関数「Mid関数」の役割

位置指定の文字切り出しで中心となるのが Mid関数 です。
この関数の仕様を正しく理解していないと、
どんなにコードを書いても安定しません。
ここでは、Mid関数の基本構造と考え方を整理します。
基礎ですが、最も重要なポイントです。

・Mid関数の基本構文

Mid(文字列, 開始位置, [文字数])

・各引数の意味

  • 文字列
    切り出し対象の文字列
  • 開始位置
    何文字目から切り出すか(1始まり)
  • 文字数(省略可)
    何文字分切り出すか

開始位置は 1から始まる 点が非常に重要です。


✅ セル内の文字を開始位置と文字数で切り出す基本例

まずは、最も基本となる処理から確認します。
セル内の文字列をそのまま対象にし、
指定した位置と文字数で切り出す例です。
この処理が、すべての応用の土台になります。

・基本コード例

Sub ExtractByPosition_Basic()

    Dim src As String
    Dim result As String

    src = Range("A1").Value
    result = Mid(src, 3, 4)

    MsgBox result

End Sub

・コード解説

  1. セルA1の文字列を取得
  2. 3文字目から4文字分を切り出す
  3. 結果を表示

文字列が「ABCDEFG」の場合、結果は「CDEF」になります。


✅ 文字数を省略した場合の挙動を理解する

Mid関数は、
文字数を省略すると「開始位置から最後まで」を切り出します。
この仕様を理解していないと、
意図せず長い文字列を取得してしまいます。
ここでは、省略時の挙動を確認します。

・文字数省略の例

result = Mid(src, 5)

5文字目から末尾までを取得します。

・実務での利用シーン

  • ファイル名の拡張子以外を取得
  • 区切り文字以降をすべて取得

✅ 開始位置が文字列長を超える場合の注意点

実務では、
必ずしも文字列の長さが想定どおりとは限りません。
開始位置が文字列長を超えると、
結果は空文字になります。
エラーにはなりませんが、
この挙動を理解していないと誤判定につながります。

・開始位置チェックの重要性

If Len(src) >= startPos Then
    result = Mid(src, startPos, length)
Else
    result = ""
End If

✅ セル内データを安全に処理するための存在チェック

VBAでセルを扱う場合、
空白セル・数値セル・エラー値セルなどが混在します。
文字列として扱う前に、
最低限のチェックを入れることが重要です。
この章では、実務で必須の安全対策を解説します。

・空白チェックを入れた例

If Trim(src) = "" Then
    result = ""
    Exit Sub
End If

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


✅ InStrと組み合わせて開始位置を動的に決める

固定位置だけでなく、
検索結果を基準に切り出すケースも非常に多いです。
ここで登場するのが InStr関数 です。
この組み合わせは、VBA文字列処理の王道です。

・組み合わせ例

Sub ExtractAfterKeyword()

    Dim src As String
    Dim pos As Long
    Dim result As String

    src = Range("A1").Value
    pos = InStr(src, "_")

    If pos > 0 Then
        result = Mid(src, pos + 1, 3)
        MsgBox result
    End If

End Sub

✅ 文字位置が全角・半角混在する場合の考え方

日本語データでは、
全角文字と半角文字が混在するケースが多くあります。
VBAのMid関数は「文字数」を基準に処理しますが、
表示幅とは一致しません。
ここを誤解すると、
見た目と結果がズレます。

・文字数と表示幅は別物

全角1文字も半角1文字も、
VBAでは1文字としてカウントされます。

参考:【VBA】Replace関数でスペース(半角:全角)を削除する方法


✅ 複数セルをループ処理で切り出す実務例

実務では、
1セルだけ処理することはほとんどありません。
多くの場合、
複数行のデータをまとめて処理します。
ここでは、For Eachを使った実務例を紹介します。

・ループ処理例

Sub ExtractRangeByPosition()

    Dim c As Range
    Dim src As String

    For Each c In Range("A1:A10")
        src = c.Value
        c.Offset(0, 1).Value = Mid(src, 2, 5)
    Next c

End Sub

✅ 処理を関数化して再利用性を高める

同じ切り出し処理を何度も書くのは非効率です。
関数化することで、
コードの可読性・保守性が大きく向上します。
RPAや長期運用では特に重要です。

・関数化の例

Function ExtractByPosition(src As String, _
                           startPos As Long, _
                           length As Long) As String

    If Len(src) < startPos Then
        ExtractByPosition = ""
    Else
        ExtractByPosition = Mid(src, startPos, length)
    End If

End Function

✅ よくある失敗パターンとその回避策

位置指定の切り出しで、
特に多い失敗を整理します。

  • 開始位置を0と勘違いする
  • 文字数を超えるケースを考慮していない
  • 空白セルを想定していない
  • 全角・半角の違いを誤解している

これらはすべて、
今回紹介した考え方で回避できます。


✅ RPA・自動化を意識した文字切り出し設計

RPAやバッチ処理では、
「止まらないコード」が最重要です。
Mid関数自体は安全ですが、
前後のチェックを怠ると止まります。

  • 空白・長さチェックを必ず入れる
  • 関数化して共通処理にする
  • 戻り値を空文字で統一する

この設計思想は、
後々大きな差になります。


 

✅ まとめ:位置指定で文字を切り出すVBA処理の基本

  • Mid関数が位置指定切り出しの中心
  • 開始位置は1始まり
  • 文字数省略時の挙動を理解する
  • 長さチェックで安全性を高める
  • InStrと組み合わせると応用が広がる
  • 関数化で再利用性を向上させる

セル内の文字を位置指定で切り出す処理は、
VBA実務における基礎中の基礎です。
今回の内容をしっかり理解すれば、
文字列加工で迷うことはほとんどなくなるはずです。

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

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