ACCESS VBA レコードを更新する方法
ACCESS VBAに慣れてくると、VBAを使ってテーブルのレコードを更新したくなると思います。
しかし、VBAの通常の関数ではレコードの更新ができません。
テーブルを操作する際はADO(ActiveX Data Object)を使用する必要があります。
今回は、ADOを使ってVBAからテーブルのレコードを更新する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
VBAでのテーブル操作
VBAを使いこなしてくると、DLookup関数やDsum関数でVBA側からテーブルの値を取得することも多くなるでしょう。
そうなると逆にVBAからテーブルの値を更新したくなるものです。
しかし、VBAに標準で用意された関数では、テーブルから値を取得したり、クエリやフォームの操作はできるものの、テーブルの値を更新できる関数がありません、
VBAから直接テーブルを操作するためには、ADO(ActiveX Data Objects)というデータベースを操作するための手法が必要になります。
ADOについては以下の記事でも触れておりますので、詳しく知りたい方はご覧ください。
サンプルテーブル
今回はサンプルとして以下の売上情報が入ったテーブルを用意しました。
こちらのテーブルの値を、条件を指定して更新する方法を見ていきましょう。
今回は、商品IDが1の場合に、数量を+1するという更新を行いたいと思います。
ADOを使ったレコード更新プロシージャ
商品IDが1の場合に、数量を+1するために、VBAでADOを使って下記のプロシージャを作成しました。
少し長く見えるかもしれませんが、内容はそれほど複雑ではありません。
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 "売上テーブル", cnn, adOpenKeyset, adLockOptimistic
Do Until rst1.EOF
If rst1!商品ID = 1 Then
rst1!数量 = rst1!数量 + 1
rst1.Update
End If
rst1.MoveNext
Loop
'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing
End Sub
プロシージャ解説
まず、レコードセットとして定義したrst1に今回の対象テーブルである「売上テーブル」を割り当てます。
'レコードセットを取得
rst1.Open "売上テーブル", cnn, adOpenKeyset, adLockOptimistic
その後、ループ処理を使ってrst1(売上テーブル)の全レコードに対して商品IDが1かどうかのチェックを行っていきます。
Do Until rst1.EOF
If rst1!商品ID = 1 Then
商品IDが1だった場合に、そのレコードの数量を+1する、という処理内容が以下です。
最後にrst1.Updateを記述しないとレコードの更新がされませのでご注意ください。
rst1!数量 = rst1!数量 + 1
rst1.Update
1レコード分の処理が終わったら、次のレコードに進んでループで処理を繰り返します。
rst1がEOF(テーブルの最後のレコードより後)にたどり着くとループを脱出して処理を終了します。
rst1.MoveNext
Loop
最後にADOのクローズ処理をしています。
'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing
これで、VBAでのレコード更新を行うプロシージャが完成しました。
If文での条件式と、更新内容を変更すれば様々な場面で利用できると思います。
クエリによるレコード更新との違い
VBAでこんなプロシージャを書かくなくても、ACCESSには更新クエリがあるので、そちらでレコード更新をすればよいのでは?と思う方もいらっしゃるでしょう。
その通り、更新クエリでもレコードの更新が可能です。
例えば今回でいえば、売上更新クエリというクエリをあらかじめ作成して起き、VBAで以下の記述をすればVBAからクエリを実行可能です。
DoCmd.OpenQuery "売上更新クエリ"
VBAでのクエリ実行方法については以下の記事もご覧ください。
しかし、クエリではできず、VBAでのみ行える処理があります。
それは、条件に応じてレコードの更新する値を変更することです。
例えば今回の例では、商品IDが1のときに数量を+1しましたが、さらに商品IDが2のときは数量を+2、商品IDが3のときは数量を+3するなど、条件に応じて更新値を変えることは一つのクエリではできません。
こうした場合は、VBAでIf文を使って更新を行う方が便利でしょう。
以上、レコードを更新する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。