【VBA・VBS共通】配列をソートするならレコードセットを利用しよう

VBA
スポンサーリンク

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

今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!

タイトルとURLをコピーしました