【VBA入門】Sortでセル範囲内をソートする(並び替える)方法

ソートって使ってますか?

数値の配列データなどを小さい値から大きい値へ順番に昇順に並べ替えたり、逆に降順に並べ替えたりしたい場合もあるかと思います。

この記事では、ソートについて

  • Excelのソート機能とは
  • Sortメソッドの設定一覧
  • Sortオブジェクトの使い方
  • 数値の配列データをソートする方法
  • Dir関数で取得した一覧をソートする方法
  • キーに文字列を指定した辞書をソートする方法

など基本的な内容から、具体的な使い方についても解説していきます。

今回はソートについて、使い方をわかりやすく解説します。

Excelのソート機能とは

ソートとは、数値データなどのデータ群を順番に並べ替えることです。小さい値から大きい値に順番に並べ替えることを昇順といいます。

逆に、大きい値から小さい値に並べ替えること降順といいます。

VBAはExcelのセル範囲の並べ替え機能を利用することができます。Excelの並べ替え機能は数値データ群を並べ替えるのはもちろんのこと、文字列のデータ群も並べ替えることができます。

昇順の場合、アルファベット順、小文字・大文字の順、ふりがなの五十音順などに並べ替えられます。

セル範囲の並び替え機能を利用するにはRangeオブジェクトのSortメソッドを使用する方法と、Excel2007以降であればSortオブジェクトを使用する方法があります。

Sortメソッドの設定一覧

Sortメソッドは引数の指定によって設定を変更することができます。Sortメソッドの設定について表にまとめました

引数定数説明
Key1Rangeオブジェクトでセル範囲を指定
Order1xlAscending昇順の並び替え
xlDescending降順に並び替え
Key22番目に優先するRangeオブジェクトを指定
Order2xlAscending昇順の並び替え
xlDescending降順に並び替え
Key33番目に優先するRangeオブジェクトを指定
Order3xlAscending昇順の並び替え
xlDescending降順に並び替え
HeaderxlGuess先頭をタイトルか自動判定
xlNo先頭をタイトルとみなさない
xlYes先頭をタイトルとみなす
MatchCaseTRUE大文字・小文字を区別する
FALSE大文字・小文字を区別しない
OrientationxlSortRows行(縦方向)の並び替え
xlSortColumn列(横方向)の並び替え
OrderCustomユーザー設定の並べ替え基準
SortMethodxlPinYin日本語をふりがなで並べ替え
xlStroke日本語を文字コードで並べ替え

例えば以下のように引数を指定してソートを実行します。

Range(セル範囲).Sort Key1:=Range(“A1”), Order1:=xlDescending

なおkeyは3つまで指定可能です。

サンプルコードについては「数値の配列データをソートする方法」「Dir関数で取得した一覧をソートする方法」を参照してください。

Sortオブジェクトの使い方

またExcel2007以降ではSortオブジェクトも使えるようになりました。Sortオブジェクトではプロパティでソートの設定を行います。

プロパティ定数説明
HeaderxlGuess先頭をタイトルか自動判定
xlNo先頭をタイトルとみなさない
xlYes先頭をタイトルとみなす
MatchCaseTRUE大文字・小文字を区別する
FALSE大文字・小文字を区別しない
OrientationxlSortRows行(縦方向)の並び替え
xlSortColumn列(横方向)の並び替え
SortMethodxlPinYin日本語をふりがなで並べ替え
xlStroke日本語を文字コードで並べ替え

SortFieldsコレクションのAddメソッドを使ってソートの設定もできるようになっています。

引数定数説明
KeyRangeオブジェクトでセル範囲を指定
SortOnxlSortOnValues値で並べ替え
xlSortOnCellColor背景色で並べ替え
xlSortOnFontColor文字色で並べ替え
xlSortOnIconアイコンで並べ替え
OrderxlAscending昇順
xlDescending降順
CustomOrderユーザー設定の並べ替え基準
DataOptionxlSortNormal数値とテキストを別々に並べ替え
xlSortTextAsNumbersテキストを数値データとして並べ替え

例えば以下のように引数を指定してソートを実行します。

Worksheetオブジェクト名.Sort.SortFields.Clear ‘並べ替えのキー設定を全てクリア
Worksheetオブジェクト名.Sort.SortFields.Add Key:=Range(“A1”), Order:=xlDescending
Worksheetオブジェクト名.Sort.SetRange Range(セル範囲) ‘並べ替えるセル範囲の指定
Worksheetオブジェクト名.Sort.Apply ‘並べ替えを実行

サンプルコードについては「キーに文字列を指定した辞書をソートする方法」を参照してください。

数値の配列データをソートする方法

それでは、数値の配列データをソートする方法についてサンプルコードで確認していきましょう。

このサンプルコードでは、ソートにはRangeオブジェクトのSortメソッドを使用しています。

Sub macro1()
    'Variant型動的配列の宣言
    Dim arr() As Variant
    
    'Array関数を使って初期化
    arr = Array(1, 3, 5, 4, 2)
    
    '配列の要素をシートのセルにセット
    Dim i As Integer
    For i = 1 To UBound(arr) + 1
        Cells(i, 1).Value = arr(i - 1)
    Next i
    
    'RangeオブジェクトのSortメソッドを使用
    Dim myrange As Range
    Set myrange = Range("A1:A" & UBound(arr) + 1)
    myrange.Sort key1:=Range("A1"), Order1:=xlDescending
    
    'Sort後の結果をシートのセルから取得表示
    Dim str As String
    For i = 1 To UBound(arr) + 1
        arr(i - 1) = Cells(i, 1).Value
        str = str & arr(i - 1) & vbCrLf
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
array_sort_sheet
array_sort_info

