2010-07-28 29 views
10

可能重複:
Check if access table exists如何檢查表在MS Access存在VB宏

我是新來的VBA宏。任何想法如何檢查一個表是否存在? 我已經搜索過以前的帖子,但沒有得到明確的解決方案。

+0

儘管它隱含地相關,但由於檢查表是否存在將需要查看集合的成員,因此它幾乎不是重複的。 – 2010-07-28 19:06:10

回答

27

設置對Microsoft Access 12.0對象庫的引用允許我們使用DCount測試表是否存在。

Public Function ifTableExists(tblName As String) As Boolean 

    If DCount("[Name]", "MSysObjects", "[Name] = '" & tblName & "'") = 1 Then 

     ifTableExists = True 

    End If 

End Function 
+0

此方法的問題在於,對於非工作後端的鏈接表,它將返回True。使用DCount會慢很多,但更可靠。 – 2013-01-15 10:46:10

+2

另一個問題是,它似乎也發現窗體和報告... ifTableExists(「myFormName」) 返回true – Peter 2015-07-29 21:25:03

+0

謝謝你的回答。我知道dCount函數,但不知道如何向它發送**變量**(tableName)。謝謝。一個可能導致錯誤的小問題:您每次都直接更改返回的值。你應該做的是'dim b as Boolean b = False If ... b = True End If ifTableExists = b End Function' – MJH 2015-11-29 11:02:34

10
Exists = IsObject(CurrentDb.TableDefs(tablename)) 
+0

我該如何使用它? 我像這樣使用, 已存在=則IsObject(CurrentDb.TableDefs( 「&ConctNmeforDB&」)) MSGBOX已存在 之後,我得到了運行時錯誤的3265項此集合中沒有找到。 – Karthik 2010-07-28 10:36:30

+0

實際上,你不能單獨使用它。它必須包裝在錯誤處理程序中,以便在遇到錯誤3265時返回false。請參閱http://stackoverflow.com/questions/2985513/check-if-access-table-exists/2992743#2992743 3種不同的實現TableExists()函數。 – 2010-07-30 18:28:18

0

訪問具有某種系統表You can read about it a little here你可以解僱如下因素查詢,看是否存在(1 =存在,0 =它不;))

SELECT Count([MSysObjects].[Name]) AS [Count] 
FROM MSysObjects 
WHERE (((MSysObjects.Name)="TblObject") AND ((MSysObjects.Type)=1)); 
+0

這將錯過鏈接表,type = 4。 – Fionnuala 2010-07-28 10:09:06

1

這不是一個新問題。我在comments in one SO post中添加了它,並在另一篇文章中發佈了my alternative implementations。第一篇文章中的評論實際上闡明瞭不同實現之間的性能差異。

基本上,最快的工作取決於你使用的數據庫對象。

8

我知道這個問題已經回答了,但我發現,現有的答案是無效的:
他們將返回True以鏈接表與非工作後端。
使用DCount可能會慢很多,但更可靠。

Function IsTable(sTblName As String) As Boolean 
    'does table exists and work ? 
    'note: finding the name in the TableDefs collection is not enough, 
    '  since the backend might be invalid or missing 

    On Error GoTo hell 
    Dim x 
    x = DCount("*", sTblName) 
    IsTable = True 
    Exit Function 
hell: 
    Debug.Print Now, sTblName, Err.Number, Err.Description 
    IsTable = False 

End Function