列 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