システムテーブルの判定

目次

システムテーブルについて

Accessのテーブルには、通常は非表示となっている「システムテーブル」と呼ばれるテーブルがあります。

TableDefsのテーブルコレクションには、システムテーブルが含まれているため、通常はこれらを除外する必要があります。

方法① 名前で判別する

一般的に行われているのが、名前で判断する方法です。

システムテーブルは、「MSys~」という名前なので、テーブル名の先頭4文字で判断できます。

ただ、この方法は未来永劫使えるという保証はありません。非推奨です。

実際、Access2019で試すと、「MSys」以外のシステムテーブルが含まれていました。もはや、この方法は使えないと考えたほうが良さそうです。

方法② Attributesプロパティで判別する

TableDefオブジェクトにはAttributesプロパティがあります。

このプロパティを使って、下記のように計算するとシステムテーブルかどうかを判定できます。

Public Sub ShowSystemTable()

    Dim db As DAO.Database
    Dim t As TableDef
    Dim a As Long
    
    Set db = CurrentDb
    For Each t In db.TableDefs
        a = t.Attributes And dbSystemObject
        Debug.Print t.name & " " & IIf(a, ": System Table", ": Not System Table")
    Next t

End Sub

補足

直感的には、 t.Attributes And dbSystemObject の値がdbSystemObject かどうかでシステムテーブルかどうかを判断できるのでは?と考えてしまいますが、実際にはそれでは取りこぼしてしまいます。例のように、0以外ならシステムテーブルという判別の仕方となります。

AttributesAnddbSystemObject ≠ 0 ならシステムテーブル

Attributes And dbSystemObject = 0 なら通常のテーブル(非システムテーブル)

おそらくは、Attributesプロパティがマイナス(2の補数)も含めたフラグになっていることが原因だと思います。→詳しく仕様が分かり次第解説します。

ちなみに、VBAのIIf(条件式, …条件式は、trueという真偽値以外にも、0以外ならすべて真とみなされます。

よかったらシェアしてね!

この記事を書いた人

コメント

コメントする

目次
閉じる