LoginSignup
1
1

【Access VBA】ADOによるDB操作

Posted at

はじめに

C#でアプリ開発を行っていたエンジニアが、半年にわたるAccess案件で学んだことをまとめています。
今回はAccessVBAの要ともなるDB操作についてまとめます。

1.基本テンプレート

Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
Dim RS As New ADODB.recordset
Set RS = New ADODB.recordset
RS.Open "テーブル名", CN, adOpenKeyset

まずDim CN As ADODB.Connectionで接続用変数を定義し、Set CN = CurrentProject.Connectionでカレントデータベースへの接続を保持します。
次にDim RS As New ADODB.recordsetでレコードセット用変数を定義し、Set RS = New ADODB.recordsetでレコードセットオブジェクトを保持します。
最後にRS.Open "テーブル名", CN, adOpenKeysetで、テーブルに接続(CN)し、結果をレコードセット(RS)に格納しています。

テーブル名にはクエリ名やSQL文も指定可能

これによりレコードセットを使った処理ができますが、レコードセットの必要ない接続(UPDATEやINSERT等)は、レコードセットの定義やオブジェクトが必要ないので以下のように省略することが可能です。

Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection
CN.Execute "クエリ名", cnt

cntにはUPDATEやINSERTを行った際のレコード数が返ります。使用しない場合は省略可能です。

2.レコードセット

⋙EOFとは

EOFはカレントレコードを示すポインターのようなものです。
レコードがある場合はTrue
レコードが無い場合はFalseを返します

If Not RS.EOF Then Exit Function

このようにすると、テーブルやクエリ結果のレコードが存在しない場合はFunctionを抜ける、という使い方をすることができます。
また、最終レコード以降にポインターが移動した際もFalseが返るため以下のようにして全レコードのループ処理を作ることができます。

Do Until RS.EOF 
 //ループ処理
 RS.MoveNext
Loop

ループのたびにRS.MoveNextで次レコードに移動する必要があります。これをしないと同じレコードでループし続けて無限ループになってしまうので注意しましょう

⋙レコード数の取得

Open直後にはうまく取得できない場合があります

RS.MoveLast
RS.MoveFirst

このようにすることで正常にRecordCountが取得できるようになる

現在のレコード番号の取得

RS.AbsolutePosition

このようにすると現在のレコード番号を取得できる
最初から〇番目のレコードまで、などの条件を付与したいときに使えます。

レコードの削除

Do Until RS.EOF
 If 〇〇〇 Then
  RS.Delete
 End If
 RS.MoveNext
Loop

このようにすることで、〇〇〇の条件に一致するレコードを削除することができる

さいごに

いかがでしたか?
始めはweb系の言語とは違い必要なコードが増えますが、慣れるとテンプレートに沿った書き方をすればいいので扱いやすいなと思いました。
他に気づくことがあれば追記していきます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1