※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|Sort(ソート)をつかったマクロでセルやデータの並べ替えをする

エクセルにはデータを並べ替える(ソート)機能があり、数値の小さいものから順番に並べる昇順。逆に大きいものから並べることを降順と言います。

大量のデータが入力された表において、昇順や降順に並べ替えたいときがあります。
例えば、社員の年齢が若い人から並べる、顧客リストで予約が入った日付順に並べ替える、商品リストの在庫数が多いものから並べるなど、データを並べ替えたい場面は多く考えられます。

セルやデータの並べ替えは、分析やランキングをつくるときも便利なので、エクセルで事務作業やデータ管理をしている人はかならずおぼえておきたい機能だと言えます。

この記事では、エクセルのソート機能とVBAでソートするマクロの作りかたを紹介します。

Sort(ソート)は、セルやデータを並べ替えられるとても便利な機能だよ。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

エクセルで並べ替え(ソート)機能をつかう方法

エクセルの表でデータの並べ替え(ソート)機能をつかうためには、以下の手順で実施します。

昇順・降順ボタンをつかった並べ替え(ソート)方法

  1. エクセルのワークシート画面にて並べ替えたい列のセルを選択します。
  2. [データ]タブを選択します。
  3. [昇順]ボタン・[降順]ボタンを選択します。
エクセルソート方法の画像

こちらで紹介している並べ替え機能の他、表の並べ替え(ソート)や、条件に当てはまったデータの抽出をしたいときは、Excelのフィルター機能も手軽に使えておすすめです。Excelのフィルター機能の使いかたについては、こちらの記事で詳しく解説していますのであわせてチェックしてみてください。

フィルター機能は、Excelで表を管理する人は使わないと損をする。と言えるほど優秀な機能だよ。

並べ替えボタンをつかった並べ替え(ソート)方法

  1. エクセルのワークシート画面にて並べ替えたい列のセルを選択します。
  2. [データ]タブを選択します。
  3. [並べ替え]ボタンを選択します。
  4. 並べ替えウィンドウで[先頭行をデータの見出しとして使用する]に✅する
  5. 並べ替えウィンドウの[]より並べ替え(ソート)をしたい見出しを選択する
  6. 並べ替えウィンドウの[順序]より並べ替え(ソート)をする方法を選択する
  7. 並べ替えウィンドウの[OK]を選択する
エクセルソート方法の画像2
列の値がひらがな・カタカナ、アルファベットのデータも昇順・降順で並べ替えができます。

ユーザー定義の順番に並べ替え(ソート)をする方法

ユーザー定義で登録した順番に並べ替え(ソート)ができます。
例えば、本のジャンルがデータとして入力されたが列があるとして、辞書 ➡ 小説 ➡ ビジネス書 ➡ 雑誌 と並べ替えをしたい場合など、数字や日付のように序列をもたない値も、ユーザー定義をすることで指定どおりに並べ替え(ソート)ができます。

エクセルソート方法の画像3(ユーザー定義の設定方法)

リストの項目で値を書き込む順序で並べ替え(ソート)方法が指定できます。

リストの項目を書き込む方法

自分の好きな順序で並べ替え(ソート)ができるって便利だよね。

並べ替え(ソート)をするキーを追加して条件をかさねて設定する

並べ替えウィンドウで[レベルの追加]を選択すると、並べ替えの条件を重ねて設定できます。

●具体的な例(ユーザー定義と大きい順の組み合わせ)

並べ替えのキー 順序
最優先されるキー 商品カテゴリ 食品,日用品,家電,ファッション,スポーツ用品
次に優先されるキー 販売価格 大きい順
※最優先されるキーは商品カテゴリの”ユーザー定義”を指定、次に優先されるキーで販売価格の”大きい順”を指定。

商品カテゴリごとに販売価格が高いものから順番に並べ替えるよ。

エクセル・ワード・パワーポイントのオンライン学習
料金負担が安いのになんど見ても追加費用は不要!
安心の環境でしっかりとスキルをつけたいならPCHack

↓↓↓くわしくはこちら↓↓↓

エクセルVBAで並べ替え(ソート)機能をつかう方法

ここからは、VBAで並べ替え(ソート)の機能をつかう方法を紹介します。
VBAでは『Sortメソッド』と、『Sortオブジェクト』の2つをつかって並べ替え(ソート)ができます。

