ACCESS VBA Recordsetの使い方
ACCESS VBAでテーブルの値をプログラムから操作する際に利用するのがレコードセットです。
テーブルとはどう違うの?と思われるかもしれません。
今回は、ACCESS VBAでのレコードセットの使い方をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
目次
レコードセットとは
レコードセットとは、ACCESS VBAでテーブルを操作する際に使用するオブジェクトです。
レコードセットのオブジェクト(変数のようなもの)に特定のテーブルを代入し、そのうえでレコードの追加、変更、削除などの操作を行うことができます。
そのため、VBAのプログラム上でテーブル操作を行う際には、レコードセットを使用することが必要になります。
なお、このレコードセットオブジェクトを使用するために前提として利用するのがADOです。
ADOとは
ADO(ActiveX Data Objects)とはマイクロソフトが提供する、データベースを操作するための様々オブジェクトの集合体です。
ADOを使うことでデータベースの操作が可能です。
ACCESSはもともとクエリ等のデータベースを操作する独自オブジェクトを用意していますが、ADOを使うことで条件分岐やループを含めたより柔軟なデータベースの追加、更新、削除が可能です。
ADOとよく似たものに、DAO(Data Access Object)があります。
ACCESSのデータベース接続に特化している点が特長で、ADO登場以前から使われています。
ただ、今後VBAプログラミングを行うならADOを使っておくほうが良いでしょう。
ADOとDAOはプログラミングの方法が若干異なりますので、混在すると複雑になります。
レコードセットを利用するための記述
レコードセットを利用するためには決まった記述方法があります。
変数の宣言
初めに、レコードセットを利用するためには、宣言処理が必要になります。
よく利用するのは以下のような記述です。
Dim cnn As ADODB.Connection
Dim rst1 As ADODB.Recordset
最初の行では、ADOを利用するために、cnnという名称のデータベースへ接続するためのConnectionオブジェクトを宣言します。
次の行では、rst1という名称のレコードセットオブジェクトを宣言します。
変数への代入
次に、宣言した変数に対して、オブジェクトを代入します。
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
最初の行では、cnnに対して、カレントデータベース、つまり今開いているACCESSデータベースを設定します。
次の行では、先ほど宣言した変数rst1に対して、Recordsetオブジェクトのインスタンスを作成しています。
最後の行では、カーソルの位置をクライアントPCに設定しています。
このあたりはよくわからなければ、上記のコードをそのまま使用して問題ないでしょう。
レコードセットにテーブルを設定する
いよいよ、レコードセットにテーブルを設定します。
レコードセットにテーブルを設定する際はOpenメソッドを使って以下の記述を行います。
レコードセット名.Open 設定するテーブル名 , コネクションオブジェクト名 , カーソルタイプ , ロックタイプ
実際に、上記で作成したcnnコネクション上のrst1レコードセットに対して、「TRN_年月」というテーブルを設定する際の記述は以下になります。
rst1.Open "TRN_年月", cnn, adOpenKeyset, adLockOptimistic
引数に設定している、カーソルタイプとロックタイプの意味は後述しますね。
レコードセットのパラメータ
レコードセットの取得の際のパラメータは、以下の通りです。
基本は、adOpenKeyset, adLockOptimisticにしておけば問題はないです。
ロックタイプに関しては、更新を行わないのであればadLockReadOnlyにしておく方が誤動作を防げます。
CursorType
adOpenForwardOnly | 前方スクロールカーソル。前方スクロールのみだが高速。検索を一度のみ実施する場合などに利用。 |
adOpenKeyset | キーセットカーソル。他のユーザーによる追加・削除は確認できない。 |
adOpenDynamic | 動的カーソル。レコードをすべての方向に移動することができる。他のユーザーによる追加・削除が確認できる。 |
adOpenStatic | 静的カーソル。レコードをすべての方向に移動することができる。他のユーザーによる追加・削除は確認できない。 |
LockType
adLockReadOnly | 読み取り専用 |
adLockPessimistic | レコード単位の排他的ロック |
adLockOptimistic | レコード単位の共有的ロック |
adLockBatchOptimistic | 共有的バッチ更新 |
adLockUnspecified | ロックタイプを指定しない |
これで、レコードセットにテーブルを設定して利用する準備ができました。
レコードセットの使い方
レコードセットに対しては様々な処理が可能です。
その際はレコードセット名.メソッド名で記述して使用します。
以下の例を使用する際、Recordsetと記載している部分は、実際には定義したRecordsetの変数(上記の例でいうとrst1)を記述してください。
レコードの移動
レコードセット内でレコードを移動することができます。
Recordset.Movefirst | 先頭レコードに移動します |
Recordset.MovePrevious | 1つ前のレコードに移動します |
Recordset.MoveNext | 次のレコードに移動します |
Recordset.MoveLast | 最終レコードに移動します |
フィルター
レコードセットから一定の条件でレコード抽出することが可能です。
記載方法は以下の通りです。
Recordset.Filter = 抽出条件文
抽出条件文はテキスト型のため、”(ダブルクォーテーション)で囲うことを忘れないようにしましょう。
レコード数のカウント
レコードセットに含まれるレコード数をカウントすることが可能です。
記載方法は以下の通りです。
Recordset.Count
レコードの追加
ここまでに記載した、レコードの移動、フィルター、カウントであればADOやRecordsetを使用しなくても実現可能です。
しかし、ここから説明するレコードの追加、更新、削除をVBA上で行う時はADOが必要になりますので、ご注意ください。
まずはレコードの追加です。以下の構文で記述します。
Recordset.AddNew
Recordset!フィールド1 = 値1
Recordset!フィールド2 = 値2
Recordset.Update
レコード追加について詳しくは以下の記事に記載しておりますのでご参照ください。
レコードの更新
レコードの更新も、追加と記載方法が似ています。
Recordset!フィールド1 = 値1
Recordset!フィールド2 = 値2
Recordset.Update
追加で最初に記述する「AddNew」が無いだけですね。
レコードの更新について詳しくは以下の記事を参照ください。
以上、Recordsetの使い方をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。