VBAやVBScriptの配列では、ソートや並び替えをする機能が備わっていないため、それをやろうとすると、バブルソートやクイックソートのアルゴリズムを手組みするか、またはExcelであればいったんシートに書き出したうえでシート上でソートするといった処理が必要になります。
もっと楽にソートする方法としてはオススメしたいのが、「配列の代わりにレコードセット利用して、そのレコードセットをソートする」実装です。
今回の記事では、実際にレコードセットを作成してデータを格納し、それを並び替える一連の処理のサンプルコードを紹介していきます。
尚、VBAもVBScriptもVB6がベースになっており、言語仕様も近く、同じように実装できます。
今回の記事ではVBScriptでのサンプルコードを掲載しますが、VBAでもこのままコピペしたうえで、サンプルコード内でコメントアウトしたSubプロシージャの宣言部分を修正してもらえればそのまま動きます。
是非ご活用下さい。
サンプルコード
以前の記事でも、配列に代わりにレコードセットを使用する方法を紹介しており、今回のサンプルコードも以前に作成したものを一部手直しをして作成しております。
Option Explicit
'VBAの場合は次の行のコメントを外してSub又はFunctionプロシージャ化してください。
'Sub Test()
Dim objRS
Set objRS = CreateObject("ADODB.Recordset")
'レコードセットの列を定義します。
objRS.Fields.Append "番号",20 '20:adBigInt
objRS.Fields.Append "名前",200,50 '200:VarChar(50)
objRS.Fields.Append "日付",135 '135:adDBTimeStamp
'レコードセットを開きます。
objRS.Open
'レコードセットに行を追加します。※当例では3行追加
Set objRS = AddRecordsetRow(objRS,1,"あいうえお","2021/01/01 00:00:00")
Set objRS = AddRecordsetRow(objRS,2,"かきくけこ","2021/02/01 00:00:00")
Set objRS = AddRecordsetRow(objRS,3,"さしすせそ","2021/03/01 00:00:00")
'レコードセットの日付列を降順でソートします。
'※ソートすることで、カレントレコードはソート後の先頭行に移動します。
objRS.Sort = "日付 DESC"
Do Until objRS.EOF
msgbox objRS("番号").Value & " " & objRS("名前").Value & " " & objRS("日付").Value
objRS.MoveNext
Loop
Set objRS = Nothing
'VBAの場合は次の行のコメントを外してください。
'End Sub
'引数で渡されたレコードセットと各列の値を使用してレコードセットの行を追加して返します。
'引数1:レコードセットオブジェクト
'引数2:列1の値
'引数3:列2の値
'引数4:列3の値
'戻り値:レコードセットオブジェクト
Function AddRecordsetRow(Rs,Column1Value,Column2Value,Column3Value)
'新規行を作成します。
Rs.AddNew
'作成した新規行に値をセットします。
Rs("番号").Value = Column1Value
Rs("名前").Value = Column2Value
Rs("日付").Value = Column3Value
'レコードセットへの反映を確定します。
Rs.Update
'関数の戻り値にレコードセットをセットします。
Set AddRecordsetRow = Rs
End Function
サンプルコードの簡単な解説
上記のサンプルコードでは、「AddRecordsetRow」というFunctionプロシージャを作成して、そこでレコードセットに行追加をしていますが、別にメインの処理内で実装しても問題はありません。
ポイントは23行目の以下の処理です。
objRS.Sort = "日付 DESC"
いったんレコードセットに格納してしまえば、面倒なソート処理も一行で済みます。
また、配列ではなくレコードセットでデータを扱うことは、他にも以下のメリットがあります。
- 列毎に異なるデータ型が指定できる。
- Accessの場合にコントロールと連結できる。
- BOFとEOFプロパティが取得できる。
Recordsetにはメソッドとプロパティが色々あるため、配列では面倒な処理も簡単に実装できます。
よって、配列で多少手の込んだ処理が必要になった場合は、レコードセットを上手く活用していただくことをおススメします。
今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!


