VBScriptでバッチを作っていて、たまにRecordsetを関数の戻り値に設定したい場合があり、いつもやり方を忘れるため、ここに残しておきます。
サンプルコード
Dim objRs 'レコードセットを生成 Set objRs = CreateObject("ADODB.Recordset") 'レコードセットのフィールドを定義 objRs.Fields.Append "Test1",20 objRs.Fields.Append "Test2",200, 32, adFldIsNullable objRs.Open 'Recordsetに行を追加するFunctionを実行 Set objRs = TestFunc(objRs,200,"かきくけこ") Set objRs = TestFunc(objRs,100,"あいうえお") 'カレントレコードを先頭に移動 objRs.MoveFirst '処理結果をRecordsetの行数分表示 Do Until objRs.EOF msgbox objRs("Test1").Value & " " & objRs("Test2").Value objRs.MoveNext Loop Set objRs = Nothing Function TestFunc(rs,Value1,Value2) 'データ追加 rs.AddNew rs("Test1").Value = Value1 rs("Test2").Value = Value2 rs.Update 'Recordsetを引数に代入 Set TestFunc = rs End Function
このサンプルコード自体は、ADOでレコードセットオブジェクトを生成し、配列の代わりとしてデータを格納しています。VBScriptの配列は使いにくいので、最近は配列の代わりにレコードセットを使うことが多いです。※この配列の代わりにレコードセットを使うテクニックは結構便利なので、またどこかで紹介したいです。
※追記「配列の代わりにレコードセットを使う方法」を掲載しました!
今回のポイントはFunctionの戻り値としてRecordsetを代入する際に、Set を付けるとこですね。
Set TestFunc = rs
この記述ですが、通常の戻り値を指定する場合はSet は不要ですが、レコードセットを戻り値に指定する場合は Set を先頭に指定しないとエラーになります。
なぜ Set が必要なのか
余談ですが、今回はRecordsetを戻り値として代入しようとするとSetが必要になりました。戻り値に普通の変数や値を代入する場合は必要ないのですが、この違いはなぜでしょうか?
Recordsetは通常の変数ではなく、オブジェクト変数という特殊な仕組みの変数です。そういった変数を代入するには、明示的に Set を記述しないといけないルールがあります。ただオブジェクト変数に関連する値を代入する場合は、常にSetを指定すれば良い訳ではなく、例えば、上のサンプルコードで言えば、戻り値として以下の様にレコードセットの値を指定する場合はSetは不要です。
TestFunc = rs(0).Value
この場合の rs(0).Value はオブジェクト変数そのものではなく、オブジェクト変数のValueプロパティを戻り値に指定しており、Valueプロパティでは、レコードセットオブジェクトが格納しているデータを列番号や列名を指定して取り出す指示にである為、言ってみれば1や2などの数字や何らかの文字列を直接戻り値に指定しているのと変わらない動作になります。レコードセットオブジェクトそのものを渡している訳ではないので注意が必要です。
VBScrptだと変数宣言時に型を指定しないのでイメージし辛いですが、そういうものだと覚えてください。
今回も皆さまの参考になれば幸いです。ではでは。