【问题标题】:Check if a Query exists in MS Access from Excel VBA从 Excel VBA 检查 MS Access 中是否存在查询
【发布时间】:2019-02-24 13:54:28
【问题描述】:

以下函数可以很好地通过标准的新连接和记录集在 MS Access 数据库中查找表**但它找不到查询或链接表。

Function CHKtablename(TABLECHK As String) As Boolean
Dim conn As New Connection
Dim rs As New Recordset
Dim strconn As String
Dim qry As String
Dim chk As Boolean 
strconn = "provider=Microsoft.Ace.Oledb.12.0;" & " Data source= Source path" & "user id=admin;password=" 
conn.Open(strconn) 
Set rs = conn.Openschema(adschematables) 
    While Not rs.EOF
        If rs.Fields("Table_Name") = TABLECHK Then
            CHKtablename = True
        End If
        rs.Movenext
    Wend
End Function

如何更改它以找到它们?

感谢您的宝贵时间和帮助。

【问题讨论】:

  • 你测试过这段代码吗?在我看来它不会编译,并且会有运行时错误。 rs开什么剂量?它在哪里做到这一点?
  • 对不起,我会澄清这不是完整的代码,我将编辑并添加剩余的等待片刻
  • 完成请再次检查
  • 发布的代码仍然显示不应该出现在编译代码中的错误。比如function后面的空间不足。然而你说它工作得很好。使用 QueryDefs 来验证查询是否存在。
  • 好吧,我正在手机上写这个,所以很难让代码完全正确,我非常抱歉,但我确实可以找到表格

标签: excel vba ms-access oledb


【解决方案1】:

如果可以查询 MSysObjects 表会很好,但由于权限问题,这在 Access 之外是不可靠的。对我来说失败了。

将 VBA 引用设置为 Microsoft Office x.x Access Database Engine Library

一种方法使用 QueryDefs 集合。经过测试并为我工作。但是,这两个文件都在同一用户文件夹中的笔记本电脑上。

Sub CHKqueryname()
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Set db = DBEngine.OpenDatabase("C:\Users\June\LL\Umpires.accdb")
For Each qd In db.QueryDefs
    If qd.Name = "GamesSorted" Then
        Debug.Print qd.Name
        Exit Sub
    End If
Next
End Sub

如果您想避免 QueryDefs,请尝试错误处理代码:

Sub Chkqueryname()
    On Error GoTo Err:
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = DBEngine.OpenDatabase("C:\Users\June\LL\Umpires.accdb")
    Set rs = db.OpenRecordset("query name")
    rs.MoveLast
    Debug.Print rs.RecordCount
Err:
    If Err.Number = 3078 Then MsgBox "query does not exist"
End Sub

对于 ADODB 版本,将引用设置为 Microsoft ActiveX Data Objects x.x Library

Sub CHKqueryname()
    On Error GoTo Err:
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='C:\Users\June\LL\Umpires.accdb'"
    rs.Open "query name", cn, adOpenStatic, adLockReadOnly
    Debug.Print rs.RecordCount
Err:
    If Err.Number = -2147217900 Then MsgBox "query does not exist"
End Sub

【讨论】:

  • 我尝试了您的解决方案我收到一个错误 3343 无法识别的 dB 格式检查了路径和 dB 名称及其正确我正在使用 excel 2016 并访问 2016 设置的代码中断 Set db = DBEngine.OpenDatabase("源路径")
  • 我有 Access 2010,所有这些代码都适合我。因此,如我的示例所示,将“源路径”替换为有效路径。
  • 嗯,是的,它是一条有效的路径,我只是使用源路径作为占位符,我明天将尝试其他选项,非常感谢您迄今为止一直在帮助我!跨度>
  • Adodb 版本对我有用,我用过,非常感谢您的帮助
  • @ComputerVersteher,也许 OP 会看到你的评论。他们要求不使用 QueryDefs 的方法。请参阅他们在问题下方的最后评论。
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多