● Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~最重要項目の1つ~:★ ダミーテーブルの連結フォームを非表示で常時開いておく
  
  
※2018/10/10 忘れてたことを思い出したので追記
「Access2000・mdbの動作速度をネットワーク越し利用でも速くする」といっても、mdb本来の速さに戻るだけで、それ以上に速くなるわけではありません。とはいうものの、Jetエンジンは、ローカルPC内や同フロアの小さなLAN内なら「ちゃんと作れば」、SQLServer2000などよりも速いことも少なくないと思います。
といいますか、SQLServer2000自体、意外と速くないです。ストアドプロシージャ使っても、小さなLAN内ならmdbのJETエンジンのほうが速かったりします。
SQLServer2000(あるいはストアドプロシージャ)を使って速くなるのは、VPNなどを使って、離れた拠点(町とか国とか)のmdbを見に行くときなどかもしれません。
Web上や市販書籍には「SQLServer使うと速い!ストアドプロシージャ使うと速い!」という情報が多いので、メッチャ速いのかと勘違いされるかもしれませんが、実際にご自分でも動かしてみればお分かりになると思いますが、「mdbのローカルPC使用」の速さよりも速くないです。
「ネットワーク利用時の、しかも、”mdbの速度低下を招く使い方しかしてない場合(本記事のような対策をしてない場合”、よりは速い」というだけです。後方一致や部分一致ではたしか普通に遅くなったかと思いますし。

あと、リンクテーブルの速さを「(見かけ上)劇速にする=mdbの本来の速さに戻す」には、本記事のこと以外にも次のような方法があるようです。

(01)巻末にも書きましたが、AutoExecマクロで「プロシージャの実行」を使うなどして、DAO(OpenDatabase)などを使ってサーバ側のmdbを常時開いておく。閉じるときに一応Nothingする。

(02)本記事の方法を使わない場合、SQLの中で「IN ('\\ファイルサーバ名\共有フォルダ名\mdbファイル名')」という形で、UNCパスでその都度、ファイルサーバを指定する。

(01)はやったことありませんが、「JET データベースエンジン プログラマーズガイド」のP468・469にも書いてある方法です。巻末にも少し書きましたのでご参考にしてください。(ダメだったらごめんなさい。)

(02)は確か、少しやったことがあるのですが(うろ覚えですみません)・・・、
SELECT 列名 FROM テーブル名 INNER JOIN 結合フィールド名 IN ('\\ファイルサーバ名\共有フォルダ名\mdbファイル名')
・・・みたいな感じで書きます。
IN句でカッコと「'」(シングルクォーテーション)を使ってLAN上のmdbを指定します。
そうすると、本記事の「ダミーフォームの非表示」をさせなくても、結構速かったような気がします。
これはあらかじめ、そのテーブルのリンクテーブルを作る必要は無かったかと思います。(必要があったらごめんなさい!!)
ただ、これも、僕の勘違いで、(速度的に)もしダメだったらごめんなさい。

なお、本記事の方法、DAOを使う方法、では、以下のことを守らないと結局遅いままなので、以下のことも必ずチェックしてください。
・同一リンクテーブルへのUNCパスの統一(UNCパスを使っている場合のみ)

上記の(02)でも、(02)の方法とは関係のない場面で使うリンクテーブルを作ってあると、もしかしたらそうかもしれません。ご自分でもチェックしてみてください。

なんせ、全部うろ覚えのことを思い出しただけなので・・・。

  
  
=========
以下、本文です。

ファイルサーバに置いたmdbファイルのテーブルを、複数のクライアントパソコンで共有する場合のお話です。(LAN越しにmdbファイルを共有する場合です。)

ここでのお話は、次のような状況であることが前提です。

(01)Accessのmdbファイルを「データ専用」と「プログラム専用」に分けている。
(02)「プログラム専用」のmdbから、「データ専用」のmdbのテーブルを「リンクテーブル」として覗きに行っている。
(03)「データ専用」のmdbはファイルサーバに格納。
(04)「プログラム専用」のmdbは複数台のクライアントパソコンに格納。
(05)ファイルサーバの「データ専用」のmdbへは複数のクライアントが同時アクセスする
(06)リンクテーブルのパスに「UNCパス」を使っている。統一されていて正常な本来の速度が出る。

このようなときに、ファイルサーバのmdbにアクセスした際、同時接続しているクライアントが1台だけだと速度の低下が起こらないのですが、2台以上になると速度の低下が起こります。
これはOSがWindows2000以降で起こります。(うろ覚えですみませんが、Win98では起こらなかったような・・・。)

なので、それを回避するために、ファイルサーバのmdbに「ダミーテーブルをつくり、その連結フォームを、クライアントのmdb側で、"非表示で"常時開いておく」ということをします。
(この処置をすると、クライアント側のmdbを閉じる速度が少し遅くなりますが、テーブルやクエリが遅くなること・イライラに比べたら全く苦になりません。)

これは、ファイルサーバ側のmdbの数だけやります。
クライアント側の「プログラム専用」のmdbが1つであっても、その1つのmdbから、サーバ上の複数のmdbを、リンクテーブルとして覗きに行っている場合、その数だけやります。

もう少し具体的に言うと、
たとえば、 サーバ上には、「data01.mdb」と「data02.mdb」と「data03.mdb」の3つがあり、
クライアントには、「prg01.mdb」1つだけ、があったとします。

そして、クライアントの「prg01.mdb」からは、その「data01.mdb」~「data03.mdb」の、3つ全部のmdbのテーブルを、リンクテーブルとして見に行っていたとします。

その場合、クライアントの「prg01.mdb」の中には、「data01.mdb」~「data03.mdb」の、全てのmdbのダミーテーブルをソースにした「 ”非表示” の連結フォーム」を作成する、ということが必要になります。
「data01.mdb」~「data03.mdb」全部なので、3つ分必要、ということになります。
(リンクテーブル自体の数は全部で10個以上あるかもしれませんけど、それらのリンク先のmdbの数のぶん、やる、必要、ということです。)

もしこれが、クライアントの「prg01.mdb」から、「data01.mdb」と「data03.mdb」のテーブルだけを見に行っていて、「data02.mdb」のリンクテーブルが一つもない、という場合は、「data01.mdb」と「data03.mdb」のダミーテーブルだけをフォームのソースに使います。
つまり、2個作ればいい、ということになります。
  
  
では、作業の流れをご説明します。
ダミーテーブルが一つの時の作業の流れは以下の(01)~(04)のとおりです。
  
  
(01)サーバ側の「テーブル専用」のmdbに、「データが空のダミーテーブル」を作成します。
このとき、たとえば「data01.mdb」というmdbファイルにダミーテーブルを作るとするなら、その名前は、「t_data01_dummy」といった感じで付けます。
つまり、どのmdbファイルのダミーテーブルかがすぐに分かるようにします。
これは、複数のダミーテーブルがある場合に区別しやすくするためです。
現在は複数でなくても、近い将来複数に増えることもありますので…。

フィールドのデザインはなんでもいいです。2列くらい作っておけばOKです。
ただ、無用なトライブルを避けるため、一応念のために、主キーは作っておきます。
レコード自体は1つもなくてもかまいませんし、1つくらいあっても、どちらでもいいです。
  
  
(02)そしてそのダミーテーブルのリンクテーブルを「プログラム専用」のmdb、例えば「prg01.mdb」の中に作成します。
LAN越しになるので、リンクテーブルのパスにおいて、「UNCパスの統一ミスだけはしないように」ご注意ください。詳しくは以下のページもご参考にしてください。
・同一リンクテーブルへのUNCパスの統一(UNCパスを使っている場合のみ)
これはかなり重要です。
なぜなら、上記のリンクの対策をちゃんとやってないと、本記事のように「ダミーテーブルの非表示フォームを作っても」リンクテーブルの速度は速くならないからです。

  
  
(03)「prg01.mdb」の中に、更に、そのリンクテーブルをソースとした連結フォームを作成します。
これも名前がわかりやすいように、「f_t_data01_dummy」といった感じで名前を付けます。
(オートフォーム作成でOKです)
  
  
(04)「マクロ」の「autoexec」にて、前項で作成したダミーフォームを自動非表示常時オープン設定にします。
例えば、「f_t_data01_dummy」というダミーフォームを使う場合は以下のようにします。

(a)「マクロ」に「autoexec」という名前のマクロを新規作成します。
autoexecマクロは、Excelのauto_openプロシージャと同じで、ファイルが開いたと同時に自動実行する処理を設定するものです。ファイルオープンやプロシージャの呼び出し実行ができます。

(b)「autoexec」マクロをデザインモードで開き、以下のようにします。

画面上部の「アクション」にて:「フォームを開く」を選びます。
画面下部にて以下の設定にします。(設定値はすべて、ドロップダウンリストから選べます。)

フォーム名:「f_t_data01_dummy」
ビュー:「フォーム ビュー」
フィルタ名:設定なし
Where 条件式:設定なし
データモード:設定なし
ウィンドウモード:「非表示」

(c)「autoexec」マクロを上書き保存します。

以上です。

これをダミーフォーム(つまりはダミーテーブル)の数だけ、やります。

もしダミーフォームが複数ある場合は・・・、例えばダミーフォームが3つある場合なら、「autoexec」マクロの中で、3つ分を3行にわたって、設定します。

「autoexec」マクロは一つしか作成できませんので。

ひとまず、以上です。

============

上記の(01)から(04)を、クライアント側 mdbから覗きに行っているmdbファイルの数だけ、施します。

例えば「data01.mdb」と「data02.mdb」と「data03.mdb」の3つ全部のリンクテーブルがある場合は、そのすべてにダミーテーブルを1つずつ作り、それに伴ってクライアント側に3つのダミーフォームも作ります。

「data01.mdb」と「data03.mdb」のリンクテーブルだけで、「data02.mdb」のリンクテーブルは一つも無いなら、ダミーテーブルは「data01.mdb」と「data03.mdb」だけに1つずつ作り、それに伴ってクライアント側に2つのダミーフォームも作ります。

もちろん、将来的に、「data02.mdb」、あるいは、「data04.mdb」、「data05.mdb」のリンクテーブルが増えてしまったら、それら全部のダミーテーブルも作り、ダミーフォームも作ります。

  
  
繰り返しになりますが、この処置をすると、クライアント側のmdbを閉じる速度が少し遅くなります。

ダミーテーブルの数が増えれば増えるほどちょっとずつ遅くなります。
が、テーブルやクエリが遅くなること・イライラに比べたら全く苦になりません。
また、5つか7つくらいまでなら十分我慢できます、というか慣れてしまえば全く苦になりません。

是非、設定して、本来のmdbの速度を出してください。
  
  
*****************
※ 参考

ダミーフォームを作る代わりに、DAOなどでmdbを開いておいてもいいようです。
mdbを開くときや閉じるときに以下の手順でコードを実行します。

1.プログラム専用のmdbを開きます。
2.[データベース] ウィンドウの [モジュール] をクリックし、[新規作成] をクリックします。
もしくは既存のモジュールを開きます。
3.[ツール] メニューの [参照設定] をクリックします。[Microsoft DAO 3.6 Object Library] チェック ボックスがオンになっていることを確認し、[OK] をクリックします。
4.新しいモジュールか既存のモジュールに以降のコードを「Public」の行から全部コピぺ
5.mdbを開くときは、Autoexecマクロでtest0001()を実行
6.閉じるときはメインメニューか隠しフォームの閉じるときイベントでtest0002()を実行

この例では、プログラム専用のmdbから5つのmdbを覗きに行った例です。
(例えば 2つなら、全部2つ分でOKです)

ただ、これは僕もテストしてないので自己責任でお試しください。
もしかして、ダミーテーブルやダミーフォーム作るよりも速くなるといいなあ・・・

このサンプルでは5つのmdbに対して処理していますが、2つだけだったら2行分書くだけにします。
もしこれがうまくいくなら、ダミーテーブルやダミーフォームを作らなくてすむので、ラクチンにはなりますね。

でもほんとう、自己責任でお願いいたします。

  
  

※重要・関連記事

Access2000・100MbpsLAN Pentium3 の「ネットワーク越しのリンクテーブル」の開く速度が遅いときの対処法(Access2000のときからあった既知の問題)

Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~結構重要~:★ ダミーテーブルの連結フォームを非表示で常時開いておく

100MbpsLAN Pentium3 でクエリが遅い場合の対処方法(データベース自体が遅い場合にもチェックしてみます。)

Access2000・mdbファイルが壊れる場面と回避方法・解決方法

Access2000・100MbpsLANのファイルサーバに配置したmdbファイルへの同時アクセスにおいて、mdbファイル破損を激減させるサーバ側のレジストリ設定(Access2000昔からの既知の問題の解決)

Excelが遅くなる場合の対処法~Accessや他のソフトからデータを貼付けした時

  
  

[★ AccessやExcel等のVBAの独学に超重要!!] とりあえず Access2000 テキストボックスやフォーム、サブフォーム、レポート、サブレポート、その他、等々を参照したいときのコードの書き方(参照方法)と重要注意事項

Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(巷では個々の細かい用語の説明ばかりで、全体像としては、意外と短くはまとめられていないこと)

Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)

