HOME > VBA 基礎 > このページ
Recordsetの作成(DAO編)

■Contents

01 オブジェクト変数の宣言    
02 データベースに接続する    
   ・カレントデータベースに接続  ・他のAccessデータベースに接続  
03 Recordsetオブジェクトの作成    
   ・テーブルタイプのRecordset  ・ダイナセットタイプのRecordset  ・スナップショットタイプのRecordset
   ・スナップショットタイプのRecordset  ・前方スクロールスナップショットタイプのRecordset  ・フォームをもとにRecordset
04 レコードタイプの使い分けのポイント    
05 フィールドの参照方法    


01.オブジェクト変数の宣言

【書式】Dim オブジェクト名 As クラス名
 オブジェクト変数を宣言するには,Dim,Static,Public,Privateステートメントを使用します。これらのステートメントについては変数の適用範囲を参照してください。クラス名は,オブジェクトを提供するコンポーネントの名前と,オブジェクトのクラス名をドット(.)でつないで指定します。DAOオブジェクトを提供するコンポーネントの名前は「DAO」です。
【サンプルコード】
   Dim DB As DAO.Database  (Databaseオブジェクトを扱う変数(DB)を宣言)
      Dim RS As DAO.Recordset (Recordsetオブジェクトを扱う変数(RS)を宣言)



02.データベースに接続する

 データベースに接続するには,Databaseオブジェクトを使用します。
CurrentDb関数の戻り値をDatabase型オブジェクト変数に代入します。
【サンプルコード】
   Dim DB As DAO.Database
      Set DB = CurrentDb() 
 WorkasaceコレクションのOpenDatabaseメソッドを使用します。
【サンプルコード】
   Dim DB As DAO.Database
      Set DB = DBEngine.Workspaces(0).OpenDatabase("D:\Data\Sample.mdb")



03.Recordsetオブジェクトの作成

 DatabaseオブジェクトのOpenRecordsetメソッドを利用してレコードセットを作成します。
【書式】
   Set recordset = database.OpenRecordset (type, options)

 recordset: Recordsetオブジェクトを表すオブジェクト変数を指定
 database:開いているDatabaseオブジェクト変数を指定
 source:テーブル名,クエリー名,SQL ステートメントを指定
 type:(省略可能) Recordsetの種類を示す定数を指定
 options:(省略可能) Recordsetの特性を指定する定数の組み合わせを指定
■引数 type には次の定数から 1 つを使用します。
定数 内容
dbOpenTable テーブル タイプの Recordset オブジェクトを作成 。
dbOpenDynaset ダイナセット タイプの Recordset オブジェクトを作成。
dbOpenSnapshot スナップショット タイプの Recordset オブジェクトを作成。
dbOpenForwardOnly 前方スクロール タイプの Recordset オブジェクトを作成。

 ※種類を指定しないと、テーブルタイプの Recordset オブジェクト が作成可能な場合は、テーブルタイプの Recordset オブジェクが作成され、sourceに、リンク テーブルやクエリーを指定している場合はダイナセット タイプの Recordset オブジェクトが作成されます。


■引数 options には,次の定数の組み合わせを使用できます。
定数 内容
dbAppendOnly レコードの追加はできますが、編集および削除はできません。
dbSeeChanges 編集中のデータを他のユーザーが変更しようとした場合、エラーが発生します。
dbDenyWrite 他のユーザーはレコードの修正や追加できません 。
dbDenyRead 他のユーザーはテーブルのデータの読み取りはできません。
dbForwardOnly 前方スクロール タイプの Recordset オブジェクトを作成します。
dbReadOnly 他のユーザーは Recordset の変更はできません。
dbInconsistent 矛盾を許す更新を可能にします 。
dbConsistent 一貫性のある更新のみを可能にします。

※表中の「●」は使用可能なレコードセットのタイプを表しています。
    T・・・テーブル タイプの Recordset オブジェクト
    D・・・ダイナセット タイプの Recordset オブジェクト
    S・・・スナップショット タイプの Recordset オブジェクト
    F・・・前方スクロール タイプの Recordset オブジェクト
