HOME > 即効テクニック > AccessVBA > データ操作 > 複数のレコードを配列に格納する

即効テクニック

データ操作

複数のレコードを配列に格納する

(Access 2000/2002/2003)
●概要●
構文  GetRows(Rows, Start, Fields)

設定項目        内容
expression      Recordsetオブジェクトを指定[省略不可]
Rows            取得するレコードの数を長整数型で指定[省略可能]
Start           操作開始位置を指定[省略可能]
Fields          フィールドまたはフィールドの配列を指定[省略可能]

Recordsetオブジェクトの複数のレコードを配列に格納します。配列のサイズは自動的に調整されます。戻り値は2次元配列で、最初の添え字がフィールド番号、2番目の添え字がレコード番号を示します(Array(フィールド番号, レコード番号)となります)。
引数を省略すると、Recordsetオブジェクトのすべてのレコードが配列に格納されます。引数には次の定数を指定します。

・引数に指定する定数

定数                    説明
adBookmarkCurrent       カレントレコードから開始
adBookmarkFirst         最初のレコードから開始
adBookmarkLast          最後のレコードから開始

GetRowsメソッドを実行すると、カレントレコードはまだ読み込まれていない次のレコードになります。
次のコードは、Recordsetの2つのレコードのすべてのフィールドを配列に取得して、[イミディエイト]ウィンドウに表示しています。レコードごとに表示していますが、2番目の添え字がレコード番号を表していることに注意します。このサンプルを実行する場合は、フォルダ名やデータベース名をお使いの環境に合わせてください。

●サンプル1●
Sub ArraySample1()
    Dim myCN    As New ADODB.Connection
    Dim myRS    As New ADODB.Recordset
    '配列をバリアント型で宣言
    Dim myArray As Variant
    Dim i       As Integer
    Dim j       As Integer
    Dim myRec   As String
    myCN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\AccessVBA\Sample1.mdb"
    myCN.Open
    'レコードセットを開く
    myRS.Open "商品tbl", myCN
    '2レコードを配列に格納
    myArray = myRS.GetRows(2)
    'レコードごとに繰り返す
    For i = 0 To UBound(myArray, 2)
        'フィールドごとに繰り返す
        For j = 0 To UBound(myArray, 1)
            'フィールドをつなぐ
            myRec = myRec & myArray(j, i) & vbTab
        Next
        'バッファの内容を表示
        Debug.Print myRec
        'バッファをクリア
        myRec = ""
    Next
    'レコードセットを閉じる
    myRS.Close
    myCN.Close
End Sub

●サンプル2●

次のコードは、フィールド名を配列で指定して、Recordsetのすべてのレコードから指定したフィールドを配列に取得して、[イミディエイト]ウィンドウに表示しています。

Sub ArraySample2()
    Dim myCN    As New ADODB.Connection
    Dim myRS    As New ADODB.Recordset
    '配列をバリアント型で宣言
    Dim myArray As Variant
    Dim i       As Integer
    Dim j       As Integer
    Dim myRec   As String
    '配列をバリアント型で宣言
    Dim myField(1) As Variant
    myField(0) = "商品名"
    myField(1) = "単価"
    myCN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\AccessVBA\Sample1.mdb"
    myCN.Open
    'レコードセットを開く
    myRS.Open "商品tbl", myCN
    'すべてのレコードの指定フィールド
    myArray = myRS.GetRows(, , myField)
    'レコードごとに繰り返す
    For i = 0 To UBound(myArray, 2)
        'フィールドごとに繰り返す
        For j = 0 To UBound(myArray, 1)
            'フィールドをつなぐ
            myRec = myRec & myArray(j, i) & vbTab
        Next
        'バッファの内容を表示
        Debug.Print myRec
        'バッファをクリア
        myRec = ""
    Next
    'レコードセットを閉じる
    myRS.Close
    myCN.Close
End Sub

●ポイント●
GetRowsメソッドで最後のレコードまで読み込んだ場合は、RecordsetオブジェクトのEOFプロパティの値がTrueになります。