Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Access 2016)
リンクテーブルに切り替えたら「この操作はこのタイプのオブジェクトには実行できません」エラー
投稿日時: 21/08/12 17:51:12
投稿者: shoen

かなり以前にこちらでお世話になりました。
久しぶりの質問となります。
 
以前何度もこちらで質問しながらAccessVBAでシステムを組み現在も使っておりますが
最近、複数端末で同時に起動した際、とてつもなく動作が遅くなってきました。
これまで1秒以内にできた作業が数十秒〜数分かかったりするレベルです。
 
これをなんとかするべく、テーブルだけのmdbファイルと
各端末から操作する用のmdbファイルに分けようと思い立ち..
元のmdbファイルを端末にコピーし、端末用mdbのテーブル群を全て削除した上で
リンクテーブルの形で同名のテーブルを作成しました。
 
その上で、動作確認をしようとVBAを走らせてみたところ
いきなり「実行時エラー'3251':この操作は、このタイプのオブジェクトには実行できません」との
エラーが発生し、デバッグを押すと下記の場所で止まっていました。
 

Public Function GetSubID(strUkeNo As String) As Long
'受付番号(UkeID)から件名通番(SubID)を取得する関数 20040310
  Dim DB As DAO.Database
  Dim rsSub As DAO.Recordset
   
  Set DB = CurrentDb
  Set rsSub = DB.OpenRecordset("tblSubject")
   
  With rsSub
    .Index = "UkeNo"                       ←停止位置
    .Seek "=", Format(strUkeNo, "000000")
     
    GetSubID = ![SubID]
  End With
   
  rsSub.Close
  DB.Close
   
  Set rsSub = Nothing
End Function

 
2004年から安定して動いていた関数ですのでシンタックスエラー的なものではないと思います。
これは..リンクテーブルでは行えない操作なのでしょうか?

回答
投稿日時: 21/08/12 22:50:56
投稿者: よろずや

>これは..リンクテーブルでは行えない操作なのでしょうか?
はい、リンクテーブルではできません。
 
Set DB = CurrentDb

Set DB = DBEngine(0).OpenDatabase("テーブルを保存しているファイル")
 
として、対象のデータベースを直接開けば可能です。

投稿日時: 21/08/13 11:36:14
投稿者: shoen

よろずや さんの引用:
>これは..リンクテーブルでは行えない操作なのでしょうか?
はい、リンクテーブルではできません。
 
Set DB = CurrentDb

Set DB = DBEngine(0).OpenDatabase("テーブルを保存しているファイル")
 
として、対象のデータベースを直接開けば可能です。

 
アドバイスありがとうございます!
ああああああ、なるほど。
リンクテーブルでは操作に制限があるって事なんですね。
 
VBA内にたぶん数百は該当箇所がありそう..だけどイッキに置換しちゃえばいいのかも。
 
って事は、リンクテーブルを作成する必要はなかった?
今回、複数起動時の動作スピード減対策でやろうとしていますが
この方法で解決or状況改善は見込めるものなんでしょうか。

回答
投稿日時: 21/08/13 22:42:46
投稿者: よろずや

shoen さんの引用:

今回、複数起動時の動作スピード減対策でやろうとしていますが
この方法で解決or状況改善は見込めるものなんでしょうか。

SQLServer 等の本物のデータベースをちゃんとしたサーバーで動かさないと...

回答
投稿日時: 21/08/18 10:11:35
投稿者: Suzu

Access をファイル共有し、そのファイル内のテーブルに対しリンクテーブルを設定している状態ですよね。
 
 
その場合、
1. クライアント側にて SQLを実行
2. リンクテーブル先のデータを クライアント側で(全レコード)取得
3. 取得した全レコードに対し、SQLに該当するデータをクライアント側にて抽出
4. 表示
 
となり、
・ネットワーク上では、全レコードのデータの通信が行われます。
・全レコード を取得する為に、共有されたファイルに対し アクセスされる事になります。
 
これらは、共有している ユーザー数分 行われます。
 この同時 ユーザー数が増えると階乗的に速度が低下します。
 
不必要なデータがネットワークを流れると共に、
 ファイルアクセスの為の待ち時間多くが発生する事になります。
 
 
 
対し、SQLサーバー等に対し、リンクテーブルではなく、サーバー側 にて SQL を解析取得し
 SQLに該当したレコードのみを クライアントに返す 手法を採ることが可能です。
 
この場合は、SQLサーバーが、投げられたSQLに対し、その結果を返しますから
・ネットワークを流れる通信量が減る
・ファイル共有ではなく、SQLサーバーが レコードにアクセスするので
 ファイル全部のデータを読む必要がない
 
上記から Accessファイルを共有するよりも高速に動作します。
 
 
仕組みとしては、ファイル共有ですので、アクセスするデータを減らせば処理速度は高速化します。
つまり、テーブル上、アクセスしないデータ(ある特定以前のデータ)をバックアップ後、消し
最適化すれば、高速化は可能です。

トピックに返信