Excel VBA で一時的に並べ替え、元の行順へ復元する方法【ヘルパーカラム活用】

目次

概要

一度ソートしたデータを元の並び順に戻したい場合、行番号を格納する補助列(ヘルパーカラム) を追加しておくと確実に復元できます。本記事では、VBA を用いて 1) ヘルパーカラムの自動生成 2) 任意のソート 3) 元の順番へのリストア を一括で行うマクロをご紹介いたします。


前提条件

項目内容
対応 ExcelMicrosoft 365 または 2016 以降
データ範囲見出し行を含む表(CurrentRegion で取得可能)
マクロ設置先標準モジュール

サンプルコード

Sub TempSortAndRestore()

    Dim tbl As Range              ' 表全体
    Dim ws  As Worksheet          ' 対象シート
    Dim idxCol As Range           ' 行番号を格納する列
    
    Set ws  = ActiveSheet
    Set tbl = ws.Range("C5").CurrentRegion   ' 見出し行を含む範囲を取得
    
    '--- 1. ヘルパーカラムを追加(表の右隣に作成)---
    Set idxCol = tbl.Columns(tbl.Columns.Count).Offset(0, 1)
    idxCol.Cells(1).Value = "RowID"          ' 見出し
    idxCol.Cells(2).Value = 1               ' 行番号の開始値
    idxCol.Cells(2).DataSeries _            ' 連番を自動入力
        Rowcol:=xlColumns, _
        Type:=xlLinear, _
        Step:=1
    
    '--- 2. 任意の列でソート(例:表内 3 列目を昇順)---
    With tbl
        .Sort Key1:=.Columns(3), Order1:=xlAscending, Header:=xlYes
    End With
    
    ' (ここで必要な編集や確認を行う)
    
    '--- 3. ヘルパーカラムをキーに元の順番へ復元 ---
    With tbl.Resize(ColumnSize:=tbl.Columns.Count + 1)   ' 追加列を含めた範囲
        .Sort Key1:=.Columns(.Columns.Count), Order1:=xlAscending, Header:=xlYes
    End With
    
    '--- 4. ヘルパーカラムを削除して完了 ---
    idxCol.EntireColumn.Delete

End Sub

コード解説

説明
8Range("C5").CurrentRegion で表全体を自動取得しています。開始セルは業務に合わせて変更可能です。
13–17DataSeries を利用し、見出し行を除いたすべての行に連番を振っています。
20–22.Sort で任意列を基準とした一時的な並べ替えを実行しています。
28–30ヘルパーカラムを含む範囲を再度ソートし、連番順(= 元の行順)に復元しています。
33処理後に補助列を削除し、表を元の列構成へ戻しています。

応用例

目的実装のヒント
復元用の列を残しておきたいidxCol.EntireColumn.Delete を削除し、列を非表示 (Hidden = True) にします。
ソート時に降順を指定したいOrder1:=xlDescending へ変更します。
行挿入や削除に備えてより厳密に復元したい行番号と一緒にタイムスタンプを格納し、複合キーで復元すると安全性が高まります。

よくある質問

質問回答
テーブル(ListObject)でも使用できますか。ListObject.DataBodyRangetbl に設定すれば同じロジックで機能いたします。
ヘルパーカラムを最初の列に追加する方法は。Offset(0, -1) で左側へ列を挿入し、Resize の列数計算を調整してください。

まとめ

行番号を補助列に保持しておくことで、一時的な並べ替え後でも確実に元の行順へ戻せます。まずはサンプルコードを実行し、並べ替えと復元が正しく行われることをご確認ください。列位置やソート条件を調整することで、多様なデータセットに対応できます。

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

この記事を書いた人

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

目次