Accessの更新クエリについてお探しですね。
日常の業務で数千、数万件といった大量のAccessデータを扱う際、ひとつひとつのレコードを手作業で修正していては膨大な時間がかかってしまいます。
そのような場面で強力な武器となるのが、条件に合致するデータを一括で書き換えることができる「アクションクエリ」です。
しかし、便利な反面、一度実行すると「元に戻せない」というリスクや、設定次第では処理に時間がかかりすぎてAccessが応答なしになってしまうといったトラブルもつきものです。
この記事では、更新・追加・削除クエリの基本的な作り方から、大量データを扱う際に知っておくべき高速化のポイント、そして安全に実行するための注意点を詳しく解説します。
広告
まずは基本から!3つのアクションクエリの役割と安全な作り方
Accessでデータを自動的に操作するときに活躍するのが、「更新クエリ」「追加クエリ」「削除クエリ」の3種類です。
これらをまとめて「アクションクエリ」と呼びます。
普通の選択クエリがデータを表示するだけなのに対して、アクションクエリはテーブルの中身を実際に変更する力を持っています。
更新クエリは、条件に合うデータの値をまとめて変える時に使います。
たとえば商品の値段を一斉に改定したり、部署名を変更したりする場面で便利です。
追加クエリは、他のテーブルや外部データから必要なレコードだけを取り出して、既存のテーブルに追加する時に使います。
削除クエリは、古くなったログデータなどをまとめて消したい時に威力を発揮します。
これらのクエリを作る時、いきなりアクションクエリとして作り始めるのはちょっと危険です。
まずは普通の「選択クエリ」として条件を設定して、抽出されるデータが思った通りかどうかをしっかり確認しましょう。
これがミスを防ぐための基本中の基本です。
デザインビューでクエリを作る具体的な流れはこんな感じです。
まず、変更したいテーブルを追加して、対象となるフィールドをグリッドに並べます。
この時点ではまだ選択クエリなので、「抽出条件」の欄に条件を入力して、データシートビューに切り替えてみてください。
ここで、対象のレコードが正しく選ばれているかをしっかりチェックします。
「よし、これで大丈夫!」と確認できたら、リボンメニューの「クエリの種類」から「更新」「追加」「削除」のどれかを選んで、必要な設定(更新後の値や追加先のフィールドなど)を入力します。
このように、「対象データの確認」と「実行処理の設定」を分けて考えることで、間違って関係ないデータを書き換えてしまうリスクをぐっと減らせます。
特に最初のうちは、この「確認してから変換」という手順を必ず守るようにしましょう。
「処理が終わらない!」を解決する高速化のコツ
数万件を超えるような大量データをアクションクエリで処理しようとすると、プログレスバーが止まったように見えたり、Accessが「応答なし」になってしまったりすることがあります。
これ、本当に困りますよね。
この処理が遅くなる一番の原因は、テーブルに「インデックス」が設定されていないことです。
インデックスって何?と思うかもしれませんが、本の索引みたいなものだと考えてください。
これがないと、Accessはすべてのデータを1件ずつチェックしなければならず、めちゃくちゃ時間がかかってしまいます。
特に、クエリで結合しているフィールドや、抽出条件によく使うフィールドには、テーブルのデザイン画面で「インデックス:はい(重複あり)」を設定しておきましょう。
これだけで、数十分かかっていた処理が数秒で終わることもあるんです。
驚きですよね。
ただし注意点もあります。
部分一致検索(Like “*…”みたいなやつ)を使いまくっている場合は、インデックスの効果があまり出ません。
できるだけ完全一致や前方一致で条件を指定できるように工夫すると、さらに速くなります。
それから、Accessファイルを社内のファイルサーバーに置いて共有している場合も要注意です。
ネットワーク越しにアクションクエリを実行すると、すごく重くなります。
Accessは処理のたびに大量のデータをネットワーク経由でやり取りするので、通信が混雑して遅くなるだけじゃなく、最悪の場合ファイルが壊れることもあります。
大量データを更新したり削除したりする時は、サーバー上のファイルを直接いじるんじゃなくて、一度自分のパソコン(ローカル環境)にコピーしてから作業して、終わったらサーバーに戻すようにしましょう。
あと、複雑なサブクエリや何段階にも重なったクエリも処理を重くする原因です。
そういう時は、一度「テーブル作成クエリ」で中間データを一時的なテーブルとして保存して、そのシンプルなテーブルに対して更新処理を行うという手順に分けると、ずっと安定して動くようになります。
実行前に知っておきたいリスクと警告メッセージの扱い方
アクションクエリを使う時に一番気をつけなきゃいけないのは、Excelの「元に戻す(Ctrl+Z)」みたいな機能がAccessには効かないってことです。
一度クエリを実行してデータが書き換わったり消えたりしてしまったら、特別な仕組みを組み込んでいない限り、もう元には戻せません。
だから、大規模な更新や削除をする前には、必ずデータベースファイルのバックアップを取る習慣をつけましょう。
ファイルをコピーしておくだけでも十分な保険になります。
万が一クエリの条件設定を間違えて全データを消してしまっても、バックアップさえあればすぐに復旧できます。
仕事で使う場合は、このバックアップ作業を当たり前の手順として組み込んでおくと、担当者も安心して作業できますよね。
それから、アクションクエリを実行すると、普通は「〇件のレコードが更新されます」みたいな警告メッセージが出てきます。
手動で実行する分には確認になっていいんですが、マクロやVBAで自動化している場合は、このメッセージが出るたびに処理が止まって、「はい」をクリックしないと先に進まないのでちょっと面倒です。
こういう時は、VBAで `DoCmd.SetWarnings False` という命令を書いて一時的に警告をオフにして、処理が終わったら `DoCmd.SetWarnings True` で元に戻すという方法があります。
ただし、警告をオフにするってことは、エラーが起きても気づきにくくなるってことでもあります。
だから、警告を消す場合は、事前にクエリがちゃんと動くことを十分にテストして、想定外のデータ変更が起きないことを確かめてから使うようにしましょう。
安全性をさらに高めるなら、処理の前後でデータの件数をチェックするロジックを組み込むのもいい方法です。
VBAでもっと効率化!SQL実行による自動化テクニック
Accessの操作に慣れてきて、もっと高度な自動化や高速化をしたいなら、VBA(Visual Basic for Applications)を使ったSQLの実行に挑戦してみましょう。
VBAを使えば、ボタンひとつで複雑なデータ処理をまとめて実行できるようになります。
ここで注意したいのが処理の書き方です。
VBAでデータを処理する時、レコードを1件ずつ読み込んでループで書き換える方法もあるんですが、これは大量データに対してはものすごく遅いです。
それに対して、更新クエリや削除クエリと同じ内容をSQL文として書いて、`CurrentDb.Execute` みたいなメソッドでデータベースエンジンに直接命令を送る方法は、圧倒的に速く動きます。
この方法なら、数万件のデータでも一瞬で処理が終わることが多いんです。
さらに、VBAを使うと、クエリデザインだけでは難しい「トランザクション処理」も実装できます。
トランザクション処理っていうのは、複数の更新処理をひとまとめにして扱って、すべての処理が成功した場合だけ変更を確定して、途中でエラーが出たらすべての変更を取り消す(ロールバックする)という機能です。
たとえば、「在庫を減らす処理」と「売上を立てる処理」がセットになっている場合、片方だけ成功して片方が失敗するとデータがおかしくなっちゃいますよね。
でもトランザクションを使えば、こういう矛盾を防げます。
VBAでの実行方法は大きく分けて3つあります:
* **DoCmd.OpenQueryを使う方法:** 既存のクエリを呼び出すだけの簡単な方法。
ただし警告メッセージの制御が必要です。
* **SQLを直接実行する方法(DAOのExecuteメソッド):** 高速で警告メッセージも出ません。
ただしSQL文の知識が必要です。
* **トランザクションを使う方法(BeginTrans / CommitTrans):** データの整合性を保つための高度な安全策です。
こんな感じで、VBAとSQLを組み合わせると、Access単体では難しい「高速で安全、しかも確実」なデータ処理システムが作れるようになります。
最初は既存のアクションクエリをVBAから呼び出すところから始めて、少しずつSQLの直接記述にステップアップしていくといいですよ。
焦らず一歩ずつ進んでいきましょう!
広告