@ テーブルタイプのRecordset オブジェクトは,テーブルに登録されているレコードの集まりを表します。レコードの追加・削除や、データの更新したりすることができます。
A1つのローカルテーブルからのみ作成可能で、リンクテーブルや結合による選択クエリで作成することは出来ません。
Bもとになっているテーブル用に作成された「インデックス」が使用でき、他のタイプのレコードセットに比べ、データのソートや検索が高速です。
【サンプルコード】
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbopenTable) 
@ダイナセットタイプのRecordset オブジェクトは,ローカルテーブル、リンクテーブル、選択クエリから作成できます。
Aレコードを追加したり,データを更新したりすることができます。
BRecordsetのレコードが変更されると、もとになっているテーブルのレコードも更新され、もとになっているテーブル
 のレコードが更新されると、Recordsetも変更されます。
【サンプルコード】
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbopenDynaset) 
@スナップショットタイプのRecordset オブジェクトは,スナップショット作成時のデータに固定されます。。
Aレコードセットの内容は更新できません。
【サンプルコード】
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbopenSnapshot) 
@処理は速いが、他のタイプより機能がすくなくなります。
Aレコードを前方方向のみ移動できます(MoveメソッドとMoveNextメソッドのみ使用可能)。
Bレコードセットの内容は更新できません。
【サンプルコード】
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    
        Set DB = CurrentDb()
        Set RS = Db.OpenRecordset("生徒名簿",dbOpenForwardOnly) 
【書式】Set recordset = form.Recordset.Clone

 recordset:開くRecordsetオブジェクトを表すオブジェクト変数を指定
 form:開いているフォーム
 フォームのRecordsetプロパティは,フォームのRecordsetのCloneメソッドを利用すると,AccessのフォームをもとにしてダイナセットタイプのRecordsetオブジェクトを作成することができます。
【サンプルコード】
  Public Sub exsample()
     Dim RS As dao.Recordset
  
     Set RS = Form!F_銀行コード.Recordset.Clone
  
     Do Until RS.EOF
        Debug.Print RS!銀行コード, RS!銀行名
        RS.MoveNext
     Loop
     RS.Close
     Set RS = Nothing
  End Sub
 こちらにもサンプルがあります。参考にしてください。


04.レコードタイプの使い分けのポイント

データを使う目的によってRecordsetのタイプを使い分ける必要があります。
@ データの並べ替えやインデックスを利用してレコード操作を行う場合は、テーブルタイプを使用すると高速に処理
 できます。
A クエリで抽出したレコードを更新する場合は、ダイナセットを使用します。
B テーブルタイプを使えない状況で、レコードを単に参照する場合は、前方スクロールスナップショットを使うと、速く
 処理できます。



05.フィールドの参照方法

 フィールドオブジェクトには,作成した順番に0から始まるインデックス番号が付けられます。各フィールドを参照するには,このインデックス番号を使う方法と,フィールドに付けられた名前を使う方法があります。
図1
Fields
学籍番号 氏名 フリガナ クラス ・・・
0 1 2 3 ・・・
Recordset オブジェクトとFieldsコレクションをドット演算子(.)でつないで記述します。
【書式1】recordset.Fields(インデックス番号)

 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【書式2】recordset.Fields(オブジェクト名)

 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
        (オブジェクト名はダブルクォーテーションで囲みます)
【書式3】recordset.Fields!オブジェクト名

 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【書式4】recordset!オブジェクト名

 recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【例】次はいずれも上の図1のFieldsコレクションの「フリガナ」フィールドを参照する例です。

     RS.Fields(2)
     RS.Fields("フリガナ")
   RS.Fields!フリガナ
   RS!フリガナ  
【サンプルコード】次の例は「コード1」から「コード10」までのフィールドを「 For 〜Next 」ループで操作する方法です。似たような名称のフィールド操作に利用すると便利です。
Sub Exsample()

    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim i As Integer
     
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("T_追跡")
    
    RS.MoveFirst
    Do Until RS.EOF
        RS.Edit
            For i = 1 To 10
               RS("コード" & i) = Me("コード" & i)
                If RS("コード" & i) = "" Or Len(RS("コード" & i)) <> 8 Then
                     RS("コード" & i) = Null
                End If
            Next i
     
         RS.Update
         RS.MoveNext
    Loop
 
    RS.Close: Set RS = Nothing
    DB.Close: Set DB = Nothing
End Sub

ホームページに|前のページに|次のページに

CopyRight(C) 2004 cbcnet. All Rights Reserved