皆さんは、Exelで作業をする際にソート機能を活用していますか?
セルに格納されたデータを数値の小さい順から大きい順に並べ替えたり、あるいは割り振ったIDや名前によって並べ替えたりと、ソートが必要になる場面も多いかと思います。
今回は、
- ソート機能とは?
- Sortメソッドの使い方
- Sortオブジェクトの使い方
など、Excel VBAのソート機能の基本的な内容から応用方法まで詳しく解説していきます!
Excelのソート機能とは?VBAではどうやって使う?
ソートとは、一定の法則に従ってデータを順番に並べ替えることです。
数値であれば小さい値から大きい値へと順に並べたり、文字列であればアルファベット順や五十音順にデータを並べ直すといった具合です。Excelには、あらかじめ条件を指定することで、この並べ替えを自動的に行ってくれる機能が存在します。
VBAでソート機能を実装する場合は、RangeオブジェクトのSortメソッドを使用する方法と、Excel2007以降であればSortオブジェクトを使用する方法の2種類があります。
Sortメソッドで並べ替え条件を設定する
まずは、Sortメソッドの使い方について解説をしていきます。
メソッドの基本的な構文は以下の通りです。
【基本構文】
Range("セル範囲").Sort Key1:=Range("キー"), Order1:=並べ替え順
Key1には、並べ替えの基準となる列や行のセルを指定します。
Order1では、並べ替えの順序を指定します。「xlAscending」が昇順、「xlDescending」が降順の指定になります。
サンプルとして、以下の表をSortメソッドで並べ替えてみましょう。
今回は、商品の値段を基準に昇順で並べ替えを行います。
【サンプルコード】
Sub sampleSort()
Range("B3:C9").Sort Key1:=Range("C3"), Order1:=xlAscending
End Sub
【実行結果】
Sortメソッドの設定項目
Sortメソッドには、先ほど説明したもの以外にも様々な引数が存在します。
以下に一覧をまとめました。
引数 | 説明 |
---|---|
Key1 | 1番目に優先する並べ替え基準のセル範囲 |
Order1 | Key1の並べ替え順序を昇順か降順かで指定 |
Key2 | 2番目に優先する並べ替え基準のセル範囲 |
Order2 | Key2の並べ替え順序を昇順か降順かで指定 |
Key3 | 3番目に優先する検索基準のセル範囲 |
Order3 | Key3の並べ替え順序を昇順か降順かで指定 |
Header |
指定範囲の最初の行にヘッダーが含まれているか否かを指定
|
OrderCustom | ユーザー設定の並べ替え順を指定 |
MatchCase | 大文字と小文字を区別するか否かを指定 Trueは区別する。Falseは区別しない。 |
Orientation | 行で並べ替えるか、または列で並べ替えるかを指定 xlSortRowsは行単位、xlSortColumnsは列単位で並び替え |
SortMethod | 日本語をふりがな順で並び替えるか、または文字コード順で並び替えるかを指定 xlPinYinはひらがな順、xlStrokeは文字コード順で並べ替え |
各引数は省略可能ですが、前回に並べ替えを行なった際の設定(ワークシートで手作業で行なった分も含む)が引き継がれるものもあるため、都度指定をする方が安全に運用できます。
Sortオブジェクトの使い方
Excel2007以降では、Sortオブジェクトの使用が可能になりました。
以下のプロパティを使って、ソートの設定を行います。
プロパティ | 説明 |
---|---|
Header |
指定範囲の最初の行にヘッダーが含まれているか否かを指定
|
MatchCase | 大文字と小文字を区別するか否かを指定 Trueは区別する。Falseは区別しない。 |
Orientation | 行で並べ替えるか、または列で並べ替えるかを指定 xlSortRowsは行単位、xlSortColumnsは列単位で並び替え |
SortMethod | 日本語をふりがな順で並び替えるか、または文字コード順で並び替えるかを指定 xlPinYinはひらがな順、xlStrokeは文字コード順で並べ替え |
また、プロパティの1つであるSortFieldsコレクションのAddメソッドを使って、キーや並べ替え条件の指定を行うことができます。
【基本構文】
ワークシート名.Sort.SortFields.Add Key:=Range(“キー”), Order:=並べ替え順
以下は、Sortオブジェクトを使用する場合のコードの一例です。
【サンプルコード】
Sub sampleSortObj()
Dim ws As Worksheet
Set ws = ActiveSheet
With ws.Sort
With .SortFields
.Clear
.Add Key:=ws.Range("B1"), Order:=xlAscending
End With
.SetRange ws.Range("A1:B9")
.Apply
End With
End Sub
キーの指定を行う際は、先にClearメソッドで前回ソート時の情報をクリアしてからAddメソッドを使用します。
SortオブジェクトのSetRangeメソッドで並べ替えを行うセル範囲を指定し、Applyメソッドで並べ替えを実行しています。
数値型の配列をソートする
配列そのものには残念ながらソート機能が無いため、代わりにSortメソッドを使用して並べ替えを行う方法を紹介します。
以下のサンプルコードで確認していきましょう。
【サンプルコード】
Sub sampleSortArray()
Dim arr() As Variant
arr = Array(1, 5, 2, 4, 3)
Dim arrCount As Integer
arrCount = UBound(arr) + 1
For num = 1 To arrCount
Cells(num, 1).Value = arr(num - 1)
Next num
Range("A1:A" & arrCount).Sort key1:=Range("A1"), Order1:=xlAscending
End Sub
【実行結果】
このサンプルコードではまず、作成した動的配列の要素をExcelシート上のセルに反映させています。要素をセルに反映させることで、Sortメソッドでの並べ替えが可能になります。
セルへのコピーは、ループ処理を使用して行なっています。配列のインデックス番号は0から始まりますが、セル範囲は1から順に数を数えるため、ループの開始数値には1を指定します。
UBound関数は、配列のインデックス番号の最大値を取得する関数です。要素数が合計で5つのため、この関数で返される数値は4になりますが、ループの開始数値を1から始めているので数を1つ足してから終了数値に指定しています。
Dir関数で取得したファイル・フォルダの一覧をソートする
Dir関数は、指定した条件に一致するファイルやサブフォルダなどの一覧を取得することができる関数です。
▼▼Dir関数に関する詳しい解説はこちらをご覧ください▼▼
データを扱う上で非常に有用な機能ですが、残念ながらDir関数にもソート機能は用意されていないため、検索結果を並べ替えたい場合には別途で処理する必要があります。
この場合も、Sortメソッドを使って並び替えを行うと便利です。
【サンプルコード】
Sub sampleSortFile()
Dim path As String, directory As String, msg As String
path = "C:\Program Files (x86)\Microsoft Office\*"
directory = dir(path, vbDirectory)
'ファイル名・フォルダ名が見つからなくなるまでループ
Do While directory <> ""
If InStr(directory, ".") <> 1 Then
msg = msg & directory & vbCrLf
End If
'次のファイル名、フォルダ名を取得
directory = dir()
Loop
Dim arr() As String
'改行ごとに文字列を区切り、配列の要素として格納
arr = Split(msg, vbCrLf)
Dim arrCount As Integer
arrCount = UBound(arr) + 1
Range("A1:A" & arrCount) = WorksheetFunction.Transpose(arr)
Range("A1:A" & arrCount).Sort key1:=Range("A1"), Order1:=xlDescending
MsgBox msg
End Sub
【実行結果】
このコードでは、まず初めにDir関数を使ってファイル名とサブフォルダ名の一覧を取得しています。
(フォルダのパスに関しては、使用しているPC環境で多少の違いが出るので、自身の環境に合わせて変更を行ってください)
一旦、取得した一覧を文字列として変数に代入した後、Split関数を使って配列arrの要素に格納しています。その後、格納した要素をセルに反映させてから、Sortメソッドを使って降順に並び替えています。
辞書(Dictionary)型のデータをキーの文字列でソートする
次に、Dictionary(辞書)内の要素をソートする方法について見ていきます。
基本的な流れはこれまでと同様ですが、今回はSortオブジェクトの方を使用して並び替えを行ってみましょう。Dictionaryはキーとデータが紐づいて格納されているため、キーをもとにソートします。
▼▼Dictionary型の詳しい解説はこちらをご覧ください▼▼
【サンプルコード】
Sub sampleSortDictionary()
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
myDic.Add "じゃがいも", 210
myDic.Add "きゅうり", 150
myDic.Add "はくさい", 270
myDic.Add "トマト", 320
myDic.Add "えのき", 190
Dim num As Integer
num = 1
Dim str As String
For Each Key In myDic
Cells(num, 1).Value = Key
Cells(num, 2).Value = myDic.Item(Key)
str = str & Key & " : " & myDic.Item(Key) & vbCrLf
num = num + 1
Next Key
With ActiveSheet.Sort
With .SortFields
.Clear
.Add Key:=Range("A1"), Order:=xlAscending
End With
.SetRange Range("A1:B" & myDic.Count)
.Apply
End With
MsgBox str
End Sub
【実行結果】
まず初めに、Dictionayオブジェクトを作成して要素を格納した後、Excelシート上のセルにそれぞれのキーとデータを反映させています。
各要素の反映が完了したら、Sortオブジェクトを使用してソートの設定を行います。今回はキーを基準に並べ替えを行うので、SortFieldsコレクションのAddメソッドでA列を指定しています。
Dictionay内の各キーには、ひらがなかカタカナのどちらかが格納されているので、ソート後の順番は五十音順になっています。
まとめ
ここまで、Excelのソート機能について解説してきました。
大量のデータを扱うExcelでの作業においては、ソートを駆使してデータを整理するスキルは様々な場面で応用が効きますので、しっかりマスターして使いこなしてくださいね!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
- 【VBA入門】配列まとめ(宣言・初期化、反復処理、コピー、結合)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。