Excel VBA と正規表現で型番を抽出し階層ソートする完全ガイド【サンプルコード付き】

目次

概要

本記事では、正規表現(RegExp オブジェクト)を用いてセル行頭の型番から 大分類番号小分類番号 を抽出し、その値を基準にデータを階層的に並べ替える手順をご説明いたします。型番フォーマットが複数存在する場合や桁数が一定でない場合でも、正規表現を活用することで柔軟に対応できます。


前提条件

項目内容
対応 ExcelMicrosoft 365 または 2016 以降
データ範囲列 A に型番を含む文字列(例:PC123-04: 製品名)が A2:A100 に配置されている想定
マクロ設置先標準モジュール
参照設定不要(CreateObject による後期バインディングを採用)

サンプルコード

Sub RegexSortByModelCode()

    Dim ws          As Worksheet
    Dim trgRange    As Range       ' 表全体
    Dim dataCell    As Range       ' ループ用セル
    Dim reObj       As Object      ' VBScript.RegExp
    Dim reMatch     As Object
    Dim patternStr  As String
    
    ' 対象シートとデータ範囲の設定
    Set ws = ActiveSheet
    Set trgRange = ws.Range("A2").CurrentRegion   ' A1 は見出し想定
    
    ' 補助列ヘッダーを追加(列 B: Major、列 C: Minor)
    ws.Range("B1:C1").Value = Array("MajorNo", "MinorNo")
    
    ' 正規表現パターン: 英字 → 数字(大分類) → ハイフン → 数字(小分類)
    patternStr = "^([A-Za-z]+)(\d+)-(\d+)"
    
    ' RegExp オブジェクトの生成
    Set reObj = CreateObject("VBScript.RegExp")
    reObj.Pattern = patternStr
    reObj.IgnoreCase = True
    reObj.Global = False
    
    '----- 型番から分類番号を抽出し補助列へ書き込み -----
    For Each dataCell In trgRange.Columns(1).Cells
        If dataCell.Row > trgRange.Row Then
            If reObj.Test(dataCell.Value) Then
                Set reMatch = reObj.Execute(dataCell.Value)(0)
                ' グループ 2: 大分類数字、グループ 3: 小分類数字
                dataCell.Offset(0, 1).Value = CLng(reMatch.SubMatches(1))
                dataCell.Offset(0, 2).Value = CLng(reMatch.SubMatches(2))
            Else
                ' マッチしない場合は空白を設定
                dataCell.Offset(0, 1).Value = Empty
                dataCell.Offset(0, 2).Value = Empty
            End If
        End If
    Next dataCell
    
    '----- Major → Minor → 型番 の順に昇順ソート -----
    With trgRange
        .Sort Key1:=.Columns(2), Order1:=xlAscending, _
              Key2:=.Columns(3), Order2:=xlAscending, _
              Key3:=.Columns(1), Order3:=xlAscending, _
              Header:=xlYes
    End With
    
End Sub

コード解説

説明
16patternStr で型番フォーマットを定義しています。英字部分は集計に使用しないためキャプチャ対象外です。
23RegExp を後期バインディングで生成するため、参照設定が不要です。
29Test でマッチ判定を行い、Execute で一致部分を取得しています。
32–33取得した数値部分を CLng で数値化し、補助列に格納しています。
40–43Sort メソッドで補助列を優先キーに設定し、整然とした並べ替えを実行しています。

応用例

目的実装のヒント
降順に並べ替えたいOrder1Order2xlDescending に変更します。
型番に英字接頭辞が複数存在するパターンを "^[A-Za-z]+(\d+)-(\d+)" のように調整して共通化できます。
枝番が存在しないデータも並べたい正規表現にオプショナル構文 -?(\d*) を加える、またはマッチしない場合に既定値を補助列へ設定します。

よくある質問

質問回答
正規表現を使うメリットは何ですか。固定文字列分割より柔軟性が高く、桁数や区切りが変動しても同一ロジックで抽出できます。
マクロ実行後に補助列を非表示にしたいのですが。ソート完了後に ws.Columns("B:C").Hidden = True を追加してください。

まとめ

正規表現を利用して型番の分類番号を抽出し、補助列をキーに階層ソートを行うことで、多様な型番パターンが混在するデータでも効率的に整理できます。まずは本サンプルを実行し、分類・並べ替えが期待どおりに行われることをご確認ください。抽出パターンやソート順序を調整すれば、さらに高度な要件にも柔軟に対応できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次