このサンプルコードではまず、VBAで作成した動的配列arrの要素をExcelシートのセルに入力しています。

次に、RangeオブジェクトのSortメソッドを使用してExcelシート上で降順にソートしています。Excelシートの実行結果を確認するとA列の値が降順にソートされていることがわかります。

Excelシート上のソートの結果を、元のarrの要素に格納して出力表示しています。

Dir関数で取得した一覧をソートする方法

Dir関数を使って特定の文字列や拡張子を含むファイルやサブフォルダの一覧を取得することができます。

Dir関数の使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

VBAでファイル名を取得するには?3+1のパターンで速攻理解!
更新日 : 2019年4月25日

一覧はファイル名やサブフォルダ名の昇順で取得されます。

Dir関数には一覧の順番を並び替える機能はないので、別でSortメソッドやSortオブジェクトを使って並び替える必要があります。

Sortメソッドを使って、降順に並び替えてみましょう。

Sub macro3()
    Dim str1 As String, str2 As String, msg As String
    str1 = "C:\Program Files (x86)\Microsoft Office\*" '「*」ワイルドカードを使用
    
    str2 = Dir(str1, vbDirectory)
    Do While str2 <> "" 'ファイル名、フォルダ名が見つからなくなるまでループ
        If InStr(str2, ".") <> 1 Then '「.」「..」の除外
            msg = msg & str2 & vbCrLf
        End If
        str2 = Dir() '引数なしで次のファイル名、フォルダ名を取得
    Loop
    
    '一覧を配列の要素にセット
    Dim arr() As String
    arr = Split(msg, vbCrLf)
    
    '配列の要素をシートのセルにセット
    Range("A1:A" & UBound(arr) + 1) = WorksheetFunction.Transpose(arr)
    
    'RangeオブジェクトのSortメソッドを使用
    Dim myrange As Range
    Set myrange = Range("A1:A" & UBound(arr) + 1)
    myrange.Sort key1:=Range("A1"), Order1:=xlDescending
    
    'Sort後の結果をシートのセルから取得表示
    msg = msg & vbCrLf & "ソート後" & vbCrLf
    Dim i As Integer
    For i = 1 To UBound(arr) + 1
        arr(i - 1) = Cells(i, 1).Value
        msg = msg & arr(i - 1) & vbCrLf
    Next i
    
    MsgBox "ソート前" & vbCrLf & msg
End Sub

実行結果:
Sort03

このサンプルコードではまず、Dir関数を使ってファイル名とサブフォルダ名の一覧を取得しています。

※そのため、サンプルを動かす場合は「"C:\Program Files (x86)\Microsoft Office\*"」の箇所を各自の環境のものに変更してください。

その一覧をSplit関数を使って各ファイル名、サブフォルダ名を配列arrの要素に格納しています。そして、配列arrの要素をExcelシートのセルと共有しています。

セルに値を入力できたら、それをSortメソッドを使って降順に並び替えています。最後にセルのソートの結果を元の配列arrの要素に格納して出力表示しています。

なお、Split関数の使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】Split関数で文字列を分割(複数条件や正規表現も解説)
更新日 : 2019年4月28日

VBAの配列の要素をExcelシートのセルと共有する方法については、こちらで詳しく解説しています。

ぜひ参考にしてください。

【VBA入門】配列総まとめ(初期化、ループ操作、コピー、結合、比較)
更新日 : 2019年9月26日

キーに文字列を指定した辞書をソートする方法

それでは、キーに文字列を指定した辞書をソートする方法についてサンプルコードで確認していきましょう。

このサンプルコードでは、ソートにはSortオブジェクトを使用しています。

Sub macro2()
    'Dictionaryオブジェクトの宣言
    Dim myDic As Object
    Set myDic = CreateObject("Scripting.Dictionary")
    
    'Dictionaryオブジェクトの初期化、要素の追加
    myDic.Add "orange", 100
    myDic.Add "apple", 200
    myDic.Add "melon", 300
    
    'Dictionaryオブジェクトの要素をシートのセルにセット
    Dim i As Integer
    i = 1
    For Each Var In myDic
        Cells(i, 1).Value = Var
        Cells(i, 2).Value = myDic.Item(Var)
        i = i + 1
    Next Var
    
    'Sortオブジェクトを使用
    With Worksheets("Sheet1").Sort
        With .SortFields
            .Clear
            .Add Key:=Range("A1")
        End With
        
        .SetRange Range("A1:B" & myDic.Count)
        .Apply
    End With
    
    'Sort後の結果をシートのセルから取得表示
    Dim str As String
    Dim Keys() As Variant, Items() As Variant
    Keys = myDic.Keys
    Items = myDic.Items
    For i = 1 To myDic.Count
        Keys(i - 1) = Cells(i, 1).Value
        Items(i - 1) = Cells(i, 2).Value
        str = str & Keys(i - 1) & " : " & Items(i - 1) & vbCrLf
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
dictionary_sort_sheet
dictionary_sort_info

このサンプルコードではまず、VBAで作成したDictionayオブジェクトの要素をExcelシートのセルに入力しています。

次に、Sortオブジェクトを使用してExcelシート上でDictionayオブジェクトのキーをソートしています。Excelシートの実行結果を確認するとA列の文字列がアルファベット順に並び替えられています。

またA列の値でB列もセットでソートされていることがわかります。Excelシート上のソートの結果を、元のDictionayオブジェクトの要素に格納して出力表示しています。

まとめ

ここではソートについて説明しました。VBAではExcelシートのソート機能を利用することができるので便利です。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説