Access (VBA)

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

 
(Windows 10 Pro : Access 2016)
複数(2つ)起動中のaccessの操作の件
投稿日時: 21/06/16 16:19:32
投稿者: アロハ

お世話になります。
 
管理システム.accdbの画面に環境設定するボタンがあります。
そのボタンを押すと、環境設定.accdbが起動します。
 
環境設定.accdbでは、管理システム.accdbで使用する設定値をテーブル管理していて、それぞれフォームから追加更新削除する仕組みになっております。
 
困っているのは、環境設定.accdbで設定した値は、リンクテーブルで参照している管理システム.accdbの画面にそのまま表示するリストボックスがあり、変更後の値をリストボックスに表示したいのですが、別々のaccessなので、リクエリをすることができずに変更前の値のまま表示されてしまいます。
 
参照設定で、管理システム.accdbを読み込みリクエリするコードを標準モジュールに書き込み、そのモジュールをcallなどしてみましたが、管理システム.accdbがもう1つ起動してしまい、やりたい結果になりませんでした。
 
何かいい方法はないでしょうか。何卒ご指導の程、よろしくお願いします。

回答
投稿日時: 21/06/17 08:49:44
投稿者: Suzu

引用:
変更後の値をリストボックスに表示したいのですが、別々のaccessなので、リクエリをすることができずに変更前の値のまま表示されてしまいます。

 
手元にAccessが無いので詳細を確認できないのですが、
コントロールソースとしては、リンクテーブルなのですよね?
 
であれば、そのコントロールに対しリクエリを発行すれば良いと思うのですが。
フォームに対しリクエリでも良いでしょうし。
 
最終手段とすれば、リンクテーブルとの接続を切断し、再接続すればどうですか?
その場合は、リストボックスのコントロールソースに空白文字列を渡し、
リンクテーブルを使用していない状態にしてから、再接続を行います。

回答
投稿日時: 21/06/17 11:00:51
投稿者: sk

引用:
困っているのは、環境設定.accdbで設定した値は、リンクテーブルで参照している
管理システム.accdbの画面にそのまま表示するリストボックスがあり、
変更後の値をリストボックスに表示したいのですが、別々のaccessなので
リクエリをすることができずに変更前の値のまま表示されてしまいます。

実行中の Access アプリケーションのインスタンス側のコードによって
別の Access アプリケーションのインスタンス側で開かれている
フォームを操作したいのであれば、基本的には GetObject メソッドによって
そのインスタンス( Access.Application オブジェクト)の参照を取得した上、
操作対象となる Form オブジェクト(のコントロール)に対する命令を
実行なさればよろしいでしょう。
 
引用:
管理システム.accdbの画面に環境設定するボタンがあります。
そのボタンを押すと、環境設定.accdbが起動します。

引用:
リンクテーブルで参照している管理システム.accdbの画面に
そのまま表示するリストボックス

但し、これらのコントロールが 1 つのフォーム上に配置されており、
かつその時点において[管理システム.accdb]側のインスタンス上で
開かれているフォームがそのフォームだけである場合ならよいですが、
 
・リンクテーブルをレコードソースとする連結フォーム
 
・リンクテーブルを値集合ソースとするリストボックス/コンボボックスが
 配置されているフォーム
 
・リンクテーブルを定義域とする定義域集計関数( DLookup, DSum, DCount など)を
 呼び出している演算コントロールが配置されているフォーム
 
のいずれかに該当するフォームが 2 つ以上同時開かれている場合は
多少面倒なことになるでしょう。

投稿日時: 21/06/23 10:31:21
投稿者: アロハ

sk様
 
いつもありがとうございます。
 

sk さんの引用:
引用:
困っているのは、環境設定.accdbで設定した値は、リンクテーブルで参照している
管理システム.accdbの画面にそのまま表示するリストボックスがあり、
変更後の値をリストボックスに表示したいのですが、別々のaccessなので
リクエリをすることができずに変更前の値のまま表示されてしまいます。

実行中の Access アプリケーションのインスタンス側のコードによって
別の Access アプリケーションのインスタンス側で開かれている
フォームを操作したいのであれば、基本的には GetObject メソッドによって
そのインスタンス( Access.Application オブジェクト)の参照を取得した上、
操作対象となる Form オブジェクト(のコントロール)に対する命令を
実行なさればよろしいでしょう。

 
GetObject メソッドで、オブジェクトをSetして目的のフォーム.コントロール.Requeryでできました。
 
どうもありがとうございました。