Home > 即効テクニック > AccessVBA > コーディング・デバッグ > For Each を使用したオブジェクトの削除

即効テクニック

コーディング・デバッグ

For Each を使用したオブジェクトの削除

(Access)
データベースに格納されたテーブル(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コレクションに反映されるようになります。