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

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

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

VBA初心者の平貝と申します。どうぞよろしくお願いします。 Accessで複数のクエリーが開いてあるときに、それらを一度に閉じるボタンをフォームに配置したいと考えています。 素人考えではありますが以下の手順が必要であり、準じたコードを書かないといけないと思っています。 スタート 1) 現在開いている複数のクエリーのオブジェクト名を取得する 2) 開いている任意のクエリー数分のループを組む 3) Docmd.Close にオブジェクト名を引数として渡しクエリーを一つ一つとじらせる 4) 全てのクエリーが閉じたら終了 終了 条件  A) 開いてあるクエリーの数は任意 B) 閉じるボタンのあるフォームは閉じない いろいろ調べましたが最初の 1) 現在開いている複数のクエリーのオブジェクト名の確認の仕方、でつまづき先に進んでいません。。 どなたか、このようなサンプルコードをご存知の方は紹介ください。

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

  • ベストアンサー
  • 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

  • access vba 引数

    ACCESS VBA 引数取得について テキストボックスが横に3つ並んでいてその3つは同じデータのレコードで、 例えば | No | Name  |    Tel    |   ボタン  | |~~1~~|~~~山~~~~|~~99-9999-9999~~| |__更新__| | |~~2~~|~~~川~~~~|~~88-8888-8888~~| |__更新__| | |~~3~~|~~~空~~~~|~~77-7777-7777~~| |__更新__| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ となっていて、ボタンを押して別のフォームを開いてデータの更新をしたいのですが、その押したレコードのNoを引数にして別のフォームを開きたいのです。どのようにコードを書いていいのか分かりません。 今のところ引数はほかにもあるのでそれは取れていて 変数名 = (引数にしたい項目1) 変数名 = 変数名 & (引数にしたい項目2) 変数名 = 変数名 & (引数にしたい項目3) DoCmd.OpenForm "フォーム名", , , , , acDialog, 変数名  (↑openArgs) までは書けています。 押したレコードのNoを引数に加えるというところがどのようにすればいいか分かりません。 教えてください。 よろしくお願いします。m(_ _)m

  • Access レイアウト変更したサブフォーム内のクエリを保存しないようにするには?

    OS:WindowsXP Access Version:Access2003 メインフォームにチェックボックスを配置、非連結のサブフォームにクエリを表示させています。 チェックボックスラベルにはクエリのフィールド名を表示させており、チェックボックスをオン/オフにすることでクエリのフィールドを表示/非表示に切り換えております。 ※切り替え方法はColumnWidthで操作しています。 ところで、表示/非表示と切り替え操作をしてメインフォームを閉じるコマンドボタンをクリックして閉じようとすると、 「”○○○(クエリ名)”のレイアウトが変更されています。保存しますか?」 という内容のメッセージが表示されてしまいます。 ここでレイアウトの変更は保存したくないのです。 そこで、私のした処置とは、 (1)メインフォームを閉じるコマンドボタンに DoCmd.Close acForm "○○○(フォーム名)" DoCmd.Close acQuery "○○○(クエリ名)",acSaveNo と記述しました。 acSaveNoのヘルプを見ると、 メッセージを表示せずに保存しないで閉じる、 とあったのですがこれでもメッセージが表示されてしまいました。 そこで、 (2) DoCmd.SetWarning False DoCmd.Close acForm "○○○(フォーム名)" DoCmd.Close acQuery "○○○(クエリ名)",acSaveNo DoCmd.SetWarninf True と記述したところ、メッセージを表示させなくすることには成功したのですが、無条件でレイアウトしたクエリが保存されてしまいました。 どのように記述すればメッセージを表示させず、かつレイアウト変更したクエリを保存せずに閉じることができますか? 初心者のため、誤字脱字があると思いますがすみません。 丁寧に教えていただければ幸いです。よろしくお願いいたします。

  • 【ACCESS】フォームのレコードソースのクエリを動的に書き直したときの、フォームの再描画

    ACCESS2002 帳票フォームのレコードソースにクエリを指定しています。 フォーム上のコマンドボタンを押したイベントで、その レコードソースとしているクエリのSQLを書き直しています。 問題は、その書き直したクエリをもとにして画面をもう一度 表示させなおしたい(リフレッシュさせたい)ということです。   docmd.close acForm,"フォーム名"   docmd.open "フォーム名" とすると、書き直したクエリの内容でフォームが表示されます。 フォームを閉じる→フォームを開くとしないで、フォームを リフレッシュさせる方法はないのでしょうか?

  • VBAについての全般的な初心者の質問です

    VBAについての疑問です、宜しくお願いします。 VBAのフォームをユーザフォームから作成しました。 ボタン、テキストボックス、コンボボックス等を貼り付けて、コードを見てみると、 ボタン、テキストボックス、コンボボックスのイベントが発生したときのみのコードしか見えません。 複数のフォーム(仮にA、B、Cとします)を作成すると各フォームの名前がオブジェクト名となって いました。 疑問点1:全体を合わせたものが、標準モジュールというものになるのでしょうか。       最初のオブジェクト作成時には、標準モジュールとユーザーモジュールのどちらを選択す       るのでしょうか。また、両者は何がどう違って、どのように使い分けるのでしょうか。       また、オブジェクト、モジュール、プロシジャとの関係はどうなのでしょうか。 疑問点2:各オブジェクト間で共通で定義されるグローバル変数、配列みたいなものは、一体、どこ       で宣言してやるのでしょうか。       単にボタンとかテキストボックスのイベント発生文前に書いてやるだけでよいのでしょう       か。       各オブジェクト間で共通で呼び出したいサブルーチン、メソッドは何処に書いてやれば       よいのでしょうか。(そのような呼び出し方が許されているという前提での質問です。) 疑問点3:フォーム自身を作成した(宣言した)文(コード)、フォームに貼り付けた、ボタン、テキスト       ボックス、コンボボックスのAdd文(コード)、また、例えば、これらを着色した文(コード)等       を見ることは出来ないのでしょうか。       フォーム自身をInitializeする必要のある場合とは、どのような場合でしょうか。       この場合は、フォーム(オブジェクト)の名前に関係なく、「Private Sub UserForm_Initialize()」でなくてはならないのでしょうか。 フォーム自身のスクロールバー等の設定は一体何処に書いてやればいいのでしょうか。 プロパティからの設定しか許されてないのでしょうか。 疑問点4:Micro Script Editorにはそれが書かれているようですが、何故かHTMLで書かれていま       す。       何故VBAで書かれていないのでしょうか。       コントロールは表示されますが、フォームを呼び出すツールとか、メニューが何処にも       見当たりません。 以上長文ですが、宜しくお願い致します。

  • コマンドボタン名を取得して変数に代入したい。

    OS:windowsXp Access Version:Xp 既出でしたらすみません。 INDEXのフォームにて複数コマンドボタンを作り、それを押すと各登録フォームや集計フォームが開くようにしています。 さて、質問なのですが、コマンドボタンで別のフォームを開く時の処理を(フォーム名が違うだけで後は同じなので)まとめて書きたいのです。 現在は次のようにやっています。 ------------------------------------------------- Private Sub F_メニュー_Click() Call close_form DoCmd.OpenForm "F_メニュー", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub F_売上伝票_Click() Call close_form DoCmd.OpenForm "F_売上伝票", acNormal, , , acFormEdit, acWindowNormal End Sub      (中略) Private Sub 事業所別集計_Click() Call close_form DoCmd.OpenForm "F_事業所別集計", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub 消費税変更_Click() Call close_form DoCmd.OpenForm "F_消費税変更", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub システム終了_Click() Call close_form DoCmd.RunCommand acCmdExit End Sub Private Sub close_form() msgbx = False DoCmd.Close acForm, "index", acSaveYes End Sub ------------------------------------------------- これを  ボタン名_Click() ではなく  frm_open() 押されたボタン名を変数に取得(ボタン名=Form名にします。) DoCmd.OpenForm 押されたボタン名変数 のように共有したいのです。 どうすれば出来ますでしょうか?ご指導よろしくお願いします。

  • 現在アクティブになっているオブジェクトを取得

    現在アクティブになっているオブジェクトを取得する方法は?アクセスです Sub マクロ() DoCmd.MoveSize 0, 0 End Sub でフォームの位置を指定できますが、 現在アクティブになって言えるオブジェクトに対して行われますよね。 例えばデータベースウインドウを選択した後に実行すれば データベースウインドウに対して行われますよね。 そこで現在アクティブなオブジェクト名を取得したいのですがそのようなコードはありますか? DoCmdをウォッチ式に追加して観察しましたが 現在アクティブなオブジェクト名は表示されませんでした。 DoCmd.SelectObjectacForm,フォーム1 でアクティブにできる事はしっています。ご回答よろしくお願いします。

  • VBAによってAccessが壊れた!

    AccessのVBAでプログラムを組んでたらあるフォームの操作処理をしたらいきなりAccessに異変が起こり、フォームのデザイン等の編集・コーディングが一切できなくなりました(VBEが開かない)。 強引にフォームを呼んでも読み取り専用になっていて操作ができなくなってしまいました。フォームを開いても実行画面しか出なくなりました。新規作成もできません。(ボタンが全てイネイブルになってます) こういう場合どうしたらいいのでしょうか? ちなみにAccessのフォームは、現在のフォームから他のフォーム(開いている)を閉じる命令をすることはできるのでしょうか?(それをしたいがためにいろいろな方法を試していたらこうなってしまいました。そのコードをうかつにも保存した私にも責任はあるのですが・・・ちなみにDocmd.closeで墓穴を掘りました。やはり自分のフォームしか消せないんでしょうか?) バージョンはAccess2003を使っています。

  • VBAのコードを書くところ(初心者)

    今仕事でExcelでVBAを使って物を作っているのですが、コードはどこに書くのが一番よいのでしょうか?。たとえば、本を見ると標準モジュールに書いていっているのですが、自分は今ユーザーフォームでコマンドボタンを作ったりコンボボックスを作って、そのボタンをクリックすると自然とPrivate sub オブジェクト名_Click()と出て、その中に書いているのですが、そうすると標準モジュールに書く必要がなくなってしまう気がするのですが・・・。なので一応標準モジュールに内容を移して、フォームのところで関数として呼び出すようにしたのですが、どのように書くのがよいのでしょう?長々すいませんわかりづらかったら後で補足します。 後、今までCを勉強していたのでオブジェクト?メソッド?プロパティ?の書き方が今ひとつ覚えづらいのは慣れでしょうか?

  • SendKeyで解決できないでしょうか?

    こんにちは。どうぞ、よろしくお願いします。 テーブル作成のクエリに関することです。 コマンドボタンのクリック時のイベントに テーブル作成クエリを指定しています。 其の場合、以下のような確認のダイアログボックスが出ますが、 これを出ないように、出来ないものでしょうか? (2つのダイアログボックス共に、"Y"を押下します。)   テーブル作成クエリを実行すると、   新しくテーブルが作成されます。   **** 件のレコードが新規テーブルにコピーされます。 -------------- クリック時のイベントに付いてですが、 SendKeyを使ってみましたが、上手く行きませんでした。 SendKeyはアクティブウィンドウについて作用するとのことなので、 フォームを閉じて…、などを考えて、次のような感じでやりました。 DoCmd.Close acForm, "フォーム名" DoCmd.DeleteObject acTable, "テーブル名" DoCmd.OpenQuery "作成クエリ", acNormal, acEdit SendKeys "y", True SendKeys "y", True DoCmd.OpenForm "フォーム名" DoCmd.DeleteObjectは、 テーブルを削除していないと上書きするかどうかを聞いてくるので、 削除しておこうと思い書きました。SendKeyでは、可能に出来ないのでしょうか? DoCmd.SetWarnings False も少し試しましたが、違うようですし。 それとも、簡単には解決できないようなことでしょうか。どうぞ、お願いします。

  • Excel2003 VBA ボタンを押したらフォームを開く

    オブジェクト名”きほん”というフォームをつくって、表示させるためのボタンを”検索”というシートに作りました。 なぜかエラーが出ます。 msgbox的なイメージで考えていたのですが、前提の定義がいるっぽいエラーメッセージが入ってます。 どうしたらいいと思いますか? (”検索”内のボタンは、ボタン441という名称です。) Sub ボタン441_Click() Docmd.OpenForm ("きほん") End Sub

専門家に質問してみよう