#01 MDBオブジェクト一覧を取得する

オブジェクトツリー表示Accessにはオブジェクトと呼ばれるものが多数ありますが、新しいデータベースを作成して最初に目に入るのがデータベースウィンドウに表示されている、テーブル・クエリー・フォーム・レポート・マクロ・モジュールの6つのオブジェクトではないでしょうか?。ここではデータベースオブジェクトのすぐ下位に属するこの6つのオブジェクトの一覧をVBAを使って調べてみましょう。T'sKitではこれらの方法を使って「オブジェクトツリー表示」ツールを作成しています。
ず、テーブルの一覧を取得してみます。カレントデータベースに含まれるすべてのテーブルを列挙するには次のコードを実行します。

  Dim dbs As Database
  Dim tdf As TableDef

  Set dbs = CurrentDb

  For Each tdf In dbs.TableDefs
    Debug.Print tdf.Name
  Next tdf

データベース内のすべてのテーブルの集まり(コレクション)である TableDefs から1つずつテーブルオブジェクトを For Each〜Next で取り出します。


ところがこのコードを実行すると、システムテーブルや隠しテーブルまで表示されてしまいます。これらを除外してユーザーが作ったテーブルだけを表示するには、テーブルの属性([Attributes]プロパティ)によって選別してやる必要があります。それにはコードを次のように修正します。

  For Each tdf In dbs.TableDefs
    With tdf
      If ((.Attributes And dbSystemObject) Or _
        (.Attributes And dbHiddenObject)) = 0 Then
        Debug.Print .Name
      End If
    End With
  Next tdf

エリーの場合も、テーブルの場合の TableDefs の代わりに QueryDefs を使うことによって同様の方法で一覧を取得することができます。

  Dim qdf As QueryDef

  For Each qdf In dbs.QueryDefs
    Debug.Print qdf.Name
  Next qdf

この場合にも、テーブルでシステムテーブルや隠しテーブルが表示されたのと同様に、フォームなどの[レコードソース]プロパティにクエリー名ではなくSQL文が設定されていると '〜' で始まる見覚えのないクエリー名が列挙されてしまいます。


どうやらSQL文で設定したつもりでもAccess内部では保存済みのクエリーとして管理されているようです。

これを除外するにはコードを次のように修正します。なお、ここで使っている[Type]プロパティの &HF という値は定数としてはないようです。 

  For Each qdf In dbs.QueryDefs
    With qdf
      If (.Type And &HF) = 0 Then
        Debug.Print .Name
      End If
    End With
  Next qdf
 

ーブルやクエリーはAccessのオブジェクトというよりは、VBやExcelからも直接アクセスできるようなJETデータベースエンジン(DAO)のオブジェクトです。Access固有のオブジェクトであるフォームやレポートなどについては[Containers]コレクション[Documents]コレクションから情報を取得します。

次のコードはフォーム名の一覧を列挙するものです。


  Dim dbs As Database
  Dim ctn As Container
  Dim doc As Document

  Set dbs = CurrentDb

  Set ctn = dbs.Containers!Forms
  For Each doc In ctn.Documents
    Debug.Print doc.Name
  Next doc

ポートやマクロ、モジュールについても、フォームの場合の Containers!Form の代わりにそれぞれ "Report"、"Script"、"Module" を使うことによって同様の方法で一覧を取得することができます。

  Dim dbs As Database
  Dim ctn As Container
  Dim doc As Document

  Set dbs = CurrentDb

  'レポートの一覧
  Set ctn = dbs.Containers!Reports
  For Each doc In ctn.Documents
    Debug.Print doc.Name
  Next doc


  'マクロの一覧
  Set ctn = dbs.Containers!Scripts
  For Each doc In ctn.Documents
    Debug.Print doc.Name
  Next doc

  'モジュールの一覧
  Set ctn = dbs.Containers!Modules
  For Each doc In ctn.Documents
    Debug.Print doc.Name
  Next doc

For Each 〜 Next 構文の3行はすべて同じです。
 

| Index | Prev | Next |

 


 

Copyright © T'sWare All rights reserved