Sort(ソート)メソッドをつかった並べ替え

セルの並べ替えをするSortメソッドは、Rangeオブジェクトにて使用可能です。

Sort(ソート)メソッドの構文

Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

Sortメソッドの引数はすべて省略できるから必要なものだけで大丈夫。

Sort(ソート)メソッドの引数について

名前 必須/省略可 設定値 説明
Key1 省略可 バリアント 最優先されるキーをRangeによるセル範囲で指定します。
Order1 省略可 xlAscending
or
xlDescending
or
xlManual
Key1の並べ替え方法を指定します。昇順・降順・手動の何れかで指定します。
Key2 省略可 バリアント 2番目に優先されるキーをRangeによるセル範囲を指定します。
Type 省略可 バリアント ピボットテーブル内で並べ替える要素の種類を指定します。
Order2 省略可 xlAscending
or
xlDescending
or
xlManual
Key2の並べ替え方法を指定します。昇順・降順・手動の何れかで指定します。
Key3 省略可 バリアント 3番目に優先されるキーをRangeによるセル範囲を指定します。
Order3 省略可 xlAscending
or
xlDescending
or
xlManual
Key3の並べ替え方法を指定します。昇順・降順・手動の何れかで指定します。
Header 省略可 xlGuesss
or
xlNo
or
xlYes
表の見出しの設定を指定します。Excelに判断させる・見出しなし・見出しありの何れかで指定します。
OrderCustom 省略可 バリアント ユーザー設定の並べ替え順のリスト内の番号を指定します。
MatchCase 省略可 バリアント 大文字と小文字を区別するならTrueを、しないならFalseを指定します。
Orientation 省略可 xlSortColumns
or
xlSortRows
並べ替えを対象を、列または行で指定します。
SortMethod 省略可 xlPinYin
or
xlStroke
並べ替えの方法を指定します。
中国語の発音表記の順または、各文字の総画数を指定します。
DataOption1 省略可 xlSortNormal
or
xlSortTextAsNumbers
Key1を数値と文字列を区別して並べ替えをする、または文字列も数値として並べ替えるのか設定します。
DataOption2 省略可 xlSortNormal
or
xlSortTextAsNumbers
Key2を数値と文字列を区別して並べ替えをする、または文字列も数値として並べ替えるのか設定します。
DataOption3 省略可 xlSortNormal
or
xlSortTextAsNumbers
Key3を数値と文字列を区別して並べ替えをする、または文字列も数値として並べ替えるのか設定します。
※赤文字になっている項目は初期値となります。

引数は多いけど、おぼえなくて大丈夫。使うときにまた見にきてね♡

Sortメソッドは、条件として設定できるKeyは3つまでです。より詳細な条件で並べ替え(Sort)を実行したい場合は、後述のSortオブジェクトをご利用ください。

Sort(ソート)メソッドをつかったサンプルコード

こちらの表で、VBAのサンプルコードをつかって並べ替え(ソート)してみます。

セルの並べ替え(Sort)を実施するサンプルデータの画像
並べ替え(ソート)をするVBAコード
Sub Sort_test()
    With ThisWorkbook.Worksheets("Sort_test")
        .Range("A1:H11").Sort key1:=Range("A1"), Order1:=xlDescending, Header:=xlYes
    End With
End Sub

A列(商品ID)を、降順で並べ替えるよ。

表全体をRangeオブジェクトで範囲として、並べ替え(ソート)を実施します。
並べ替え(ソート)の条件は、.Sortのあとの部分で『A列(商品ID)で降順とし、見出しは並べ替えない』といった条件を指定しています。

実行結果は以下のとおりです。

VBAでExcelの表を並べ替えた結果の画像

商品IDの大きいものから順に並べ替えたよ。

Sort(ソート)オブジェクトをつかった並べ替え

Sortメソッドだけでなく、Sortオブジェクトを使ってセルやデータを並べ替えることもできます。
Excel2007以前をつかっている場合は、Sortオブジェクトが使えませんので、Sortメソッドで並べ替えを利用してください。

Sort(ソート)オブジェクトとは

Sortオブジェクトはデータをビルドして並べ替え(ソート)ができます。
Sortオブジェクトにはメソッドプロパティがあり、これらを設定することでデータの並べ替えが実行できます。なお、Sortオブジェクトは並べ替えの条件となるKeyが64個まで指定が可能です。

