小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


VBScriptのADODB.Recordsetを使ってソート(sort)する

はじめに

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関数の戻り値として二次元配列が返ってしまいます。戻り値を一次元の配列にする場合は、空の配列に格納しなおすなどしてやる必要があります。