Excel添加查询方法

时间:2018-12-17 20:40:29

标签: excel vba odbc

以下内容在我的计算机上可以很好地运行,但在同事的计算机上无法运行:

    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”子句。谁能澄清这个错误的原因?任何想法都将受到欢迎。谢谢。

1 个答案:

答案 0 :(得分:0)

对于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连接是否有害?