Sortオブジェクトは、Sortメソッドが進化したものだと言えるね。

Sort(ソート)オブジェクトのメソッド

Sortオブジェクトのメソッドは以下の2つです。

メソッドの種類 説明
Apply 並べ替えを実行します。
SetRange 並べ替えをする範囲を指定します。

Sortオブジェクトのメソッドは”範囲の指定”と”実行”だね。

Sort(ソート)オブジェクトのプロパティ

プロパティの以下のとおり、設定値などはSortメソッドのときと同じです。
Application、Creatorプロパティなども存在しますが、使用する場面があまりないため割愛しています。

プロパティの種類 設定値 説明
Header xlGuesss
or
xlNo
or
xlYes
先頭行に見出しがあるかを指定します。
MatchCase True
or
False
大文字と小文字を区別するかを指定します。
Orientation xlSortColumns
or
xlSortRows
並べ替えを対象を、列または行で指定します。
SortFields Addメソッドで並べ替えのキー、フィールド、順序などを指定(※詳細は後述) SortFieldオブジェクトのコレクション
SortMethod xlPinYin
or
xlStroke
並べ替えの方法を指定します。中国語の発音表記の順または、各文字の総画数を指定します。
※最優先されるキーは商品カテゴリの”ユーザー定義”を指定、次に優先されるキーで販売価格の”大きい順”を指定。

SortFieldsオブジェクトのAddメソッド

SortFieldsオブジェクトのAddメソッドで並べ替えのキーの追加や、順序をパラメーターで指定します。

パラメーターの種類 必須/省略可 設定値 説明
Key 必須 セル範囲 キーをRangeによるセル範囲で指定します。
SortOn 省略可 xlSortOnCellColor
or
xlSortOnFontColor
or
xlSortOnIcon
or
xlSortOnValues
並べ替えの基準とする対象を指定します。
上からセル色、フォント色、アイコン、記入された値です。
Order 省略可 xlAscending
or
xlDescending
順序を指定します。上から昇順、降順です。
CustomOrder 省略可 任意の順序を記入 ユーザー定義を指定します。
DataOption 省略可 xlSortNormal
or
xlSortTextAsNumbers
数値と文字列を区別して並べ替えをする、または文字列も数値として並べ替えるのか設定します。

SortFieldsオブジェクトのAddメソッドで並べ替えの条件を指定するんだね。

Sortオブジェクトをつかったサンプルコード

Sortオブジェクトをつかって商品IDを降順にするマクロ

Sub Sort_test2()
    'Withステートメントで並べ替えを実行するシートオブジェクトを指定する
    With ThisWorkbook.Worksheets("Sort_test").Sort
        '並べ替え(ソート)のキー設定を初期化する
        .SortFields.Clear
        
        '並べ替え(ソート)のキー設定(最優先されるキー)
        .SortFields.Add key:=Range("A1"), _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending
        
        '並べ替え(ソート)をする範囲を指定
        .SetRange Range("A1:H11")
        
        '並べ替え(ソート)をする範囲に見出しがある場合の指定
        .Header = xlYes
        
        '並べ替え(ソート)を実行する
        .Apply
    
    End With
End Sub

Sortメソッドと同じで、商品IDを降順に並べ替えるマクロだよ。

Sortオブジェクトをつかって商品カテゴリを指定の順に並べ替えるマクロ

Sub Sort_test3()
    'Withステートメントで並べ替えを実行するシートオブジェクトを指定する
    With ThisWorkbook.Worksheets("Sort_test").Sort
        '並べ替え(ソート)のキー設定を初期化する
        .SortFields.Clear
        
        '並べ替え(ソート)のキー設定(最優先されるキー)
        .SortFields.Add key:=Range("B1"), _
            SortOn:=xlSortOnValues, _
            CustomOrder:="食品,日用品,家電,ファッション,スポーツ用品"
        
        '並べ替え(ソート)をする範囲を指定
        .SetRange Range("A1:H11")
        
        '並べ替え(ソート)をする範囲に見出しがある場合の指定
        .Header = xlYes
        
        '並べ替え(ソート)を実行する
        .Apply
    
    End With
End Sub

サンプルコード(Sort_test2)からの変更点は、SortFields.AddのパラメーターであるKeyを商品カテゴリ(B列)に変更と、B列の並べ替え順序をCustomOrderで指定しているところです。

