在 Access/VBA 環境下,常需判斷資料表是否存在。本文記錄一個 DAO 函數的參數遺漏錯誤修正,並提供更簡潔的系統表查詢替代方案。
Function fExistTable(strTableName As String) As Integer
Dim db As Database
Dim i As Integer
Set db = DBEngine.Workspaces(0).Databases(0)
fExistTable = False
db.TableDefs.Refresh
For i = 0 To db.TableDefs.Count - 1
If strTableName = db.TableDefs(i).Name Then
fExistTable = True
Exit For
End If
Next i
Set db = Nothing
End Function
呼叫時缺少參數導致「引數不得為選擇性」錯誤:
Private Sub 命令0_Click()
fExistTable ' ❌ 缺少表名參數
End Sub
Private Sub 命令0_Click()
fExistTable "需判斷的資料表名稱" ' ✅ 正確
End Sub
Access 系統表 MSysObjects 記錄所有物件,直接用 SQL 查詢即可:
SELECT Count(*) AS Qty
FROM MSysObjects
WHERE Name = '需判斷的資料表名稱'
結果 Qty > 0 表示表存在,= 0 表示不存在。
| 方法 | 優點 | 缺點 |
|---|---|---|
| DAO 迴圈 | 程式碼直觀,適合 VBA 邏輯中複用 | 需迴圈遍歷,效能稍差 |
| MSysObjects 查詢 | 單一 SQL 完成,效能佳,可直接在查詢中使用 | 需權限讀取系統表 |
-- SQL Server 判斷表是否存在
IF OBJECT_ID('dbo.YourTable', 'U') IS NOT NULL
PRINT '表存在'
ELSE
PRINT '表不存在'