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にはメソッドとプロパティが色々あるため、配列では面倒な処理も簡単に実装できます。
よって、配列で多少手の込んだ処理が必要になった場合は、レコードセットを上手く活用していただくことをおススメします。
今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!