Sortオブジェクトで商品カテゴリを指定の順に並べ替えるマクロだよ。

マクロの実行結果(Sort_test3)

VBAでExcelの表を並べ替えた結果の画像2

商品カテゴリを”食品”、”日用品”、”家電”、”ファッション”、”スポーツ用品”の順で並べ替えたよ。

商品カテゴリが指定順で、発売日があたらしい順番に並べ替えるマクロ

サンプルコード(Sort_test3)に、発売日を降順で並べ替え(Sort)する条件を追加してみます。

Sub Sort_test4()
    'Withステートメントで並べ替えを実行するシートオブジェクトを指定する
    With ThisWorkbook.Worksheets("Sort_test").Sort
        '並べ替え(ソート)のキー設定を初期化する
        .SortFields.Clear
        
        '並べ替え(ソート)のキー設定(最優先されるキー)
        .SortFields.Add key:=Range("B1"), _
            SortOn:=xlSortOnValues, _
            CustomOrder:="食品,日用品,家電,ファッション,スポーツ用品"
        
        '並べ替え(ソート)のキー設定(次に優先されるキー)
        .SortFields.Add key:=Range("G1"), _
            SortOn:=xlSortOnValues, _
            Order:=xlDescending
        
        
        '並べ替え(ソート)をする範囲を指定
        .SetRange Range("A1:H11")
        
        '並べ替え(ソート)をする範囲に見出しがある場合の指定
        .Header = xlYes
        
        '並べ替え(ソート)を実行する
        .Apply
    
    End With
End Sub

サンプルコード(Sort_test3)に、新たにSortFields.Addメソッドで発売日(G列)の条件を追記しました。

マクロの実行結果(Sort_test4)

VBAでExcelの表を並べ替えた結果の画像3

発売日があたらしいものからの順番に並べ替えたよ。

配列や辞書の要素を並べ替え(ソート)する

配列や辞書(Dictionaryオブジェクト)の要素の並べ替え(ソート)をするマクロを紹介します。

配列内のデータを並べ替える(ソート)方法ですが、配列や辞書内の要素を、直接並べ替える(ソート)する方法と、一度セルに出力したデータを並べ替え(ソート)をする方法の2つがあります。

ここでは、比較的にマクロをつくることが簡単な、『セルに出力する方法』をつかって、配列と辞書の要素の並べ替え(ソート)をするサンプルコードを紹介します。

セルに出力して並べ替え(ソート)をするマクロの大まかな流れ
  1. 配列・辞書データをつくる
  2. 配列や辞書データをExcelのワークシートに書き出す
  3. Sortオブジェクトでワークシートに書き出したデータを並べ替え(ソート)をする
  4. 並べ替え(ソート)した表を、配列や辞書に代入する

配列や辞書もセルに出力して並べ替えるマクロなら比較的かんたんに作れるよ。

配列に代入したデータをデータをSortオブジェクトで並べ替える

配列に代入されている要素(データ)を並べ替える(ソート)処理をします。

Sub Sort_test5()
'配列の宣言
Dim arr(4, 1) As Variant

'配列1列目の要素を代入
arr(0, 0) = "いちご"
arr(1, 0) = "ランニングシューズ"
arr(2, 0) = "ボディソープ"
arr(3, 0) = "ジーンズ"
arr(4, 0) = "テレビ"

'配列2列目の要素を代入
arr(0, 1) = 150
arr(1, 1) = 12000
arr(2, 1) = 350
arr(3, 1) = 5000
arr(4, 1) = 70000

'======================
'辞書(Dic)をワークシートに転記する
'======================
'繰り返し処理用(カウンタ)の変数を宣言する
Dim i As Integer

With ThisWorkbook.Worksheets("Sort_test2")
'arrの要素数分(5回)を繰り返す。
    For i = 0 To UBound(arr)
        .Cells(i + 2, 1).Value = arr(i, 0)
        .Cells(i + 2, 2).Value = arr(i, 1)
    Next i
    
'======================
'並べ替え(Sort)の処理
'======================
    With .Sort
        '並べ替え(Sort)を条件を初期化
        .SortFields.Clear
        
        '2列目(販売価格)が高いものから並べ替え
        .SortFields.Add key:=Range("B1"), _
            Order:=xlDescending
            
        .Header = xlYes
    '配列の最大インデックスとセル範囲の差分のため+2をする
        .SetRange Range("A1:B" & UBound(arr) + 2) 
        .Apply
    End With
    
