For Each を使用したオブジェクトの削除
 データベースに格納されたテーブル(TableDefs コレクション)を削除するには、
TableDefs コレクションの Delete メソッドを使用します。

● サンプル ●

Sub DeleteTeble()
    Dim dbs As DAO.Database
    Dim tdf As TableDef

    Set dbs = CurrentDb

    For Each tdf In dbs.TableDefs
        If tdf.Attributes = 0 Then
            dbs.TableDefs.Delete tdf.Name
            dbs.TableDefs.Refresh    '<--ここがポイント!
        End If
    Next

    Set dbs = Nothing
End Sub

 しかし、ここで注意しなければならないことは、オブジェクトを削除することにより、
コレクション内のオブジェクトの相対位置が変化してしまいます。つまり、For Each
ステートメントを使用してコレクション内のオブジェクトを連続して削除しようとすると、
すべてのオブジェクトが削除されず、オブジェクトが1つ飛ばしで削除されてしまいます。

 例えば、Table_AA、Table_BB、Table_CCの3つテーブルがあり、これらのテーブルは、
処理実行前は以下のとおりであるとします。

  TableDefs(0)・・・Table_AA
  TableDefs(1)・・・Table_BB
  TableDefs(2)・・・Table_CC

 そして、まず最初にTableDefs(0)が参照され、Table_AAが削除されます。ここで、
Table_AAが削除されたため、以下のように変更されます。

  TableDefs(0)・・・Table_BB
  TableDefs(1)・・・Table_CC
  TableDefs(2)・・・不明

 この状態で、次のループでは、カウンタは1となりますので、TableDefs(1)が参照される
のですが、すでに、ここにはTable_BBが入っているため、Table_CCが削除されて、Table_BB
が残ってしまいます。

そこで、「dbs.TableDefs.Refresh」を加えることで、Deleteメソッドで削除された情報が、
TableDefsコレクションに反映されるようになります。

Access2000



戻る


Excel Word Access VBA! モーグ