Excelで業務データを扱っていると、「文字列の一部を取り出したい」という場面は頻繁に発生します。
しかし実務では、単純に先頭や末尾を切り出すだけでは対応できず、データの形式が複数存在することがほとんどです。
たとえば、
- 「商品名-型番」と「商品名_型番」が混在している
- 括弧付きの補足情報がある場合とない場合がある
- 数字だけ取り出したいが、文字列内の位置が毎回異なる
こうしたケースでは、1つの処理だけでは対応できず、複数条件を考慮した抽出ロジックが必要になります。
この記事では、Excel VBAを使って
「複数条件で文字列の一部を正確かつ安定して抽出する方法」を、
基礎から実務レベルまで体系的に解説します。
単なるコード集ではなく、「なぜその書き方が必要なのか」「実務で壊れにくい設計とは何か」まで理解できる構成になっています。
目次
- ✅ 複数条件で文字列抽出が必要になる理由
- ・実務データは必ず揺れる
- ・関数では限界がある理由
- ✅ If文を使った複数条件抽出の基本構造
- ・基本構文の考え方
- ・区切り文字が異なる場合の抽出例
- ✅ InStr を組み合わせた条件判定と抽出
- ・特定文字を含むかどうかで分岐する
- ・複数のInStr条件を組み合わせる例
- ✅ Select Case を使った条件分岐の整理
- ・Select Case True を使った書き方
- ✅ 正規表現を使った複数条件抽出(実務向け)
- ・数字を含む場合のみ抽出する例
- ・英数字混在パターンの抽出
- ✅ 複数条件 × 正規表現を組み合わせた設計例
- ✅ 大量データを扱う際の注意点(処理速度)
- ・配列処理を前提にする
- ✅ UiPath・RPAを前提にした抽出ロジック設計
- ✅ まとめ:複数条件での文字列抽出をVBAで安定させる考え方
✅ 複数条件で文字列抽出が必要になる理由
文字列抽出は簡単そうに見えて、実務では失敗しやすい処理の代表格です。
条件が1つだけだと思い込んで作った処理は、少しデータが変わっただけで簡単に壊れます。
特にExcel VBAは「一度動いたから安心」と思われがちですが、条件設計が甘いと後から必ず問題が出ます。
ここでは、なぜ複数条件を前提に設計すべきなのかを整理します。
この考え方を理解していないと、後半のコードも意味を成しません。
まずは実務の現実を把握してください。
・実務データは必ず揺れる
理想的には、すべてのセルが同じ形式で入力されていれば楽ですが、現実はそうはいきません。
- 手入力されたデータ
- 他システムからコピーされた文字列
- 過去データと新データの混在
このような状況では、形式の揺れを前提にした処理が必須になります。
・関数では限界がある理由
Excel関数でも条件分岐は可能ですが、
- 数式が長くなり可読性が下がる
- 条件追加のたびに修正が困難
- エラー原因の特定が難しい
といった問題が出やすくなります。
VBAを使うことで、条件を明示的に分岐でき、保守性が大きく向上します。
✅ If文を使った複数条件抽出の基本構造
複数条件を扱う際の基本は If / ElseIf / Else です。
この構造を正しく理解していないと、抽出結果が不安定になります。
特に条件の「順番」は、実務で非常に重要なポイントです。
ここを適当に書くと、正しい条件が無視されることがあります。
・基本構文の考え方
Dim txt As String
Dim result As String
txt = Range("A1").Value
If 条件1 Then
' 処理A
ElseIf 条件2 Then
' 処理B
Else
' それ以外
End If
ポイント
- 条件は上から順に評価される
- 最初に一致した条件のみ実行される
- 条件の優先順位を明確にする必要がある
・区切り文字が異なる場合の抽出例
If InStr(txt, "-") > 0 Then
result = Split(txt, "-")(1)
ElseIf InStr(txt, "_") > 0 Then
result = Split(txt, "_")(1)
End If
実務での注意点
- どちらの区切りが優先されるか明確にする
- 両方含まれるケースも想定する
参考:【Excel】CSVの区切り文字を変更・指定して読み込む方法|列ズレ・文字化けを防ぐ実務ガイド
✅ InStr を組み合わせた条件判定と抽出
InStrは、複数条件抽出の中核となる関数です。
位置が固定されていない文字列でも柔軟に対応できます。
ただし、使い方を誤ると想定外の結果を返すため注意が必要です。
・特定文字を含むかどうかで分岐する
If InStr(txt, "(") > 0 And InStr(txt, ")") > 0 Then
result = Mid(txt, InStr(txt, "(") + 1, InStr(txt, ")") - InStr(txt, "(") - 1)
End If
なぜこの書き方が必要か
- 開始位置と終了位置の両方を確認する
- 片方だけ存在するケースを防ぐ
・複数のInStr条件を組み合わせる例
If InStr(txt, "-") > 0 And InStr(txt, "A") > 0 Then
' 条件を満たす場合のみ処理
End If
実務ポイント
- And / Or の使い分けを明確にする
- 条件が増えたら可読性を意識する
✅ Select Case を使った条件分岐の整理
条件が増えてくると、If文だけでは読みにくくなります。
その場合は Select Case を使うことで、構造を整理できます。
・Select Case True を使った書き方
Select Case True
Case InStr(txt, "-") > 0
result = Split(txt, "-")(1)
Case InStr(txt, "_") > 0
result = Split(txt, "_")(1)
Case Else
result = ""
End Select
メリット
- 条件が視覚的に分かりやすい
- 追加・修正が容易
参考:【VBA】Select Case文の使用例と適用パターン|条件分岐を効率化する方法
✅ 正規表現を使った複数条件抽出(実務向け)
条件が複雑になるほど、正規表現の価値が高まります。
「複数条件=If文」と考えがちですが、1つの正規表現で条件を表現できるケースも多くあります。
・数字を含む場合のみ抽出する例
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "\d+"
reg.Global = False
If reg.Test(txt) Then
result = reg.Execute(txt)(0)
End If
実務での強み
- データ形式が多少変わっても対応できる
- 条件追加が比較的容易
・英数字混在パターンの抽出
reg.Pattern = "[A-Z]{2}\d{3}"
想定例
- 管理番号
- 製品コード
- ロット番号
参考:ChatGPTで正規表現(RegExp)を使うVBA作成|複雑な文字処理をAIで自動化する方法
✅ 複数条件 × 正規表現を組み合わせた設計例
If InStr(txt, "ID") > 0 Then
reg.Pattern = "ID\d+"
ElseIf InStr(txt, "NO") > 0 Then
reg.Pattern = "NO\d+"
End If
設計の考え方
- 大枠の条件はIf文
- 抽出ルールは正規表現
この分離が、保守性を大きく高めます。
✅ 大量データを扱う際の注意点(処理速度)
複数条件抽出は処理が重くなりがちです。
セルを1つずつ処理すると、業務では使い物にならない速度になることもあります。
・配列処理を前提にする
- Rangeを配列に読み込む
- 配列上で条件判定・抽出
- 結果を一括で書き戻す
この設計だけで、処理時間が大幅に短縮されます。
参考:【VBA】2次元配列を使用して一括で格納・格納データをループで処理する方法
✅ UiPath・RPAを前提にした抽出ロジック設計
最近では、Excel VBA単体ではなく、RPAと連携した運用が増えています。
この場合、VBA側で文字列抽出を安定させておくことが重要です。
- RPAでファイル取得
- VBAで複数条件抽出
- RPAで結果を別システムへ登録
この役割分担により、フロー全体が非常にシンプルになります。
✅ まとめ:複数条件での文字列抽出をVBAで安定させる考え方
- 実務データは必ず形式が揺れる
- 複数条件を前提に設計することが重要
- If / ElseIf の順序が結果を左右する
- InStr は位置不定データに強い
- 正規表現を使うことで条件を集約できる
- 配列処理で速度問題を回避する
- RPA連携を見据えた設計が将来的に有効
複数条件での文字列抽出は、単なるテクニックではなく業務を止めないための設計力です。
この記事の内容をベースに、自社データに合ったロジックを構築してみてください。
結果として、Excel作業の信頼性と効率が大きく向上します。