VBA初心者の平貝と申します。どうぞよろしくお願いします。
Accessで複数のクエリーが開いてあるときに、それらを一度に閉じるボタンをフォームに配置したいと考えています。
素人考えではありますが以下の手順が必要であり、準じたコードを書かないといけないと思っています。
スタート
1) 現在開いている複数のクエリーのオブジェクト名を取得する
2) 開いている任意のクエリー数分のループを組む
3) Docmd.Close にオブジェクト名を引数として渡しクエリーを一つ一つとじらせる
4) 全てのクエリーが閉じたら終了
終了
条件
A) 開いてあるクエリーの数は任意
B) 閉じるボタンのあるフォームは閉じない
いろいろ調べましたが最初の 1) 現在開いている複数のクエリーのオブジェクト名の確認の仕方、でつまづき先に進んでいません。。
どなたか、このようなサンプルコードをご存知の方は紹介ください。
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
動きました!それに予想より早い。
詳細はちょっとわからないところがありましたので、コードをそのまま流用させていただきました。
特に問題なく一発で意図どおりに動き感動しました。
つたない説明から状況を理解いただき、またそれに対して適切なソリューションを頂けたことに深く感謝・感激いたします。おそらく自力でここまでたどり着くのには数十時間もの調査と学習が必要だっと思います。
ありがとうございました。平貝
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) 開いているフォルダを全て閉じる、マクロを教えて下さい 3 2022/08/28 08:42
- Excel(エクセル) Excel Powerクエリーの質問、行数指定は可能でしょうか? 2 2022/08/22 12:54
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Access(アクセス) Accessに関する質問です。 クエリーQ出勤 からフォームF出勤を作成 フォームは分割フォームで作 1 2023/05/26 08:57
- 小学校 至急、小6、運動会スタッフの立候補しました。意気込みを書いた文章に何かアドバイス頂けたら…! 4 2022/09/07 22:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
ExcelVBA Range クラスの Page...
-
ADODB.Streamを使用してUTF-8を...
-
なぜこんな初歩的なVBAのIf文で...
-
Outlook.ApplicationをCreateOb...
-
エクセルエラー13型が一致しま...
-
vbaのvlookup関数エラー原因を...
-
プロシージャ名の取得
-
VBAがブレークモードになっ...
-
VB6 エラー「プロシージャの呼...
-
ExcelVBAで、ユーザー定義型は...
-
【Excel VBA】マクロをボタンに...
-
Excelで下記のようにマクロを作...
-
1列目の何行目に検索文字がある...
-
UWSCのビジー待ちで60秒経った...
-
DataGridView からの値取得に関...
-
トランスポートレベルのエラー
-
VBAの実行時エラー91!どうしよ...
-
VBからAccessへの接続でエラー
-
ExcelVBAでsortしようとしたと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAでのエラー
-
マクロについて教えてください...
-
ExcelVBA Range クラスの Page...
-
実行時エラー3001「引数が間違...
-
VBS実行時エラー オブジェクト...
-
VBAがブレークモードになっ...
-
OLEDB.NETで接続できない
-
プロシージャ名の取得
-
EXCEL VBAマクロ中断でデバッグ...
-
VBSで変数の宣言はできないので...
-
ADODB.Streamを使用してUTF-8を...
-
実行時エラー -'-2147417848
-
AccessVBAでExcelを起動し、罫...
-
VB6+SQL サーバー 2000 で 実行...
-
Outlook.ApplicationをCreateOb...
-
Application.ActiveInspectorで...
おすすめ情報