Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2021)
エラー3211 現在他のユーザーまたはプロセスで使用されているので、ロックできませんでした。
投稿日時: 23/07/23 16:20:31
投稿者: ぬー

はじめまして、Accessでデータ入力・検索フォームを作ろうと勉強し始めた初心者です。
 
2つのテーブルを結合して新たなテーブルを作り、検索フォームのテキストボックスやコンボボックスの入力値から新テーブルのデータを抽出しようとしているのですが、『現在他のユーザーまたはプロセスで…』のエラーがかなりの頻度でてお手上げ状態です。当然他の端末やユーザーがアクセスしていることはなく、フォームのプロパティのレコードロックやファイルのオプション詳細設定レコードロックをいじり倒しましたが全くダメでした。
何時間考えても解決しないのでどなたかご教示いただける方がいらっしゃれば助かります。
 
------------------------以下イメージ----------------------------
データの入力・検索用フォームと、そのデータを格納するmain_Data_tblと店の情報を格納するShop_tblがあります。
 
     main_Data_tbl                  Shop_tbl      
+-------+-------+-------+-----+-----+       +-------+-------+-------+   
 販売CD|販売日|店舗名|性別|年代         店舗CD|店舗名|支部名
-------------------------------------       -------------------------
 001   230722  新宿  男  20          101  新宿  東京
-------------------------------------       -------------------------
 002   230722  渋谷  女  10          102  渋谷  東京
-------------------------------------       -------------------------
 003   230723  横浜  女  20          201  横浜  神奈川
                          --------------------------
                           202  鎌倉  神奈川
  
検索フォームには『販売日』『店舗名』『性別』『年代』等のコンボボックスを配置して、AND検索でmain_Data_tblの抽出条件SQL文を作成し、結果をリストボックスに表示したりエクセル出力しています。
ここでさらに、検索フォームの検索項目に『支部名』のコンボボックスを配置して抽出しようと思い、
@ main_Data_tblとShop_tblを店舗名で内部結合した新しいテーブル(main_DataPls_tbl)を作るクエリ(Q_make_main_DataPls)を作成
A vbaで『Q_main_DataPls』を実行(DoCmd.OpenQuery "Q_make_main_dataPls")してテーブル作成
     main_DataPls_tbl       
+-------+-------+-------+-----+-----+------+   
 販売CD|販売日|店舗名|性別|年代 |支部名
--------------------------------------------
 001   230722  新宿  男  20  東京
--------------------------------------------
 002   230722  渋谷  女  10  東京
--------------------------------------------
 003   230723  横浜  女  20  神奈川
 
B 検索ボタンクリック
  フォームに入力された値から抽出SQLを実行)(SELECT * FROM 性別='女' AND 支部名='東京'など)
        抽出結果
+-------+-------+-------+-----+-----+------+   
 販売CD|販売日|店舗名|性別|年代 |支部名
--------------------------------------------
 002   230722  渋谷  女  10  東京
となるようやってみたのですが、件名のエラーが出てしまいます。エラーはDoCmd.OpenQuery "Q_make_main_dataPls"の行でおきており、必ず発生するわけではありません。
 最初の1回目の検索ではおこらず、検索条件を変更して検索すると発生します。1回検索(検索ボタンをクリック)した後、クリア処理(クリアボタンクリック)でフォームの値をリセットしてから検索すると発生しないようです。なのでDoCmd.OpenQueryDoCmd.OpenQueryの直前にクリア処理の関数を入れて試してみたのですが、変わらずエラーがでます。どなたか対処法が分かる方いらっしゃれば助言をお願いします。

回答
投稿日時: 23/07/24 10:15:44
投稿者: sk

引用:
@ main_Data_tblとShop_tblを店舗名で内部結合した
新しいテーブル(main_DataPls_tbl)を作るクエリ
(Q_make_main_DataPls)を作成

[Q_make_main_DataPls]がテーブル作成クエリであるとして、
 
引用:
A vbaで『Q_main_DataPls』を実行
(DoCmd.OpenQuery "Q_make_main_dataPls")
してテーブル作成

引用:
エラー3211 現在他のユーザーまたはプロセスで使用されているので、
ロックできませんでした。

テーブル[main_DataPls_tbl]が既に何らかの形で開かれている状況で
テーブル作成クエリ[Q_main_DataPls]を実行しようとされているから
ではないでしょうか。
 
・[main_DataPls_tbl]、または[main_DataPls_tbl]を参照するクエリが
 データシートビューまたはデザインビューで開かれている。
 
・[main_DataPls_tbl]、または[main_DataPls_tbl]を参照するクエリを
 レコードソースとする連結フォームが開かれている。
 
・[main_DataPls_tbl]、または[main_DataPls_tbl]を参照するクエリを
 値集合ソースとするコンボボックスやリストボックスが配置されている
 フォームが開かれている。
 
・[main_DataPls_tbl]、または[main_DataPls_tbl]を参照するクエリを
 レコードソースとする連結レポートが開かれている。
 
・[Q_main_DataPls]を実行しようとしている時点において、
 [main_DataPls_tbl]を参照している Recordset オブジェクトが存在する。

投稿日時: 23/07/24 20:59:25
投稿者: ぬー

sk 様
 
 さっそくの回答ありがとうございます、そしておかげさまで解決することができました!本当にありがとうございました。
 原因は
・[main_DataPls_tbl]、または[main_DataPls_tbl]を参照するクエリを値集合ソースとするコンボボックスや リストボックスが配置されているフォームが開かれている。
でした。
 使い勝手がよかったので抽出結果を
   リストボックス.Rowsource="SELECT * FROM main_DataPls_tbl WHERE 検索条件"
でフォーム上のリストボックスに表示させていました。
 大まかには
  @ 検索ボタンクリック
      ↓
  A main_DataPls_tblテーブル作成クエリ(Q_make_main_DataPls)の実行
      ↓
  B main_DataPls_tblテーブル作成
      ↓
  C フォームの入力値から検索用SQL(SELECT * FROM main_DataPls_tbl WHERE 検索条件)の作成
      ↓
  D リストボックス.Rowsource="SELECT * FROM main_DataPls_tbl WHERE 検索条件"の実行
      ↓
  E リストボックスに検索結果を表示
の流れだったのですが、Eから@を繰り返すとエラーとなっていました。
 A〜Eを一つのsub関数に収めて実行していて、End subに到達した時点(リストボックスに検索結果が表示された時点)でテーブルとの参照は途絶えるものと勝手に思い込んでいました。非連結のテキストボックスと同じく考えていました。
 回避策として@とAの間にリストの参照元をリセットしようと
   リストボックス.Rowsource=""
を入れたところエラーは出なくなりました。
 これはフォーム内の入力値をクリアするクリアボタンの処理の最終行に入れていたので、クリアボタンを押した後はエラーが出ていなかったようです。(昨日はクリア処理をコピーしてEの後に張り付けて回避しようとしたのですが、一番肝心なこの行だけコピーし忘れていました…_| ̄|○)
 
 原因と解決方法が分かり1日で解決し、大変助かりました、本当にありがとうございます。
 
 最後に、今回のようにテーブルを参照する集合値ソースをもつリストボックスやコンボボックスの参照を解除するには、通常どのような方法がありますでしょうか。↑のようなやり方で問題ないでしょうか?もし適切な方法をご存じでアドバイスいただければ幸いです。