#02 テーブルオブジェクトを解剖

Accessのデータベースウィンドウからテーブルデザインを開いてみましょう。そのテーブル内のフィールドのリストやフィールドごとのプロパティの設定が表示されているはずです。ここではテーブルオブジェクトの下位に属するこれらのフィールドオブジェクトの情報をVBAを使って調べてみましょう。
 
ず、フィールド名の一覧を列挙してみましょう。それには次のコードを実行します。 

  Dim dbs As Database
  Dim tdf As TableDef
  Dim fld As Field

  Set dbs = CurrentDb

  Set tdf = dbs.TableDefs("顧客情報")

  For Each fld In tdf.Fields
    Debug.Print fld.Name
  Next fld


ここで、 dbs.TableDefs はデータベースに含まれるテーブルの集まりを示します。そして dbs.TableDefs("顧客情報") でその集まりの中から「顧客情報テーブル」を取り出して Set tdf でTableDefオブジェクトを示す変数にセットしています。

同様に For Each fld In tdf.Fields では、そのテーブルに属するフィールドの集まりから順番にフィールドオブジェクトを取り出しています。

'sKitの「オブジェクトツリー表示」ツールではフィールド名の表示までですが、ここではさらにその下位のフィールドのプロパティを取得してみましょう。

フィールドのデータ型やデータ長など具体的に対象を決めてプロパティ値を調べる前に、フィールドオブジェクトにいったいどのようなプロパティがあるのかを調べる方法を説明します。

それには [Field]オブジェクト に関する属性(プロパティ)の集まりである [Properties]コレクション の1つ1つの中味、つまり [Property]オブジェクト を列挙します。 

右の例では"氏名"フィールドに対してプロパティの列挙を行っています。


  Dim dbs As Database
  Dim tdf As TableDef
  Dim fld As Field
  Dim prp As Property

  Set dbs = CurrentDb

  Set tdf = dbs.TableDefs("顧客情報")
  Set fld = tdf.Fields("氏名")

  For Each prp In fld.Properties
    Debug.Print prp.Name
  Next prp

この[Property]オブジェクトの列挙方法はテーブルだけでなく他のオブジェクトに対しても同様に使うことができます。

記のコードを実行すると次のようなプロパティが出力されます。
Value, Attributes, CollatingOrder, Type, Name, OrdinalPosition, Size, SourceField, SourceTable, ValidateOnSet, DataUpdatable, ForeignName, DefaultValue, ValidationRule, ValidationText, Required, AllowZeroLength, FieldSize, OriginalValue, VisibleValue, Description
それでは実際にこれらのプロパティの値を取得してみましょう。すでに目的とするプロパティ名が分かっているので、次のようなコードを作成します。 

  Dim dbs As Database
  Dim tdf As TableDef
  Dim fld As Field

  Set dbs = CurrentDb

  Set tdf = dbs.TableDefs("顧客情報")
  Set fld = tdf.Fields("氏名")

  With fld
    Debug.Print .Attributes
    Debug.Print .CollatingOrder
    Debug.Print .Type
    Debug.Print .Name
    Debug.Print .OrdinalPosition
    Debug.Print .Size
    Debug.Print .SourceField
    Debug.Print .SourceTable
    Debug.Print .DataUpdatable
    Debug.Print .DefaultValue
    Debug.Print .ValidationRule
    Debug.Print .ValidationText
    Debug.Print .Required
    Debug.Print .AllowZeroLength
 End With


※ここでは[Value]プロパティや[Description]プロパティなど、プロパティ値が空の場合や、Recordsetオブジェクトでのみ使用可能なため実行時にエラーとなるプロパティは除外してあります。

また、すべてのプロパティ名とその値を取得したい場合には次のようなコードとなります。

  Dim dbs As Database
  Dim tdf As TableDef
  Dim fld As Field
  Dim prp As Property

  Set dbs = CurrentDb

  Set tdf = dbs.TableDefs("顧客情報")
  Set fld = tdf.Fields("氏名")

  On Error Resume Next  '実行時エラーを無視

  For Each prp In fld.Properties
    Debug.Print prp.Name, prp.Value
  Next prp
 

【メモ】あるオブジェクトの特定のプロパティ値を参照したい場合、次の2つの記述は同じ結果を返します。 

  Debug.Print  fld.Size

  Debug.Print  fld.Properties("Size").Value

記の方法でテーブルデザインのウィンドウに表示されるフィールド名やデータ型などのプロパティが列挙されるようになりましたが、Accessのウィンドウに表示されているすべてのフィールド情報が揃っていないのにお気づきでしょうか? 

実はまだ、"説明"プロパティや"書式"プロパティの情報がありません。これらはAccess固有のプロパティなので、 For Each prp In fld.Properties では取得されません。

これらの値を取得するには  Properties!Description  のような形式で直接プロパティ名を指定してやる必要があります。以下にそのコードを示します。
 


  Dim dbs As Database
  Dim tdf As TableDef
  Dim fld As Field

  Set dbs = CurrentDb
  Set tdf = dbs.TableDefs("顧客情報")
  Set fld = tdf.Fields("氏名")

  'Access固有のプロパティはそれを持っていない
  'フィールドもあるのでエラーは無視する
  On Error Resume Next
  With fld
    Debug.Print .Properties!Description   '説明
    Debug.Print .Properties!Format        '書式
    Debug.Print .Properties!InputMask    '定型入力
    Debug.Print .Properties!Caption       '標題
  End With

| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved