ソートって使ってますか?
数値の配列データなどを小さい値から大きい値へ順番に昇順に並べ替えたり、逆に降順に並べ替えたりしたい場合もあるかと思います。
この記事では、ソートについて
- Excelのソート機能とは
- Sortメソッドの設定一覧
- Sortオブジェクトの使い方
- 数値の配列データをソートする方法
- Dir関数で取得した一覧をソートする方法
- キーに文字列を指定した辞書をソートする方法
など基本的な内容から、具体的な使い方についても解説していきます。
今回はソートについて、使い方をわかりやすく解説します。
Excelのソート機能とは
ソートとは、数値データなどのデータ群を順番に並べ替えることです。小さい値から大きい値に順番に並べ替えることを昇順といいます。
逆に、大きい値から小さい値に並べ替えることを降順といいます。
VBAはExcelのセル範囲の並べ替え機能を利用することができます。Excelの並べ替え機能は数値データ群を並べ替えるのはもちろんのこと、文字列のデータ群も並べ替えることができます。
昇順の場合、アルファベット順、小文字・大文字の順、ふりがなの五十音順などに並べ替えられます。
セル範囲の並び替え機能を利用するにはRangeオブジェクトのSortメソッドを使用する方法と、Excel2007以降であればSortオブジェクトを使用する方法があります。
Sortメソッドの設定一覧
Sortメソッドは引数の指定によって設定を変更することができます。Sortメソッドの設定について表にまとめました
引数 | 定数 | 説明 |
---|---|---|
Key1 | ー | Rangeオブジェクトでセル範囲を指定 |
Order1 | xlAscending | 昇順の並び替え |
xlDescending | 降順に並び替え | |
Key2 | ー | 2番目に優先するRangeオブジェクトを指定 |
Order2 | xlAscending | 昇順の並び替え |
xlDescending | 降順に並び替え | |
Key3 | ー | 3番目に優先するRangeオブジェクトを指定 |
Order3 | xlAscending | 昇順の並び替え |
xlDescending | 降順に並び替え | |
Header | xlGuess | 先頭をタイトルか自動判定 |
xlNo | 先頭をタイトルとみなさない | |
xlYes | 先頭をタイトルとみなす | |
MatchCase | TRUE | 大文字・小文字を区別する |
FALSE | 大文字・小文字を区別しない | |
Orientation | xlSortRows | 行(縦方向)の並び替え |
xlSortColumn | 列(横方向)の並び替え | |
OrderCustom | ー | ユーザー設定の並べ替え基準 |
SortMethod | xlPinYin | 日本語をふりがなで並べ替え |
xlStroke | 日本語を文字コードで並べ替え |
例えば以下のように引数を指定してソートを実行します。
Range(セル範囲).Sort Key1:=Range(“A1”), Order1:=xlDescending
なおkeyは3つまで指定可能です。
サンプルコードについては「数値の配列データをソートする方法」「Dir関数で取得した一覧をソートする方法」を参照してください。
Sortオブジェクトの使い方
またExcel2007以降ではSortオブジェクトも使えるようになりました。Sortオブジェクトではプロパティでソートの設定を行います。
プロパティ | 定数 | 説明 |
---|---|---|
Header | xlGuess | 先頭をタイトルか自動判定 |
xlNo | 先頭をタイトルとみなさない | |
xlYes | 先頭をタイトルとみなす | |
MatchCase | TRUE | 大文字・小文字を区別する |
FALSE | 大文字・小文字を区別しない | |
Orientation | xlSortRows | 行(縦方向)の並び替え |
xlSortColumn | 列(横方向)の並び替え | |
SortMethod | xlPinYin | 日本語をふりがなで並べ替え |
xlStroke | 日本語を文字コードで並べ替え |
SortFieldsコレクションのAddメソッドを使ってソートの設定もできるようになっています。
引数 | 定数 | 説明 |
---|---|---|
Key | ー | Rangeオブジェクトでセル範囲を指定 |
SortOn | xlSortOnValues | 値で並べ替え |
xlSortOnCellColor | 背景色で並べ替え | |
xlSortOnFontColor | 文字色で並べ替え | |
xlSortOnIcon | アイコンで並べ替え | |
Order | xlAscending | 昇順 |
xlDescending | 降順 | |
CustomOrder | ー | ユーザー設定の並べ替え基準 |
DataOption | xlSortNormal | 数値とテキストを別々に並べ替え |
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
実行結果:
このサンプルコードではまず、VBAで作成した動的配列arrの要素をExcelシートのセルに入力しています。
次に、RangeオブジェクトのSortメソッドを使用してExcelシート上で降順にソートしています。Excelシートの実行結果を確認するとA列の値が降順にソートされていることがわかります。
Excelシート上のソートの結果を、元のarrの要素に格納して出力表示しています。
Dir関数で取得した一覧をソートする方法
Dir関数を使って特定の文字列や拡張子を含むファイルやサブフォルダの一覧を取得することができます。
Dir関数の使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。
一覧はファイル名やサブフォルダ名の昇順で取得されます。
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
実行結果:
このサンプルコードではまず、Dir関数を使ってファイル名とサブフォルダ名の一覧を取得しています。
※そのため、サンプルを動かす場合は「”C:Program Files (x86)Microsoft Office*”」の箇所を各自の環境のものに変更してください。
その一覧をSplit関数を使って各ファイル名、サブフォルダ名を配列arrの要素に格納しています。そして、配列arrの要素をExcelシートのセルと共有しています。
セルに値を入力できたら、それをSortメソッドを使って降順に並び替えています。最後にセルのソートの結果を元の配列arrの要素に格納して出力表示しています。
なお、Split関数の使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。
VBAの配列の要素をExcelシートのセルと共有する方法については、こちらで詳しく解説しています。
ぜひ参考にしてください。
キーに文字列を指定した辞書をソートする方法
それでは、キーに文字列を指定した辞書をソートする方法についてサンプルコードで確認していきましょう。
このサンプルコードでは、ソートには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
実行結果:
このサンプルコードではまず、VBAで作成したDictionayオブジェクトの要素をExcelシートのセルに入力しています。
次に、Sortオブジェクトを使用してExcelシート上でDictionayオブジェクトのキーをソートしています。Excelシートの実行結果を確認するとA列の文字列がアルファベット順に並び替えられています。
またA列の値でB列もセットでソートされていることがわかります。Excelシート上のソートの結果を、元のDictionayオブジェクトの要素に格納して出力表示しています。
まとめ
ここではソートについて説明しました。VBAではExcelシートのソート機能を利用することができるので便利です。
使いこなすことができるように、この記事を何度も参考にして下さいね!