🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

3回答

17468閲覧

フォームが他のフォームの裏に隠れてしまう

hfnkmr

総合スコア5

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/12/12 08:42

編集2019/12/20 00:25

生じている問題

重い検索を行った際、検索結果を表示するフォームが他のフォームの裏に隠れてしまいます。
また、必ず発生するわけではなく同じ検索条件でも発生する場合としない場合があります。

検索結果が他のフォームの裏に隠れた際は、Accessのタイトルバーをクリックすることで
検索結果が前面に戻ってくるのですが、できれば回避したいと考えています。

###実現したいこと

必ず検索結果のフォームが最前面に表示されるようにしたいと考えています。

環境

Windows10 Pro
Access2019
検索結果を呼び出すコード:DoCmd.OpenForm "フォーム名"

検索結果を表示する画面のプロパティ

ポップアップ:はい
作業ウィンドウ固定:はい
境界線スタイル:サイズ調整可

試したこと

・境界線スタイルプロパティをダイアログに変更
・DoCmd.OpenFormでacDialogを指定(DoCmd.OpenForm "フォーム名", WindowMode:=acDialog)
・SetWindowPosを利用して検索結果のフォームを最前面に表示

追記(2019/12/13)

重い検索を行いある程度時間が経過(5秒以上?)した状態で、表示されている他のフォームをクリックするとAccessが(応答なし)の状態になり、そのまま検索完了を待っていると必ず他のフォームの背面に隠れてしまうことがわかりました。

また、検索中にAccessとは関係のない他の画面を表示していると背面に隠れることもわかりました。(こちらは必ずではありません)

何もクリックしていない場合も裏に隠れることがあるので役に立つかはわかりませんが、参考までに追記しておきます。

投稿時には記述しておりませんでしたが、画面に表示されているフォームは以下のようになっています。
・検索結果
・検索条件の指示画面
・指示画面を呼び出すフォーム

追記(2019/12/20)

本件では構造的な見直しを行い、処理速度を上げることでできるだけ応答なしにならないようようにするという対策を取ることにしました。
しかし、問題の根本的な解決には至っていないため、解答の募集は続けさせていただきます。
引き続き、何か原因がわかる方がおりましたよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2019/12/12 10:16

「検索結果を表示するフォーム」を呼び出すコードを提示してください。
hfnkmr

2019/12/12 23:45 編集

ご連絡ありがとうございます。 「検索結果を表示するフォーム」を呼び出すコードについてですが、基本的には以下のようなコードで呼び出しております。 DoCmd.OpenForm "フォーム名" また、acDialogを指定した際には以下のようなコードで呼び出しました。 DoCmd.OpenForm "フォーム名", WindowMode:=acDialog
hatena19

2019/12/13 00:26

その1行のコードだけで裏にかくれたりしませんよね。 どのイベントで呼び出しているかわかるようにSubからEnd Subまですべて提示してください。
hfnkmr

2019/12/13 00:40

コードの詳細まで記載することはできませんが、処理としては検索条件を入力するテキストボックスがNULLかどうかを確認し、NULLでなければ条件式を文字列に追加するという処理を行っています。 文字列は共有変数として定義しています。 private sub 呼び出すイベント if not isnull([テキストボックス]) then str = 条件式 end if docmd.openform "フォーム名" end sub
guest

回答3

0

この方法はいかがでしょうか。
「DoCmd.OpenForm」で開いたフォームのForm.Loadイベントの最後に下記2行を追記
DoEvents
Me.SetFocus

同様の事象が発生した際、上記の方法で改善が見られました。
事象を再現させる環境が残っていましたら試していただければと思います。
(こちらでも再現されなくなったというレベルなので、この方法で解決した事例が増えると助かります)

どうも(応答なし)の間にクリックされたイベントが、フォームを開いた後に処理されてフォーカスがずれているように見えます。
なので、DoEvents でクリックを消化してから SetFocus してやれば目的のフォームが前面に表示されるようです。

注意して頂きたいのは DoEvents は入力も受け付けるため、本来は背面に隠れて操作できない別フォームのイベントが実行されてしまう危険性があります。
(反応なしの間に同じボタンを何度もクリックされてしまい、DoEventsでボタン押下処理が実行されてしまうなど)

投稿2021/02/10 05:56

makoto_h

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hfnkmr

2021/02/10 06:20

ご回答いただきありがとうございます。 現在、私が本件の担当から外れているため個人的にAccessを利用する環境がなく、ご教授いただいた方法を確認することが出来ません。 内容に関しては現担当に共有させていただきますので、何か進展等ありましたらこちらでもご報告させていただきます。
guest

0

以下参考。
[複数コアの CPU 環境で実行中の Access が応答なしになる](複数コアの CPU 環境で実行中の Access が応答なしになる)

後は高速化によって応答なし時間を少なくする事ですね。
SQLServerとAccessの組み合わせなら、基本パススルークエリでの問い合わせになるようにするのが吉ですね。

その他諸々について、以下参考。
SQL ​​Server(Q) を介して、Access を旅する

投稿2020/01/17 04:32

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こちらで再現できる情報の提供は難しそうなので、とりあえず思いついた点だけ指摘しておきます。

重い検索を行いある程度時間が経過(5秒以上?)した状態で、表示されている他のフォームをクリックするとAccessが(応答なし)の状態になり、そのまま検索完了を待っていると必ず他のフォームの背面に隠れてしまうことがわかりました。

その思い検索が、ループ処理ならループの中に DoEvents を入れると、応答なしは防げると思います。毎回入れると重くなる場合は、何回おきに実行するようにするといいでしょう。

VBA DoEvents 関数

それぞれのフォームを WindowMode:=acDialog で呼び出せば,通常は別のフォームの裏に隠れるのは考えにくいですが、もしそういうことがあるなら、acDialog でよびだすとき他のフォームの可視をいいえにして非表示にするというのも一つの手かも知れません。

投稿2019/12/13 01:07

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hfnkmr

2019/12/13 01:48

回答ありがとうございます。 >その思い検索が、ループ処理ならループの中に DoEvents を入れると、応答なしは防げると思います。毎回入れると重くなる場合は、何回おきに実行するようにするといいでしょう。 呼び出される側のフォームではOpenイベントでADOを利用してSQL Serverから検索結果のレコードセットを受け取り、それをフォームのレコードセットにする処理にしており、ここで時間がかかっているような形です。 そのため、DoEventsを利用するのは難しそうです。 一度フォームをOpenしてしまい、Timerイベントで画面を表示するという処理も試してみましたが、こちらもダメでした。 この感じを見るとフォームを開くときに発生する問題というよりも、応答なしになってしまった場合に発生するようです。 >acDialog でよびだすとき他のフォームの可視をいいえにして非表示にするというのも一つの手かも知れません。 現行システムの表示との兼ね合いもあり、できる限り非表示にしない方向でと考えています。 ただ、どうにもならないようであればhatena19様の仰るように非表示にしてしまうのも一つの手として、提案してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問