MS Access

Accessであらかじめリンクテーブルを開いておくと劇的に高速化

投稿日:2014年12月11日 更新日:

リンクテーブルに対して「Dlookupで値を探して見つかったらCurrentDb.Execute UPDATE~ で値を更新」という処理をループで回している。

この処理、一旦始めると、終えるのに30分以上かかることがある(件数は100件未満なのに)。
使っている人に、何とかして欲しい・・・と言われた。

調べてみると、コード中で単純なDlookupをしている1行だけでも、3秒ほど結果が出るのを待たされていることに気がついた。(イミディエイトウィンドウで確認)
数万件のテーブルとはいえ、参照しているだけなのにこんな時間がかかるはずがない。変だ。
で、試しにこのDlookupで参照しているテーブルをあらかじめ開いておいて、もう一度同じ処理を回してみた。

すると、100倍くらい速くなった! 数秒で終わる。

テーブルそのものでなく、そのテーブルを使っているフォームをhiddenで開いておいて、(閉じないで)そのあと見えなくしたものでも同じくらいに速くなった。

DoCmd.OpenForm “master”, , , , , acHidden
Forms!master.Visible = False

テーブルやフォームを開かず、処理の直前でレコードセットを作っても、同じくらいに速くなった(作ったrsは使わない)。

Set DB = CurrentDb
Set rs = DB.OpenRecordset(“master”)

ということは、ひょっとすると、DlookupとCurrentDb.Execute SQL といった関数やSQL文の組み合わせを使わず、rsのレコードセットを使い、素直にFindしたりUpdateするのが良いということかもしれない。(けれどそれだとコード量が増えて、見通しが悪くなるしナァ・・・)

また、Access2013よりも、Access2000と2007の方が、パフォーマンスが劇的に変わった。
こうしておくと、テーブルの内容をメモリに読み込んで処理するのかな?

これは発見!
しかしGoogleで検索しても、同じようなことを書いている人は見つけられなかった。
みんなが知らないことなの?
それとも、自分の環境だけに依存する現象?

よく分からないけど、結果オーライ。

-MS Access

執筆者:

関連記事

no image

AccessでコンボボックスのリストをVBAで行番号で選択する

こんな方法があるのは知らなかった。 メモメモ。 ‘コンボボックスの1行目を選択する ‘Forms!見積請求書F.cbo銀行振込先 = Forms!見積請求書F.cbo銀行振込先.ItemData(0) …

no image

Accessのフォーム/レポートのコントロール同士をくっつけて桝目状にしたい

レポートを、Excelのような桝目の罫線にしたい。 お客からこんなニーズが多い。 やったことがある人ならわかるけど、これが、なかなか苦労する。 レポートのデザインビューで、いざ個々にコントロールをきち …

no image

SqlServer 2008 Express R2 をインストールしようとしているのだが、最後の最後でうまくいかない

前回、試しに自分の普段のPCでSqlServer2008をインストールしたのだが、今回はサーバ(といってもXP)を対象に同様のことをしてみた。 しかしインストールの最後で「there was an e …

もう何度もAccessの集計クエリの作成をミスって怒られている

私が悪い。反省。 自戒のメモ。 Accessの集計クエリに条件を加えたい場合、その条件をどこに書くかによって結果が全く違ってくる。 それをわかってはいるのだが・・・最大やら演算やら、細かいことを同時に …

no image

Accessのパラメータは クエリのみならず、SQL文字列でも できるとは。。。

以下のリンクが参考になった。 パラメータの設定方法がわかりません。パラメータの設定を行ってい… – Yahoo!知恵袋 以下は、自分の業務で作成したコード。 Dim dbs A …