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

【VBA】文字列の先頭・末尾を自動判定して一部を取得する方法【実務向け完全解説】

Excel VBAで業務自動化を進めていると、
「文字列の一部だけを取り出したい」
「先頭や末尾にある決まった文字を除去したい」
「フォーマットが微妙に違うデータを同じ形に揃えたい」
といった要望に必ず直面します。

一見すると単純な文字列操作に見えますが、実務では

  • 文字数が一定でない
  • 先頭・末尾の文字がある場合とない場合が混在する
  • 記号・スペース・全角半角が入り混じる
    といった揺らぎのあるデータを扱うことがほとんどです。

このようなケースで
「Left関数」「Right関数」「Mid関数」を決め打ちで使ってしまうと、
データが変わった瞬間にマクロが壊れます。

この記事では、
文字列の先頭・末尾を“自動判定”しながら、安全に一部を取得する方法をテーマに、

  • 基本的な考え方
  • 実務でよくある失敗パターン
  • 判定ロジックの組み立て方
  • 再利用しやすい関数化の方法
  • RPAや他システム連携を見据えた設計

までを体系的に解説します。

「とりあえず動くVBA」から、
壊れない・使い回せるVBAへレベルアップするための内容です。

✅ VBAで文字列の先頭・末尾を扱う前に理解しておくべき考え方

文字列操作は、VBA初心者が最初につまずきやすい分野です。
特に「先頭」「末尾」という言葉のイメージだけで処理を書いてしまうと、
想定外のデータで簡単に破綻します。

この章では、具体的なコードに入る前に、
実務で必ず押さえておくべき前提を整理します。
ここを飛ばすと、後半のコードが「暗記」に近くなってしまいます。

・文字列は「位置」ではなく「条件」で判断する

実務データでは、
「必ず3文字目から始まる」
「必ず末尾2文字が不要」
という前提が崩れることが多くあります。

そのため、
何文字目かではなく、
どんな文字があるか
を基準に判定する発想が重要です。

・先頭・末尾の判定は「あるかどうか」をまず確認する

不要な文字がある前提で処理を書くと、
存在しない場合にエラーや誤取得が発生します。

実務では必ず、
「先頭にその文字があるか」
「末尾にその文字があるか」
を判定してから処理を行います。


✅ 文字列の先頭・末尾を取得する基本関数の整理

まずは、VBAで文字列を扱う際の基本関数を整理します。
これらは後半の応用でも必ず使います。

・Left関数:先頭から指定文字数を取得

Left(文字列, 文字数)

例:

Left("ABCDEF", 3)
' 結果:ABC

・Right関数:末尾から指定文字数を取得

Right(文字列, 文字数)

・Mid関数:途中から指定文字数を取得

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

※ これらは文字数が確定している場合のみ安全です。


✅ 先頭の特定文字を自動判定して除去する方法

ここから実務的な内容に入ります。
まずは「先頭に特定の文字があれば除去する」基本パターンです。

・先頭1文字を判定する基本構文

If Left(str, 1) = "A" Then
    str = Mid(str, 2)
End If

この処理では、

  • 先頭が「A」の場合のみ
  • 2文字目以降を取得

します。

・実務での注意点

  • 先頭が空白の場合
  • 全角・半角が混在する場合

これらを考慮しないと、想定外の結果になります。


✅ 末尾の特定文字を自動判定して除去する方法

末尾処理も同様に「あるかどうか」を判定します。

・末尾1文字を判定する基本構文

If Right(str, 1) = "Z" Then
    str = Left(str, Len(str) - 1)
End If

・Len関数を使う理由

Len関数を使うことで、
文字列の長さが変わっても対応可能になります。


✅ 先頭・末尾どちらにも対応する汎用ロジック

実務では、
「先頭にも末尾にも余計な文字が付く可能性がある」
ケースが非常に多くあります。

・先頭・末尾を両方チェックする例

If Left(str, 1) = "[" Then
    str = Mid(str, 2)
End If

If Right(str, 1) = "]" Then
    str = Left(str, Len(str) - 1)
End If

このように分けて判定することで、安全性が高まります。


✅ 特定文字がある位置を自動判定して取得する方法

文字数が不定の場合は、
「位置を探してから取得する」方法が有効です。

・InStr関数の基本

InStr(文字列, 検索文字)

・記号より後ろを取得する例

Dim pos As Long
pos = InStr(str, "-")

If pos > 0 Then
    str = Mid(str, pos + 1)
End If

✅ 先頭・末尾の空白を考慮した実務向け処理

見た目では分かりにくいですが、
先頭・末尾の空白はトラブルの元です。

・Trim関数を併用する例

str = Trim(str)

この一行を入れるだけで、
判定ミスの多くを防げます。

参考:【VBA】セル内の数字だけ/文字だけを抽出する方法を完全解説【混在データ対応】


✅ 複数パターンに対応する実務ロジック

実務では、

  • 先頭に「#」がある
  • 末尾に「_old」が付く
  • どちらもない

といった複数パターンが混在します。

・Select Caseを使った例

Select Case True
    Case Left(str, 1) = "#"
        str = Mid(str, 2)
    Case Right(str, 4) = "_old"
        str = Left(str, Len(str) - 4)
End Select

✅ 関数化して再利用性を高める設計

実務VBAでは、
処理を関数化することが非常に重要です。

・先頭・末尾判定を行う関数例

Function RemoveEdgeChar(ByVal txt As String, _
                        ByVal headChar As String, _
                        ByVal tailChar As String) As String

    txt = Trim(txt)

    If headChar <> "" Then
        If Left(txt, Len(headChar)) = headChar Then
            txt = Mid(txt, Len(headChar) + 1)
        End If
    End If

    If tailChar <> "" Then
        If Right(txt, Len(tailChar)) = tailChar Then
            txt = Left(txt, Len(txt) - Len(tailChar))
        End If
    End If

    RemoveEdgeChar = txt

End Function

・この関数のメリット


✅ エラーを防ぐための防御的コーディング

文字列が空の場合も必ず考慮します。

If Len(txt) = 0 Then Exit Function

この一文があるだけで、
実務マクロの安定性が大きく向上します。


✅ RPA・他システム連携を見据えた考え方

UiPathやRPAと連携する場合、
VBA側で文字列を正規化しておくことが非常に重要です。

  • ファイル名
  • フォルダ名
  • メール件名

これらは先頭・末尾の不要文字が原因で、
自動化が失敗するケースが多発します。


 

✅ まとめ:文字列の先頭・末尾を自動判定するVBAを身につけよう

  • 文字数決め打ちは実務では危険
  • 必ず「あるかどうか」を判定する
  • InStrで位置を探す発想が重要
  • 関数化で再利用性と保守性を高める
  • 防御的コーディングで壊れないVBAにする

文字列操作を正しく設計できるようになると、
VBAの実務レベルは一段階上がります。

ぜひ本記事の考え方をベースに、
実データに耐えられる文字列処理を構築してみてください。

参考:【VBA】区切り文字(カンマ・スラッシュ)で文字列を分割して取得する

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