mdb テーブルが一括削除できない

解決


目玉  2010-12-18 23:34:17  No: 102749  IP: [192.*.*.*]

こんばんわ
mdb内の特定文字を含むテーブルを削除したいと思っております。
コードは、

Dim objCat, objTable


Set objCat = CreateObject("ADOX.Catalog")
objCat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\AAA.mdb" _
& ";" & "Jet OLEDB:Engine;" 

For Each objTable In objCat.Tables
         
    If objTable.Type = "TABLE" Then
             
       If (objTable.Name Like "*インポート エラー*") Then
                        
            Debug.Print objTable.Name & "削除"
            objCat.Tables.Delete objTable.Name
                        
       End If
                    
    End If
            
Next

としたのですが  Debug.print のみですと全テーブル名取得できますが
削除を実行すると一部のテーブルしか削除できません。
Doeventを入れてみたのですが同様でした。

どのようにしたら宜しいでしょうか?  ご教授の程宜しくお願い致します。

編集 削除
魔界の仮面弁士  2010-12-20 11:01:13  No: 102750  IP: [192.*.*.*]

For や For Each での列挙中に、そのメンバーを削除してしまっては、
列挙内容に不都合が起きても致し方ないかと。

やるのであれば、削除対象のテーブル名一覧を
VBA.Collection なり配列なりに一度受けておき、
それを使って削除してみましょう。

編集 削除
目玉  2010-12-21 22:45:22  No: 102751  IP: [192.*.*.*]

魔界の仮面弁士さん、こんばんわ
早速のご教授ありがとうございます。
配列で頑張ってみようと思います。
出来ましたら、ご報告致します。
では…

編集 削除
目玉  2010-12-22 21:30:12  No: 102752  IP: [192.*.*.*]

魔界の仮面弁士さん、こんばんわ
教えて頂いた通り配列で全て削除出来ました♪

            AA = 0
            
            For Each objTable In objCat.Tables
         
                If objTable.Type = "TABLE" Then
             
                    If (objTable.Name Like "*インポート エラー*") Then
                    
                        AA = AA + 1
                        ReDim Preserve strA(AA) As String
                        strA(AA) = objTable.Name
                         
                    End If
                    
                End If
            
            Next objTable
            
            If AA > 0 Then
            
                For AA = 1 To UBound(strA) Step 1
                
                    objCat.Tables.Delete strA(AA)
                
                Next
                
            End If

ありがとうございました♪
再度不明な点がございましたら、ご教授の程宜しくお願い致します。

編集 削除
魔界の仮面弁士  2010-12-22 22:51:34  No: 102753  IP: [192.*.*.*]

> ReDim Preserve strA(AA) As String
今回のように要素数が事前にわからないデータの時は、
配列では無くコレクションを使った方が便利ですよ。


'コレクションを用意
Dim errTables As VBA.Collection
Set errTables = New VBA.Collection


For Each objTable In objCat.Tables
    If objTable.Type = "TABLE" Then
        If objTable.Name Like "*インポート エラー*" Then
            errTables.Add objTable.Name     'コレクションに加える
        End If
    End If
Next

Dim tblName As Variant
For Each tblName In errTables
    objCat.Tables.Delete tblName
Next


> 再度不明な点がございましたら、ご教授の程宜しくお願い致します。
http://www.tt.rim.or.jp/~rudyard/torii009.html
http://dora0.blog115.fc2.com/blog-entry-85.html

編集 削除
目玉  2010-12-23 21:38:03  No: 102754  IP: [192.*.*.*]

魔界の仮面弁士さん、こんばんわ
配列での処理方法ご教示頂きありがとうございます。
又、ご指摘ありがとうございます。
今後気をつけます。
では…

編集 削除