如何确定是否创建了表?

时间:2011-09-16 15:15:30

标签: ms-access vba

在我的Access 2010 VBA代码中,我可能会也可能不会根据DoCmd.OpenQuery的结果创建表。我可以检查记录计数导致我可以设置的“ON ERROR”分支,但我正在寻找一种更简洁的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我不确定你在问什么。

您可以使用DCount()来确定SELECT查询返回的行数。

Debug.Print DCount("*","YourQueryName")

如果问题是确定表是否存在,则可以检查TableDefs集合中的表名。如果表名存在,则该语句将返回该表的名称,如果该表名不存在,则抛出可捕获的错误。

Debug.Print CurrentDb.TableDefs("YourTableName").Name

如果你想避免陷阱错误,你可以使用For ... Next循环遍历TableDefs集合,如果你找到名字就会中断For循环。

或者,您可以使用SELECT查询在MSysObjects系统表中查找表名。

SELECT MSysObjects.[Name], MSysObjects.[Type]
FROM MSysObjects
WHERE
    (((MSysObjects.[Name])="YourTableName")
    AND ((MSysObjects.[Type])=1));

该查询将检查表名作为当前数据库中的本机Access表。如果您可能具有来自该名称的另一个Access数据库(Type = 4)或ODBC数据源(Type = 6)的链接表,请更改WHERE子句。

SELECT MSysObjects.[Name], MSysObjects.[Type]
FROM MSysObjects
WHERE
    (((MSysObjects.[Name])="YourTableName")
    AND ((MSysObjects.[Type]) In (1, 4, 6)));

如果查询MSysObjects,请确保不更改任何值。另外我听说一些Access 2007用户遇到MSysObjects的读权限错误。您可以通过使用DCount()而不是查询来避免第一个问题。

Debug.Print DCount("*","MSysObjects","[Name]='YourTableName' AND [Type] In (1, 4, 6)")