ACCESS VBA ADOでUpdateをする際の2つの記述方法
ACCESS VBAでテーブルのレコードを更新する際に利用するのがUpdateメソッドです。
広く言えばレコードの追加をする際にも利用しますので、比較的良く使うメソッドでしょう。
このUpdateメソッド、記述方法が2つあります。
今回は、ACCESSのADOでUpdateをする際の2つの記述方法の違いをご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
Updateの2種類の記述方法
ADOのUpdate、つまりレコードを更新する処理には、以下の2種類の記述方法があります。
最後にまとめて更新する記述方法
レコードセット名!フィールド名 = 値
レコードセット名.Update
一行ずつ更新する記述方法
レコードセット名.Update フィールド名 , 値
どちらでも得られる結果は同じです。
私は感覚的に最後にまとめて更新する記述方法の方がわかりやすいのでいつもこちらで記述しています。
この場合、最後のUpdateを書き忘れやすいので注意しましょう。
また、最後にまとめて更新する記述方法の場合は、途中で特定のフィールドだけIf文を使って条件分岐をさせると更新がうまくできないことがあります。
条件が複雑な場合は一行ずつ更新する記述方法を採用したほうが無難でしょう。
一行ずつ更新する記述の場合は、テーブルの更新処理を一行ずつ行うのだと思うので、こちらのほうが処理が遅くなりそうな印象がありますが、ACCESSのレコード数レベルではそれほど体感で速度の差を感じたことはありません。
Updateの記述例
それでは、実際のプロシージャでUpdateの記述方法を説明します。
以下のプロシージャはtest商品テーブルの削除フラグをTrueに変更する処理をしています。
Public Sub shohin_delete()
'変数の宣言
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 "test_商品", cnn, adOpenKeyset, adLockOptimistic
If rst1.RecordCount = 0 Then
'対象レコードが無ければ処理終了
Exit Sub
End If
rst1.MoveFirst
Do Until rst1.EOF
rst1!削除 = True
rst1.Update
rst1.MoveNext
Loop
'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing
MsgBox "処理終了"
End Sub
レコードの更新を行っている部分だけを取り出してみましょう。
rst1!削除 = True
rst1.Update
ですね。
こちらでは、最後にまとめて更新する記述方法をとっています。
これを、1行ずつ更新する記述方法に書き換えると以下になります。
rst1.Update "削除", True
一行で収まりますので、更新するフィールドが1つだけの場合は、こちらを使ったほうがわかりやすく、Updateの記載漏れも防げるでしょう。
以上、ADOでUpdateをする際の2つの記述方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。