#06 開いているオブジェクトの一覧を取得する

#01〜#05ではデータベースウィンドウに表示されているオブジェクトの一覧を取得したり、その内部を調べるといった、オブジェクトのいわば"静的"な状態を対象としてきましたが、ここでは「開いているオブジェクトの一覧を取得する」という"動的"な状態を対象としたオブジェクトの解析にトライしてみましょう。
 
ブジェクトが"開いている"といってもその状態にはいくつかの状況が考えられます。例えば、あるテーブルをレコードソースとするフォームが「画面上で目に見える状態」で"開いている"とします。この時、レコードソースのテーブルのレコードも参照されてその内容が表示されているわけですから、このテーブルもまた"開いている"と言えます。また、そのテーブルをデータベースウィンドウの[開く]ボタンを使ってデータシートとして表示している場合もまさしく"開いている"ことになります。
そこで、今回はこの中の「画面上で目に見える状態」で"開いている"オブジェクト、さらにAccess固有のオブジェクトであるフォーム、レポート、モジュールを対象にして話しを進めていきたいと思います。
て、その方法ですが、大きく分けて2つの考え方があると思います。1つは「開いているオブジェクトの集まり」の中から1つずつオブジェクト名を取り出して列挙する方法、もう1つはデータベースに保存されているすべてのオブジェクトについて各々が現在開かれているかどうかを調べ、開いていたらそのオブジェクト名を列挙するという方法です。ある単独のオブジェクトが開いているかどうかを調べるのであれば後者の方が効率的です。なぜなら、その特定のオブジェクトだけについて開いているかどうかを調べればよいからです。これを前者の方法でやろうとすると、開いているオブジェクトを1つずつ、調べる対象のオブジェクトかどうかあたっていかなければなりません。

逆に考えれば、今回の場合は"一覧"を取得するというテーマですので、前者の方法を採る方がよいことになります。もし、30ケのオブジェクトのうち開いているものが1つしかないような場合を考えれば、前者の方が効率的なのは明確です。そこで次に前者の方法を使ったコードを紹介していきます。

なお、後者の方法については#01 MDBオブジェクト一覧を取得するやTipsの#005 フォームの状態を知るには? を参考にして頂きたいと思います。
ず、開いている「フォーム」の一覧を取得してみましょう。これには、「#03 フォームのコントロール一覧を取得する」で若干説明しているのですが、Forms というコレクションを使用します。Forms は現在開かれているフォームの集まりを表します。ここではフォームビューとデータシートビューだけでなく、デザインビューも開いているフォームとしてその集まりに含まれます。

例えば、Forms(0) は開いている1つ目のフォームオブジェクトを示します。また Forms(1) は開いている2つ目のフォームオブジェクトを示します。ここではカッコ内の添え字がゼロから始まることに注意して下さい。

  Debug.Print Forms(0).Caption

を実行すると、1つ目のフォームの[Caption/標題]プロパティがデバッグウィンドウに表示されます。

さらに、開いているフォームオブジェクトの総数はFormsコレクションのCountプロパティを使って、Forms.Count で取得することができます。

そこで、配列の添字に注意して、すべての開いているフォームの名前を列挙するコードを作成すると次のようになります。


  Dim iintLoop As Integer
 
  For iintLoop = 0 To Forms.Count - 1
    Debug.Print Forms(iintLoop).Name
  Next iintLoop

この方法を用いれば、各々のフォームの[Name/名前]以外のプロパティ、例えば標題やレコードソース、境界線スタイルなどの値を列挙することもできます。

あとはレポートやモジュールに簡単に応用することができます。それにはフォームの Forms の替わりに、レポートでは Reports、モジュールでは Modules を使うだけです。なお、モジュールではあくまでもその中に記述されているコードが実行されているという意味ではなく、目に見える形、つまりデザインとしてコードが表示されているという意味の"開いている"です。

  For iintLoop = 0 To Reports.Count - 1
    Debug.Print Reports(iintLoop).Name
  Next iintLoop

  For iintLoop = 0 To Modules.Count - 1
    Debug.Print Modules(iintLoop).Name
  Next iintLoop
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved