ACCESS VBA ADOでレコードを削除する方法
ACCESSではクエリを使ってレコードの追加・削除・更新が可能です。
一方で、VBAを利用すればさらに柔軟なレコード操作を行うことができます。
ACCESSでレコードの追加・削除・更新を行う際に使用するのがADOです。
今回は、ADOでレコードを削除する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
ADOでレコードを削除する構文
ADOでレコードを削除する際は。Deleteメソッドを利用します。
利用方法は以下の通りです。
レコードセット.Delete
レコードセットの部分には実際のレコードセット名を入力します。
これを実行することで、該当レコードセットのカレントレコード(1レコード)が削除されます。
レコードセット全体を削除するわけではないのでご注意ください。
以下、ADOを含めた解説をします。
ADOとは
ADO(ActiveX Data Objects)とはマイクロソフトが提供する、データベースを操作するための様々オブジェクトの集合体です。
ADOを使うことでデータベースの操作が可能です。
ACCESSはもともとクエリ等のデータベースを操作する独自オブジェクトを用意していますが、ADOを使うことで条件分岐やループを含めたより柔軟なデータベースの追加、更新、削除が可能です。
ADOとよく似たものに、DAO(Data Access Object)があります。
ACCESSのデータベース接続に特化している点が特長で、ADO登場以前から使われています。
ただ、今後VBAプログラミングを行うならADOを使っておくほうが良いでしょう。
ADOとDAOはプログラミングの方法が若干異なりますので、混在すると複雑になります。
ADOの使用準備
ADOを使用するためにはACCESS側で、ADOの利用に必要なライブラリファイルを追加する必要があります。
といっても、操作は簡単です。
ACCESSを起動させたら、ALT + F11キーでVBE(Visual Basic Editor)を表示します。
VBEの画面で、ツールから参照設定を選択します。
参照設定の画面が表示されますので、Microsoft ActiveX Data Objects X.X Libraryを選択して、OKを押します。
X.Xの部分はバージョンです。できるだけ数字の大きいもの(新しいもの)を選択してください。
これで、事前準備は完了です。
VBAでのADOを使ったレコード削除例
それではVBAでレコードを削除するプロシージャを作成しましょう。
今回は以下のコードを作成しました。
Public Sub test_delete(uriage_id As Long)
'変数の宣言
Dim cnn As ADODB.Connection
Dim rst1 As ADODB.Recordset
'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
'レコードセットを取得
rst1.Open "TRN_売上明細2", cnn, adOpenKeyset, adLockOptimistic
'該当売上IDのレコードのみを抽出
rst1.Filter = "売上ID = " & uriage_id
'売上明細がない場合
If rst1.recordcount = 0 Then
Exit Sub
'売上明細がある場合
Else
Do Until rst1.EOF
rst1.Delete
rst1.MoveNext
Loop
End If
'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing
End Sub
TRN_売上明細2というテーブルのレコードを削除するプロシージャです。
削除する際、引数に売上IDを渡し、該当の売上IDのレコードだけを削除しています。
以下、パートごとに説明します。
'変数の宣言
Dim cnn As ADODB.Connection
Dim rst1 As ADODB.Recordset
'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
最初に変数の宣言と、変数にADOのオブジェクトを代入しています。
ここはこのままのコードを毎回利用できます。
'レコードセットを取得
rst1.Open "TRN_売上明細2", cnn, adOpenKeyset, adLockOptimistic
次に、宣言したrst1というレコードセットに、TRN_売上明細2のテーブルを格納しています。
'該当売上IDのレコードのみを抽出
rst1.Filter = "売上ID = " & uriage_id
次に、Filterプロパティを使って、引数で渡されたuriage_idと同じ売上IDのレコードだけを抽出します。
'売上明細がない場合
If rst1.recordcount = 0 Then
Exit Sub
'売上明細がある場合
Else
Do Until rst1.EOF
rst1.Delete
rst1.MoveNext
Loop
End If
そしていよいよレコード削除処理です。
その前に、If文でレコード数が0の場合は処理をスキップするようにしてあります。
Elseで売上明細がある場合は、rst1.Deleteでレコードを削除し、rst1.MoveNextで次のレコードに移動してループ処理を繰り返します。
rst1.EOF、つまりTRN_売上明細で該当売上IDのレコードの最後まで処理を行ったらループから脱出します。
'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing
最後にADOのクローズ処理を行って終了です。
以上、ADOでレコードを削除する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。