更新クエリでACCESフォームのチェックボックスOFF高速化
最近、PPや車の話題ばかりでホントに仕事してんの?って感じなんで、ちょっとお仕事のお話しを。。w
以前、ACCESS2007のフォームでサブフォームに抽出したデータの中からチェックボックスにチェックした行だけを印刷(プレビュー表示)し、その後チェックを自動的にOFFにするVBAを作ったんですが、、
サブフォームに抽出されたデータ数が多いと、チェックオフに異常に時間がかかるので何とかして!って頼まれました。
実際、サブフォームに抽出された行数を算出し、チェックの有無にかかわらず1行目から最終行までチェックオフを繰り返すVBAのため、データ量が数百行とかになるとチェックオフにかなり時間がかかります。
ならもっと条件を絞り込んでから抽出すればイイじゃん!
・・・って訳にもいかないようで。。w
そこで、VBAでチェックオフするのではなく、更新クエリを使ってみることにしました。
サブフォームのソースになっているテーブルから印刷チェックカラムが-1(チェックオン)のものを抽出して-1を0(チェックオフ)に更新するクエリです。
SQLだとこんな感じ。
UPDATE (テーブル名) SET (テーブル名).(印刷チェックカラム名) = 0
WHERE ((((テーブル名).(印刷チェックカラム名))=-1));
これを適当な名前で保存して、あとはフォームの印刷ボタンのイベントにVBAで以下を指定するだけです。
Dim stDocName As String
stDocName = “(レポート名)”
DoCmd.OpenReport stDocName, acPreview
DoCmd.SetWarnings False
DoCmd.OpenQuery “(更新クエリ名)”
Me!(サブフォーム名).Requery
DoCmd.SetWarnings True
・1~3行目:レポートを指定してプレビュー表示させます。
(レポートのソースクエリで印刷チェックオンのデータのみ出力に設定)
・4行目:「SetWarning False」で更新クエリ実行時の余計な警告が出ないように警告設定をオフにします。
・5行目:更新クエリを実行。
・6行目:サブフォームをリクエリして更新クエリの実行結果をフォームに反映させます。
・7行目:「SetWarning True」で警告設定を元に戻します。
この更新クエリを使ってみたら、チェックオフの処理が劇的に速くなりました。
抽出されたデータが数百行あっても数秒でチェックオフになります。
フォーム上のデータをVBAで直接更新するより、クエリで更新する方がはるかに速いんですね。
また一つ勉強になりました。