首页 > 解决方案 > Excel 添加查询方法

问题描述

以下在我的计算机上运行良好,但在同事的计算机上失败:

    GetUserName = Environ$("username")

    If GetUserName = "user1" Then
        o_dsn = """dsn=mydbs"""
    Else
        o_dsn = """dsn=dbs2"""
    End If

    ActiveWorkbook.Queries.Add Name:="Query1", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Odbc.Query(" & o_dsn & ", ""Select InvoiceNo, EffectDate from " & _
            "batchcontract " & _
            "where InvoiceNo in( " & _
            RangeToString & _
            ") """ & _
        ")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    Source" & _
        ""

他的机器因“Queries.Add”语句中的“对象不支持属性或方法”错误而失败。我们都在 Windows 10 上运行 Office 365 ProPlus,并使用相同的 Excel 引用。虽然我们的 DSN 带有不同的标签,但它们都指向同一个 MySQL DB,在 ODBC 定义中保存了凭据并通过了连接测试。

我不确定 Excel 是否反对“Queries.Add”方法或“Odbc.Query”子句。谁能澄清这个错误的原因?任何想法都会受到欢迎。谢谢。

标签: excelvbaodbc

解决方案


使用 ODBC,连接的名称似乎很重要。另一方面,我发现你真正需要的只是 DSN,它会根据你设置连接的方式拉回任何连接细节。

也就是说,你似乎已经在你的 if/then 中处理了这个问题。

我从未以您列出的方式使用查询——我总是将它们作为工作集中的表来执行。本着这种精神,这是我如何通过 VBA 添加表格的快速而肮脏的样板。这本质上是执行此答案中列出的操作的 VBA 方式:

https://stackoverflow.com/a/51444029/1278553

试试这个——在两台机器上——看看它们是否都可以使用分别命名的 DNS。

Dim lo As ListObject
Dim ws As Worksheet

Set ws = Sheets("Sheet1")

Set lo = ws.ListObjects.Add(SourceType:=0, _
  Source:=Array(Array("ODBC;DSN=mydbs")), _
  Destination:=Range("A1"))
lo.QueryTable.CommandText = "select foo from bar"
lo.Refresh

另外,添加具有匹配名称的 ODBC 连接有什么害处吗?


推荐阅读