DAO レコードセット内のレコードからデータを抽出する

1 つ以上の特定のレコードを特定した後で、基になるソース テーブルを修正する代わりに、アプリケーションで使用するデータを抽出することができます。

1 つのフィールドをコピーする

レコードの 1 つのフィールドを、適切なデータ型の変数にコピーすることができます。 次の例では、 Recordset オブジェクトの最初のレコードから 3 つのフィールドを抽出します。

Dim dbsNorthwind As DAO.Database 
Dim rstEmployees As DAO.Recordset 
Dim strFirstName As String 
Dim strLastName As String 
Dim strTitle As String 
 
   Set dbsNorthwind = CurrentDb 
   Set rstEmployees = dbsNorthwind.OpenRecordset("Employees") 
 
   rstEmployees.MoveFirst 
   strFirstName = rstEmployees!FirstName 
   strLastName = rstEmployees!LastName 
   strTitle = rstEmployees!Title 

レコード全体を配列にコピーする

1 つ以上のレコードをコピーするために、2 次元の配列を作成してレコードを 1 つずつコピーすることができます。 フィールドごとに最初の添字を、レコードごとに 2 番目の添字をインクリメントします。

これを行う高速な方法は、2 次元配列を返す GetRows メソッドを使用することです。 次にように、1 番目の添え字でフィールドを指定し、2 番目の添え字で行番号を指定します。

varRecords(intField, intRecord) 

次のコード例では、SQL ステートメントを使って、"社員" という名前のテーブルの 3 つのフィールドを Recordset オブジェクトに取得します。 次に、GetRows メソッドを使って Recordset の最初の 3 つのレコードを取得し、選択されたレコードを 2 次元の配列に格納します。 続いて、2 つの配列インデックスを使って特定のフィールドおよびレコードを選択することにより、一度に 1 つずつ各レコードを出力します。

次の例では、別々のステートメントを使って各レコードの各フィールドを特定して出力し、配列インデックスがどのように使われるかを示します。 実際には、ネスト構造の 2 つのループを使用し、配列の両方の次元をステップ処理するインデックス用の整数型変数を用意すると、より確実です。

Sub GetRowsTest() 
 
Dim dbsNorthwind As DAO.Database 
Dim rstEmployees As DAO.Recordset 
Dim varRecords As Variant 
Dim intNumReturned As Integer 
Dim intNumColumns As Integer 
Dim intColumn As Integer 
Dim intRow As Integer 
Dim strSQL As String 
 
On Error GoTo ErrorHandler 
 
   Set dbsNorthwind = CurrentDb 
   strSQL = "SELECT FirstName, LastName, Title FROM Employees" 
   Set rstEmployees = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
 
   varRecords = rstEmployees.GetRows(3) 
   intNumReturned = UBound(varRecords, 2) + 1 
   intNumColumns = UBound(varRecords, 1) + 1 
 
   For intRow = 0 To intNumReturned - 1 
      For intColumn = 0 To intNumColumns - 1 
         Debug.Print varRecords(intColumn, intRow) 
      Next intColumn 
   Next intRow 
 
   rstEmployees.Close 
   dbsNorthwind.Close 
 
   Set rstEmployees = Nothing 
   Set dbsNorthwind = Nothing 
 
Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

さらに多くのレコードが使用可能な場合 は、GetRows メソッドの後続の呼び出しを使用します。 GetRows メソッドを呼び出すとすぐに配列が満たされるため、一度に 1 つずつフィールドをコピーする方法よりもこの方法がずっと高速なことがわかります。

また、 これは GetRows メソッドがレコードを返すときに自動的に実行されるため、バリアント型 (Variant) を配列として宣言する必要はありません。 これにより、より多くのメモリを占有する可変長ディメンションを使用する代わりに、返されるレコードまたはフィールドの数を把握することなく、固定長配列ディメンションを使用できます。

複数の GetRows 呼び出しを使用してすべての行を取得しようとしている場合は、 EOF プロパティを使用して 、Recordset の末尾にいることを確認します。 GetRows メソッドは、要求した行数よりも少ない行を返す場合があります。 たとえば、 Recordset 内の残りの行数を超える行を要求した場合、 GetRows メソッドは残りの行のみを返します。 同様に、要求された範囲内の行を取得できない場合、その行は返されません。

たとえば、取得しようとしている 10 個のレコードのグループで 5 番目のレコードを取得できない場合、 GetRows メソッドは 4 つのレコードを返し、問題の原因となったレコードの現在のレコード位置を残し、実行時エラーを生成しません。 この状況は、ダイナセット内のレコードが別のユーザーによって削除された場合に発生する可能性があります。 要求された数よりも少ないレコードが返され、ファイルの末尾にない場合は、現在のレコードの各フィールドを読み取って 、GetRows メソッドで発生したエラーを特定する必要があります。

GetRows メソッドは常に Recordset オブジェクト内のすべてのフィールドを返しますが、必要なフィールドだけを取得するクエリを作成することができます。 これは特に、OLE オブジェクト型 (OLE Object) およびメモ型 (Memo) のフィールドにとって重要です。

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。