Excel VBA で行頭の数字を基準にデータを並べ替える方法【数値プレフィックス対応】

目次

概要

セルの先頭に含まれる数字を抽出し、その数値順に並べ替えたい場合は、補助列(ヘルパーカラム)を用意して数値だけを取り出し、ソートキーとして利用する方法が効率的です。本記事では、VBA を使って

  1. 全角数字を半角に変換
  2. 先頭の数字を取得
  3. 補助列で昇順ソート
    を一括実行するサンプルコードをご紹介いたします。

前提条件

項目内容
対応 ExcelMicrosoft 365 または 2016 以降
データ範囲列 A に「数値+文字列」のデータが A2:A31 に入っている想定
マクロ設置先標準モジュール

サンプルコード

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

コードのポイント

説明
11CurrentRegion で見出し行を含むまとまりを自動選択しています。
16SortKey という列見出しを列 B に追加しています。
20StrConv で全角数字を半角化し、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.DataBodyRangeSet targetRange に指定すれば同じ手順でソート可能です。

まとめ

先頭の数値を基準に並べ替える際は、補助列に数値だけを抽出してソートキーとする方法が確実です。上記のサンプルを実行し、意図どおりに並び替えが行われることをご確認ください。列位置や範囲を調整することで、さまざまなデータセットに応用いただけます。

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

この記事を書いた人

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

目次