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