在 Access 資料庫開發中,動態建表、匯入資料前常需檢查目標表是否已存在。本文介紹基於 DAO 物件模型遍歷與系統表查詢兩種方案,並修正原始代碼的參數傳遞錯誤。
原始代碼缺陷:函數 fExistTable 定義需傳入表名參數,但呼叫時未傳參導致「參數不可選」錯誤。
' 標準模組 Function
Function fExistTable(strTableName As String) As Boolean
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Set db = CurrentDb() ' 修正:使用 CurrentDb() 而非 Workspaces(0).Databases(0)
fExistTable = False
For Each tdf In db.TableDefs
If tdf.Name = strTableName Then
fExistTable = True
Exit Function
End If
Next tdf
Set db = Nothing
End Function
' 正確呼叫範例
Sub TestTableExist()
If fExistTable("需要判斷的表名") Then
MsgBox "表已存在"
Else
MsgBox "表不存在"
End If
End Sub
關鍵修正點:
Boolean(原為 Integer)CurrentDb() 獲取當前資料庫物件For Each 替代索引迴圈,程式碼更簡潔Access 系統表 MSysObjects 記錄所有物件資訊,可直接用 SQL 判斷:
SELECT Count(*) AS Qty
FROM MSysObjects
WHERE Name = '需要判斷的表名' AND Type = 1; -- Type=1 為本地資料表
VBA 整合範例:
Function TableExistsSQL(strTableName As String) As Boolean
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String
Set db = CurrentDb()
sql = "SELECT Count(*) AS Qty FROM MSysObjects WHERE Name = '" & strTableName & "' AND Type = 1"
Set rs = db.OpenRecordset(sql)
TableExistsSQL = (rs!Qty > 0)
rs.Close
Set rs = Nothing
Set db = Nothing
End Function
| 維度 | DAO 遍歷 | 系統表查詢 |
|---|---|---|
| 效能 | 表數量少時極快;表多(>500)時較慢 | 單次查詢,穩定高效 |
| 權限需求 | 標準權限即可 | 需讀取系統物件權限(預設管理員可見) |
| 適用範圍 | Access/VBA 環境 | 可在查詢設計器、Pass-through 查詢中直接使用 |
| 可攜性 | 依賴 DAO 物件模型 | 標準 SQL,理論支援其他引擎(需調整系統表名) |
TableExists(TableName),專案統一調用。MSysObjects 中 Type 欄位:1=本地表、4=連結表、6=系統表,查詢時建議加上 Type IN (1,4) 涵蓋連結表。MSysObjects 驗證查詢結果。掌握這兩種方法,能靈活應對 Access 開發中動態建表、資料匯入前檢查、版本升級腳本等常見場景。