• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA初心者の平貝と申します。どうぞよろしくお願いします。)

Accessで複数のクエリーを一度に閉じる方法

このQ&Aのポイント
  • Accessで複数のクエリーが開いてあるときに、それらを一度に閉じる方法を紹介します。
  • 現在開いている複数のクエリーのオブジェクト名を取得し、ループを組んで一つずつ閉じます。
  • 具体的な手順やサンプルコードをご提供します。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> 現在開いている複数のクエリーのオブジェクト名の確認の仕方 現在開いているデータベース内のクエリの一覧(開いているかどうかは 不問)は、CurrentDataオブジェクトのAllQueriesコレクションで 取得できます。 これで取得した各クエリについて、IsLoadedプロパティを確認すれば、 開いているかどうかがわかります。 (データシートビューの他、デザインビューでも「開いている」扱いに  なります。なお、クエリをレコードソースとするフォームを開いている  場合は、「開いていない」扱いになるようです) ただ、AccessのDoCmdオブジェクトのCloseメソッドは、開いていない ものを閉じるように命令しても、特にエラーにはなりませんので、 わざわざIsLoadedプロパティを確認せず、全クエリを閉じる形にして しまっても問題ないかと思います。 以下は、その形でのサンプルになります: (全てのクエリが閉じられた場合は255、一部を閉じるのをキャンセルした  場合は1、何らかのエラーが発生した場合は0を、それぞれ返します) '「CloseAllQueries」という名前の関数を定義 Public Function CloseAllQueries() As Byte 'エラー発生時は「エラー処理」の行に飛ばす宣言 On Error GoTo エラー処理   '変数を宣言   Dim Rsl As Byte, Qry As AccessObject   '既定の戻り値を設定(エラー発生時は上書き更新)   Rsl = 255   '現在のデータベース(CurrentData)内の全てのクエリ   '(=AllQueries)について、ループ処理   For Each Qry In CurrentData.AllQueries     'デザインやレイアウトの変更があったら確認メッセージを     '出す場合     DoCmd.Close acQuery, Qry.Name, acSavePrompt     'メッセージを表示せずに変更を保存する場合は下記を使用     '(上の「DoCmd」の左に「'」を追加&下行の「'」を削除)     'DoCmd.Close acQuery, Qry.Name, acSaveYes   Next 終了処理:   '念のためメモリを解放   Set Qry = Nothing   '処理結果を関数の戻り値に設定して終了   CloseAllQueries = Rsl   Exit Function エラー処理:   '発生したエラーによる場合分け   Select Case Err.Number     Case 2501       'クエリの保存確認メッセージでキャンセル選択時は       '閉じなかったクエリがあることを示す値をRslに記録       Rsl = 1       '続きから処理を再開       Resume Next     Case Else       '上記以外のエラー発生時はメッセージを表示       MsgBox Err.Number & ":" & Err.Description, , "CloseAllQueries(関数)"       '変数Rslにエラーがあったことを示す値(=0)を記録       Rsl = 0   End Select   '終了処理に移動   Resume 終了処理 End Function ・・・以上です。 上記のコードを、標準モジュールに貼り付けて、適当な名前をつけて 保存して下さい。 標準モジュールは、Alt+F11などでVisual Basic Editor(VBE)画面を 開き、そこのメニューで「挿入(I)→標準モジュール(M)」などで新規 作成できます。 後は、コマンドボタンから以下のように呼び出します(このサイトの字数 制限に引っかかってしまったので、戻り値を使用しない場合を紹介(汗)): Private Sub コマンド0_Click()   Call CloseAllQueries End Sub

hiragai
質問者

お礼

動きました!それに予想より早い。 詳細はちょっとわからないところがありましたので、コードをそのまま流用させていただきました。 特に問題なく一発で意図どおりに動き感動しました。 つたない説明から状況を理解いただき、またそれに対して適切なソリューションを頂けたことに深く感謝・感激いたします。おそらく自力でここまでたどり着くのには数十時間もの調査と学習が必要だっと思います。 ありがとうございました。平貝

その他の回答 (1)

回答No.1

こんにちは クエリーだけ閉じたいのなら、オブジェクト名じゃなくタイプを渡してしまえばいいのでは?

関連するQ&A