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

解決


目玉  2010-12-19 08:34:17  No: 102749

こんばんわ
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 20:01:13  No: 102750

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

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


目玉  2010-12-22 07:45:22  No: 102751

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


目玉  2010-12-23 06:30:12  No: 102752

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

            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-23 07:51:34  No: 102753

> 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-24 06:38:03  No: 102754

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加