目次
システムテーブルについて
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以外ならすべて真とみなされます。
コメント