Excel VBAで業務自動化を進めていると、
「文字列の一部だけを取り出したい」
「先頭や末尾にある決まった文字を除去したい」
「フォーマットが微妙に違うデータを同じ形に揃えたい」
といった要望に必ず直面します。
一見すると単純な文字列操作に見えますが、実務では
- 文字数が一定でない
- 先頭・末尾の文字がある場合とない場合が混在する
- 記号・スペース・全角半角が入り混じる
といった揺らぎのあるデータを扱うことがほとんどです。
このようなケースで
「Left関数」「Right関数」「Mid関数」を決め打ちで使ってしまうと、
データが変わった瞬間にマクロが壊れます。
この記事では、
文字列の先頭・末尾を“自動判定”しながら、安全に一部を取得する方法をテーマに、
- 基本的な考え方
- 実務でよくある失敗パターン
- 判定ロジックの組み立て方
- 再利用しやすい関数化の方法
- RPAや他システム連携を見据えた設計
までを体系的に解説します。
「とりあえず動くVBA」から、
壊れない・使い回せるVBAへレベルアップするための内容です。
目次
- ✅ VBAで文字列の先頭・末尾を扱う前に理解しておくべき考え方
- ・文字列は「位置」ではなく「条件」で判断する
- ・先頭・末尾の判定は「あるかどうか」をまず確認する
- ✅ 文字列の先頭・末尾を取得する基本関数の整理
- ・Left関数:先頭から指定文字数を取得
- ・Right関数:末尾から指定文字数を取得
- ・Mid関数:途中から指定文字数を取得
- ✅ 先頭の特定文字を自動判定して除去する方法
- ・先頭1文字を判定する基本構文
- ・実務での注意点
- ✅ 末尾の特定文字を自動判定して除去する方法
- ・末尾1文字を判定する基本構文
- ・Len関数を使う理由
- ✅ 先頭・末尾どちらにも対応する汎用ロジック
- ・先頭・末尾を両方チェックする例
- ✅ 特定文字がある位置を自動判定して取得する方法
- ・InStr関数の基本
- ・記号より後ろを取得する例
- ✅ 先頭・末尾の空白を考慮した実務向け処理
- ・Trim関数を併用する例
- ✅ 複数パターンに対応する実務ロジック
- ・Select Caseを使った例
- ✅ 関数化して再利用性を高める設計
- ・先頭・末尾判定を行う関数例
- ・この関数のメリット
- ✅ エラーを防ぐための防御的コーディング
- ✅ RPA・他システム連携を見据えた考え方
- ✅ まとめ:文字列の先頭・末尾を自動判定する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
・この関数のメリット
- 再利用できる
- テストしやすい
- 修正が一箇所で済む
参考:【VBA】標準モジュールの呼び出し方法とは|Sub・Functionの使い分けと実務設計
✅ エラーを防ぐための防御的コーディング
文字列が空の場合も必ず考慮します。
If Len(txt) = 0 Then Exit Function
この一文があるだけで、
実務マクロの安定性が大きく向上します。
✅ RPA・他システム連携を見据えた考え方
UiPathやRPAと連携する場合、
VBA側で文字列を正規化しておくことが非常に重要です。
- ファイル名
- フォルダ名
- メール件名
これらは先頭・末尾の不要文字が原因で、
自動化が失敗するケースが多発します。
✅ まとめ:文字列の先頭・末尾を自動判定するVBAを身につけよう
- 文字数決め打ちは実務では危険
- 必ず「あるかどうか」を判定する
- InStrで位置を探す発想が重要
- 関数化で再利用性と保守性を高める
- 防御的コーディングで壊れないVBAにする
文字列操作を正しく設計できるようになると、
VBAの実務レベルは一段階上がります。
ぜひ本記事の考え方をベースに、
実データに耐えられる文字列処理を構築してみてください。