'======================
'並べ替えた後の表を配列(arr)に代入する
'======================
    For i = 2 To .Cells(Rows.count, 1).End(xlUp).row
        arr(i - 2, 0) = .Cells(i, 1).Value
        arr(i - 2, 1) = .Cells(i, 2).Value
    Next i
    
End With


End Sub

サンプルコード(Sort_test5)で冒頭につくった配列(arr)の要素を、すべてExcelのワークシートに貼り付けています。貼り付けた配列データをSortオブジェクトを使って並べ替えた後、再度配列(arr)に代入すれば、配列データの並べ替えができます。

配列が使えるとセル範囲とのデータのやり取りが簡単に行える。配列の使いかたについて詳しく知りたい人はこちらの記事がおすすめです。

マクロの実行結果(Sort_test5)

VBAでExcelの表を並べ替えた結果の画像3

サンプル配列には、見出しはないので、あくまで並べ替えの前と後のイメージだよ

辞書(Dictionaryオブジェクト)に代入したデータをSortオブジェクトで並べ替える

辞書(Dictionaryオブジェクト)に代入されているデータを並べ替える(ソート)処理をします。

Sub Sort_test6()
'辞書(Dictionaryオブジェクト)の宣言
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")

'並べ替え(ソート)後のデータを代入用にもDictionaryオブジェクトを宣言
Dim after_Dic As Object
Set after_Dic = CreateObject("Scripting.Dictionary")

'以下の5つのキーとアイテムを並べ替え前の辞書(Dic)に代入する。
Dic.Add "いちご", 150
Dic.Add "ランニングシューズ", 12000
Dic.Add "ボディソープ", 350
Dic.Add "ジーンズ", 5000
Dic.Add "テレビ", 70000

'======================
'辞書(Dic)をワークシートに転記する
'======================

'貼り付ける行を指定するための変数
Dim row As Integer

'繰り返し処理(For Each文)用の変数
Dim key As Variant

'見出しがあるので行の変数rowに"2"を指定
row = 2

With ThisWorkbook.Worksheets("Sort_test2")
'Dicの要素分(5回)を繰り返す。
    For Each key In Dic
        .Cells(row, 1).Value = key
        .Cells(row, 2).Value = Dic.item(key)
        row = row + 1
    Next key

'======================
'並べ替え(Sort)の処理
'======================

    With .Sort
        '並べ替え(ソート)を条件を初期化
        .SortFields.Clear
        
        'B列(販売価格)が高いものから並べ替え
        .SortFields.Add key:=Range("B1"), _
            Order:=xlDescending
            
        .Header = xlYes
        .SetRange Range("A1:B" & Dic.count + 1) 'Dic要素数(5)とセル範囲の差分のため+1をする
        .Apply
    End With

'======================
'並べ替えた後の表を辞書(after_Dic)に代入する
'======================

For row = 0 To Dic.count - 1
    after_Dic.Add .Cells(row + 2, 1).Value, .Cells(row + 2, 2).Value
Next row

End With

End Sub

サンプルコード(Sort_test6)では、辞書(Dic)に代入したキーとアイテムをワークシートに転記してから、並べ替え(ソート)をしています。並べ替えが完了したものを、辞書(after_Dic)に代入することで実現しています。

VLookup関数よりも高度で便利な、辞書(Dictionaryオブジェクト)についてもっと詳しく知りたい人はこちらの記事がおすすめです。

マクロの実行結果(Sort_test6)

VBAでExcelの表を並べ替えた結果の画像3

実行結果は配列のときと同じだよ。

ExcelVBAで並べ替え(ソート)まとめ

  • Excelのデータやセルを並べ替え(ソート)をする方法
    1. Excelの並べ替え機能をつかう
    2. ExcelVBAでSortメソッドや、Sortオブジェクトをつかったマクロで実行する
  • SortオブジェクトはExcel2007以前では使用できない
  • Sortメソッドはキーの指定は3個まで。Sortオブジェクトは64個まで指定ができる
  • 配列や辞書の要素の並べ替え(ソート)をするとき、一度セルに出力すれば比較的カンタンにできる

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました