2012年6月26日火曜日

Access:隠しオブジェクトの判定

Access 2010のナビゲーションウィンドウが使いづらい!
2003のデータベースウィンドウの詳細表示のように、テーブル名・説明・更新日時・作成日時が横に並んでほしいんですが。じゃあ自分で作ってしまえ、とやってた時のことです。

テーブルの一覧を取得しようと思って下記のようなコードを書きました。

Dim db As DAO.Database
Dim td As DAO.TableDef
Dim prop As Variant
Dim sTemp As String
    Set db = Application.CurrentDb
    For Each td In db.TableDefs
        sTemp = "テーブル名:" & td.Name
        sTemp = sTemp & vbTab & "更新日時:" & td.LastUpdated
        sTemp = sTemp & vbTab & "作成日時:" & td.DateCreated
        For Each prop In td.Properties
            If prop.Name = "Description" Then
                sTemp = sTemp & vbTab & "説明:" & td.Properties("Description")
                Exit For
            End If
        Next
        Debug.Print sTemp
        sTemp = ""
    Next

ちなみにDescriptionは「説明」を書いてないとプロパティ自体が無い状態なので、調べる処理をしています。
まぁこれでできるんですけど、いらないシステムオブジェクトまで取得してしまいます。


ググってみると、テーブル名のプレフィックスを利用して

If Not td.Name Like "MSys*" Then

みたいに判定して除外しているコードをよく見かけました。
でも稀なケースながら、自分でテーブルを隠しオブジェクトにしていることもあります。


TableDefのAttributesプロパティでシステムオブジェクトまたは隠しオブジェクトを除外する、という判定のしかたもあったのですが

If ((td.Attributes And dbSystemObject) Or (td.Attributes And dbHiddenObject)) = 0 Then

非表示のオブジェクトということで一度に判定できないのか?と思って調べたらありました:

SetHiddenAttribute メソッド - MSDN ※ここにあるGetHiddenAttribute

If Not Application.GetHiddenAttribute(acTable, td.Name) Then

これだけでシステムオブジェクトも隠しオブジェクトも判定できました。便利。

0 件のコメント:

コメントを投稿