我在 ms-Access 中有 100 個名為“TBL*”的鏈接表,它們具有相同的列。我嘗試使用 vba 創建一個模塊,該模塊根據 sql 查詢洗掉一些行,如下所示:
Option Compare Database
Option Explicit
Sub DeleteRecords()
Dim strSQL As String 'sql statement
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Set db = CurrentDb
For Each tdf In db.TableDefs
DoCmd.SetWarnings False
If Not (tdf.Name Like "MSys*") And tdf.Name Like "TBL*" Then
db.Execute "DELETE FROM " & tdf.Name & " WHERE " & tdf.Fields(2) & " NOT LIKE '%MUST NOT DEL%'", dbFailOnError
End If
'DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
Next
End Sub
這意味著我只需要它們的第二列類似于 '%MUST NOT DEL%' 的行并洗掉其他行。這段代碼給了我一個無效操作的錯誤。我嘗試了很多更改,但沒有。我想我的查詢可能有語法錯誤。有什么想法有什么問題嗎?
uj5u.com熱心網友回復:
發生“無效操作”錯誤是因為代碼僅參考了tdf.Fields(2)您希望在 SQL 陳述句中包含欄位名稱的位置。如果您明確詢問該欄位的名稱,該錯誤應該會消失:tdf.Fields(2).Name
但是,您提到“第二列”是可能包含文本匹配的列'%MUST NOT DEL%'。而且,由于Fields集合是從零開始的,因此您需要Fields(1).Name而不是Fields(2).Name
還有一個潛在的問題潛伏著。從 執行查詢時,除非您已為"SQL Server Compatible Syntax (ANSI 92)"CurrentDb設定了 Access 選項,否則Access 需要使用通配符*而不是%通配符。由于我不知道哪種情況適用于您,因此我使用而不是... 表示 db 引擎期望使用 ANSI 92通配符。ALIKELIKE%
使用查詢測驗該WHERE子句,SELECT以確保它僅針對您以后要洗掉的行。
For Each tdf In db.TableDefs
If tdf.Name Like "TBL*" Then
strSQL = "DELETE FROM [" & tdf.Name & "] WHERE [" & tdf.Fields(1).Name & "] NOT ALIKE '%MUST NOT DEL%'"
Debug.Print strSQL ' you can inspect the completed statement in the Immediate window;
' Ctrl g will take you there
db.Execute strSQL, dbFailOnError
End If
Next
筆記:
- 由于您不
DoCmd.RunSQL用于運行查詢,因此我認為您不需要DoCmd.SetWarnings False在這里。 - 無論何時
tdf.Name Like "TBL*"為真,Not (tdf.Name Like "MSys*")也必須為真。所以你不需要兩者都適合你的If ... Then條件;Like "TBL*"足夠了。 - 如果其中任何一個名稱包含空格、標點符號或與函式或關鍵字的名稱匹配,我將表和欄位名稱括起來以避免出現問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512860.html
標籤:sqlvba毫秒访问
