0

我正在构建一个必须同时兼容 Windows 和 Mac 的基于 Excel 的工具。此工具需要从 SQL Server 中提取数据并将数据推送到 SQL Server。我已经编写并测试了一种在 Windows 中工作的方法,并且应该在 Mac中工作,如此处所述(尽管该链接与 Excel 2011 相关):

On Error GoTo err1
Dim connstring As String
Dim sqlstring As String
Dim dArr As Variant
Dim qt As QueryTable
Dim sht As Worksheet
Set sht = ThisWorkbook.Sheets(1)
connstring = "ODBC;DRIVER={SQL Server};SERVER=SERVERNAME;DATABASE=master;Trusted_Connection=yes"
sqlstring = "SELECT 1"

Set qt = sht.QueryTables.Add(Connection:=connstring, Destination:=sht.Range("A1"), Sql:=sqlstring)

With qt
  .BackgroundQuery = False
  .RowNumbers = False
  .Refresh
End With

此方法在 Excel 2016 for Mac 中不起作用。事实上,当我在 Mac 上记录添加连接的过程时,QueryTables.Add 方法甚至没有显示 Connection 或 SQL 参数......

我认为解决方法不是以编程方式创建表,而是手动创建表,然后根据需要以编程方式更改表的 CommandText(对于不同的参数等)。但是当我尝试访问 QueryTable 对象的 CommandText 属性时,Mac VBEditor 告诉我它找不到该成员!

是否有人在 Excel 2016 for Mac 中以编程方式成功创建了 ODBC QueryTables,或者这是 Excel 2016 的另一个不足之处?

4

1 回答 1

0

当我遇到您的问题时,我正疯狂地试图找到解决方法,希望有人回答它。我今天刚刚发现了一个解决方法。我的问题似乎与您的问题相似,所以也许我的解决方案会帮助您:

我无法在 VBA 中使用 QueryTables.Add 或 CommandText,但我能够手动创建表,然后使用 excel 表中的数据作为参数。
我通过单击 New Database Query>From Database 手动创建了 ODBC 连接,您可能知道该怎么做。我将我的 SQL 输入到 Microsoft Query 窗口中,如下所示:

    SELECT DISTINCT WIN
  FROM RETAIL.OFFER
  WHERE WIN LIKE 'XS%'
  AND WIN NOT LIKE 'XS92500' 
  AND WIN NOT LIKE 'XS%a'
  AND TITLE = 'The Binge'

我是 SQL 新手,所以它可能不漂亮,但它确实有效。但是,我需要标题是来自电子表格中的单元格的参数,而不是每次都必须进入并手动更新 SQL。我可以通过进入 Connections>Properties>Definition>Edit Query 并将 SQL 更改为:

    SELECT DISTINCT WIN
  FROM RETAIL.OFFER
  WHERE WIN LIKE 'XS%'
  AND WIN NOT LIKE 'XS92500' 
  AND WIN NOT LIKE 'XS%a'
  AND TITLE = ?

注意:它仅在我实际按下“编辑查询”按钮时才起作用,如果我在“定义”窗口中编辑它,它会将所有 ' 更改为弯曲的撇号。Excel 然后提示我选择一个参数来替换?在 SQL 中。您可以在电子表格中选择一个单元格或为参数输入任何其他字符串。如果需要,您还可以返回连接并编辑参数。
现在,我只需使用 VBA 宏来刷新所有连接并将单元格中的数据传递到查询中。这适用于我的用例,抱歉,如果您已经知道以这种方式制作参数并且需要使用 VBA。我的 VBA 也无法在我的 Mac 上运行,即使它在我的 PC 上运行良好。希望这对那里的人有帮助!

于 2016-05-19T04:35:38.127 回答