用語:VBAプログラミングでの「オブジェクト」 について

用語:VBAプログラミングでの「プロパティ」 について

用語:VBAプログラミングでの「メソッド」 について

=====================

Access2000 100MbpsLANのファイルサーバに配置したmdbファイルへの同時アクセスにおいて、mdbファイル破損を激減させるサーバ側のレジストリ設定(Access2000昔からの既知の問題の解決)

Access2000・mdbファイルが壊れる場面と回避方法・解決方法

Access2000・mdbの動作速度をネットワーク越し利用でも速くする方法~結構重要~:★ ダミーテーブルの連結フォームを非表示で常時開いておく

Access2000 100MbpsLAN Pentium3 の「ネットワーク越しのリンクテーブル」の開く速度が遅いときの対処法(Access2000のときからあった既知の問題)

>Access2000・100MbpsLAN Pentium3 でクエリが遅い場合の対処方法(データベース自体が遅い場合にもチェックしてみます。)

Excelが遅くなる場合の対処法~Accessや他のソフトからデータを貼付けした時

Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)

Access2000VBA・Excel2000VBA独学~用語:VBAプログラミングでの「オブジェクト」 について

ExcelでもAccessでも、顧客台帳(顧客マスタ)を作るときのヒント(できるだけ細かくしてしまう)