プロが教えるわが家の防犯対策術!

VBA初心者の平貝と申します。どうぞよろしくお願いします。

Accessで複数のクエリーが開いてあるときに、それらを一度に閉じるボタンをフォームに配置したいと考えています。
素人考えではありますが以下の手順が必要であり、準じたコードを書かないといけないと思っています。

スタート
1) 現在開いている複数のクエリーのオブジェクト名を取得する
2) 開いている任意のクエリー数分のループを組む
3) Docmd.Close にオブジェクト名を引数として渡しクエリーを一つ一つとじらせる
4) 全てのクエリーが閉じたら終了
終了

条件 
A) 開いてあるクエリーの数は任意
B) 閉じるボタンのあるフォームは閉じない

いろいろ調べましたが最初の 1) 現在開いている複数のクエリーのオブジェクト名の確認の仕方、でつまづき先に進んでいません。。
どなたか、このようなサンプルコードをご存知の方は紹介ください。

A 回答 (2件)

こんにちは



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

> 現在開いている複数のクエリーのオブジェクト名の確認の仕方



現在開いているデータベース内のクエリの一覧(開いているかどうかは
不問)は、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
    • good
    • 0
この回答へのお礼

動きました!それに予想より早い。

詳細はちょっとわからないところがありましたので、コードをそのまま流用させていただきました。
特に問題なく一発で意図どおりに動き感動しました。

つたない説明から状況を理解いただき、またそれに対して適切なソリューションを頂けたことに深く感謝・感激いたします。おそらく自力でここまでたどり着くのには数十時間もの調査と学習が必要だっと思います。

ありがとうございました。平貝

お礼日時:2010/04/22 15:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!