はじめに
VBScriptには、JavaScriptでいうところのarray.sort()のような標準のソート(並び替え)関数がありません。このため、大抵はソート関数を自作することになるのですが、ADODB.Recordsetオブジェクトを使うと、簡単にソートが実現できます。
ADODB.Recordsetでソートする
ADODB.Recordsetを使ってソートする場合、Fields.Appendでソート用の列を作成します。(ここではField1)
この列にデータを追加していき、すべてのデータを追加したらupdateメソッドで変更を確定させます。そして、sortプロパティでASC(昇順)/DESC(降順)を指定してやると、データがソートされます。
Function SortByRecordset(array) Dim i, rs, len Set rs = CreateObject("ADODB.Recordset") ' Filed1という列を追加する。 ' 第2引数はvarcharを表す定数、第3引数はデータ長 Call rs.Fields.Append("Field1", 200, 255) Call rs.Open() len = UBound(array) For i = 0 To len Call rs.AddNew() ' データをレコードセットに追加していく rs.Fields("Field1").Value = array(i) Next Call rs.Update() ' ソートする rs.Sort = "Field1 DESC" SortByRecordset = rs.GetRows() Call rs.Close() Set rs = Nothing End Function
上記のソート関数を呼び出す
Dim array1, array2, i array1 = Array("d","a","b","c") array2 = SortByRecordset(array1) For i = 0 To UBound(array1) WScript.Echo "array1::" & array1(i) Next For i = 0 To UBound(array2, 2) WScript.Echo "array2::" & array2(0, i) Next
rs.GetRows()は二次元配列を返す
上記のコードには少し問題があります。rs.GetRows()が二次元配列を返す仕様であるため、SortByRecordset関数の戻り値として二次元配列が返ってしまいます。戻り値を一次元の配列にする場合は、空の配列に格納しなおすなどしてやる必要があります。