Sub SortByLeadingNumber()
Dim targetRange As Range ' 全体のデータ範囲
Dim cellItem As Range ' ループ用セル
Dim ws As Worksheet ' 対象シート
Set ws = ActiveSheet
Set targetRange = ws.Range("A2").CurrentRegion ' 見出し行を含む表全体
'--- 補助列ヘッダーを設定(列 B に配置)---
ws.Range("B1").Value = "SortKey"
'--- 先頭の数値を取得して補助列へ書き込み ---
For Each cellItem In targetRange.Columns(1).Cells
' CurrentRegion の 1 行目は見出し行のためスキップ
If cellItem.Row > targetRange.Row Then
cellItem.Offset(0, 1).Value = _
Val(StrConv(cellItem.Value, vbNarrow)) ' 全角→半角後に Val で数値抽出
End If
Next cellItem
'--- 補助列(列 B)を基準に昇順ソート ---
With targetRange
.Sort Key1:=.Columns(2), _
Order1:=xlAscending, _
Header:=xlYes
End With
End Sub
コードのポイント
行
説明
11
CurrentRegion で見出し行を含むまとまりを自動選択しています。
16
SortKey という列見出しを列 B に追加しています。
20
StrConv で全角数字を半角化し、Val 関数で先頭の連続数字のみを取得しています。
26
補助列(2 列目)をキーに昇順ソートを実行しています。
応用例
目的
実装のヒント
数値が存在しないセルを後ろへまとめたい
If IsNumeric(Val(StrConv(cellItem.Value, vbNarrow))) Then … Else cellItem.Offset(0, 1).Value = 999999 のように大きい値を代入します。
降順ソートに切り替えたい
Order1:=xlDescending に変更します。
補助列を非表示にしたい
ソート完了後に ws.Columns(2).Hidden = True を追加します。
よくある質問
質問
回答
補助列を作らずに直接ソートできますか。
VBA 単独では難しいため、補助列を用意する方法が最も簡潔で再現性も高いです。
データがテーブル(ListObject)形式の場合でも使えますか。
ListObject.DataBodyRange を Set targetRange に指定すれば同じ手順でソート可能です。