【VBScript】レコードセットを関数の戻り値に指定する方法

Tips
スポンサーリンク

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の配列は使いにくいので、最近は配列の代わりにレコードセットを使うことが多いです。※この配列の代わりにレコードセットを使うテクニックは結構便利なので、またどこかで紹介したいです。

※追記「配列の代わりにレコードセットを使う方法」を掲載しました!

【VBScript】配列の代わりにレコードセットを使う方法
今回はVBScriptの配列の代わりにレコードセットを使用する方法を紹介します。 VBScriptの配列は使いづらい VBSに限らずVBAなどでも同じですが、配列が使いづらいです。ひとつのデータ型しか定義出来ないし、空かどうか判定も面倒...

今回のポイントは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だと変数宣言時に型を指定しないのでイメージし辛いですが、そういうものだと覚えてください。

今回も皆さまの参考になれば幸いです。ではでは。

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