从 Excel VBA-检查访问表是不是存在/如果不存在,则创建/复制
Posted
技术标签:
【中文标题】从 Excel VBA-检查访问表是不是存在/如果不存在,则创建/复制【英文标题】:From Excel VBA- Check if Access Table Exists / If Not, Create/Copy从 Excel VBA-检查访问表是否存在/如果不存在,则创建/复制 【发布时间】:2019-01-14 01:54:33 【问题描述】:我正在通过 Excel 使用 VBA 中的 Access 数据库。我想检查数据库中的表是否存在,如果不存在,我想使用与该数据库中标记为“空白”的表相同的字段/定义来创建表。如有必要,我可以简单地复制/重命名空白。
我找到了一种使用以下方法检查表是否存在的方法(但不确定它是否是最好的方法)。
Set objCatalog = CreateObject("ADOX.catalog")
objCatalog.ActiveConnection = dbConn
For i = 0 To objCatalog.Tables.Count - 1
If objCatalog.Tables.Item(i).Name = tbName Then tbExists = True
Next
这可行,但是当目标表不存在 (tbExists = False) 时,我正在努力寻找一种使用 Blank 的字段/定义复制或创建新表的方法。
【问题讨论】:
谢谢大家的帮助。显然我对数据库设计的整个方法都有缺陷,所以这个问题没有实际意义,但我非常感谢你的帮助! 【参考方案1】:这可能是通过检查表定义是否返回任何内容来检查表是否存在的另一种方法。
TableDef 对象表示基表或链接表的存储定义(仅限 Microsoft Access 工作区)。
Set exampleDB = workSpace.OpenDatabase(DatabaseName)
Set tableDefinition = exampleDB.TableDefs(TableName)
tableExists = Err.Number = 0
更多信息
https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/tabledef-object-dao
【讨论】:
很高兴知道,但并没有真正解决“努力寻找复制或创建新表的方法”的问题。【参考方案2】:从 excel vba 创建访问对象
Sub TableExistOrCreate()
Dim appAccess As Object, tbl As Object
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase ("C:\Users\santosh\Desktop\test.accdb")
On Error Resume Next
Set tbl = appAccess.currentdata.AllTables("Test")
On Error GoTo 0
If tbl Is Nothing Then
appAccess.docmd.CopyObject , "Test", 0, "Blank"
End If
Set appAccess = Nothing
End Sub
【讨论】:
【参考方案3】:这对我有用:
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\June\Umpires.accdb"
cn.Execute "SELECT Blank.* INTO [" & tbName & "] FROM Blank"
cn.Close
Set cn = Nothing
如果不执行其他操作,新表实际上不会显示在导航窗格中,例如压缩和修复或关闭/重新打开数据库或运行在导航窗格中选择表的代码或以某种方式刷新窗格(隐藏/取消隐藏窗格确实那个)。
某些字段属性设置不会被继承(AllowZeroLength = No)。计算类型字段和多值字段一样会导致运行时错误。
DoCmd.CopyObject 和 DoCmd.TransferDatabase 可以精确复制表。 DoCmd.Rename 可以简单地重命名表。所有这些都需要声明和打开 Access 数据库对象变量的代码。
【讨论】:
以上是关于从 Excel VBA-检查访问表是不是存在/如果不存在,则创建/复制的主要内容,如果未能解决你的问题,请参考以下文章
VBA脚本检查MS ACCESS上是不是存在表,如果存在则删除