概要

 Excelで作ったデータベースについて、主に並び替えに関するVBAコードを挙げていきます。
 ExcelのVBAにて表を並び替える場合、大きくは3つのパターンがあるかと思います。

  • 昇順や降順で並び替えたい
  • 任意の順番で並び替えたい(順番はコードに直接打ち込む)
  • 任意の順番で並び替えたい(別のシートに作った表に準じるようにする)

 いずれの方法についても見ていきます。

Excel VBA データベース変換に関するコード

昇順や降順で並び替える

Range("A1").Sort key1:=Range("B1") _
                    , order1:=xlAscending _
                    , Header:=xlYes

 上記はB1の列を基準に昇順で並び替えます。
 降順の場合は「xlDescending」を使います。

任意の順で並び替える

ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range("B2:B100") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "①,②,③,④," _
    , DataOption:=xlSortNormal
With ActiveSheet.Sort
    .SetRange Range("A1:B100")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

 データベースを任意の順で並び替えます。
 上記では例として、A1からB100の範囲にあるデータを並び替えます。
 一行目がタイトル行であり、二行目以降からデータがある形です。
 B列のデータを基準とし、「①、②、③、④」という任意の順で並び替えるようにしています。この①~④の文字列は任意であり、書き換えることで任意の並び替えを行うことができます。
 また当然データ範囲が異なる場合は基準となる列およびデータの範囲を書き換えます。

 「Header」は先頭行をタイトルとするか否かであり、「xlYes」はタイトル行とします。
 「MatchCase」は大文字と小文字の区別をするか否かであり、「False」は区別しません。
 「Orientation」は並び替えの方向を指定します。「xlTopToBottom」は行の並び替えを意味します。
 「SortMethod」はふりがなを使うか否かを指定します。「xlPinYin」はふりがなを使います。ちなみに使わない場合は「xlStroke」になります。
 これらは省略することもできます。

 あるいはさらにシンプルにする場合は下記のような方法もあります。

With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=Range("B1"), CustomOrder:="①,②,③,④"
        .SetRange Range("B1").CurrentRegion
        .Header = xlYes
        .Apply
    End With

 これもB列を基準に①、②、③、④の順でデータを並び替えます。

 これらはいずれもアクティブシートでの動作を前提としています。

 また、VBAに限らずデータの並び替え全般に言えることですが、任意の順で並び替える場合は原型の表の並びに戻せるようあらかじめ通し番号を振っておくことをおすすめします。

表を参照し任意の順に並び替える

    Dim ac As Worksheet
    Set ac = ActiveSheet
    
    Dim jun As Worksheet
    Set jun = Sheets("設定")
    
    Dim narabi() As String
    Dim i As Integer
    ReDim narabi(10)
    For i = 0 To 10
    narabi(i) = jun.Cells(i + 2, 1)
    Next i
    
    With ac.Sort
    .SortFields.Clear
    .SortFields.Add Key:=Cells(1, 1), Order:=xlAscending, CustomOrder:=Join(narabi, ",")
    .SetRange Range("A1").CurrentRegion
    .Header = xlYes
    .Apply
    End With

 別のシートに並び順を記載した表を作り、それに準じでデータベース(表)を並び替える方法です。

 「設定」という名のシートを便宜的に作成し、そこにA1をタイトル行、以下に並び順を列挙したリストを作っておきます。
 この「設定」シートを参照し、アクティブシートの表を並び替えます。
 上記の例では、アクティブシートのA列を基準に「設定」シートの並びに準じて並び替えます。

 並び順をエディターではなくシートに記載できるので、メンテナンス性や拡張性がシチュエーションによっては向上するかと思います。