使用 VBA 更新和现有 OLEDB 连接
Posted
技术标签:
【中文标题】使用 VBA 更新和现有 OLEDB 连接【英文标题】:Updating and Existing OLEDB Connection using VBA 【发布时间】:2021-08-13 15:38:10 【问题描述】:我正在尝试使用可修改的脚本更新电子表格中的现有连接。
基本上,我希望用户能够放入帐户参考列表,按下按钮,Excel 会在这些帐户参考与我们拥有的系统匹配的地方输出 SQL 输出。
我已设法将所有脚本整理到一个单元格中(我的“工作”选项卡上的 F1),这一切都很好,我已经添加了初步连接(并将其称为“CustomerContactDetails”)。
我也启用了 Microsoft ActiveX Data Objects 6.1 Library。
我的 VBA 脚本是:
Sub UpdateScript()
Dim Script As String
SQLScript = Worksheets("Workings").Range("F1").Value
ActiveWorkbook.Connections("CustomerContactDetails").OLEDBConnection.ConnectionString = SQLScript
ActiveWorkbook.Connections("CustomerContactDetails").Refresh
End Sub
我在下面的第四行得到错误 (ActiveWorkbook.Connections("CustomerContactDetails").OLEDBConnection.ConnectionString = SQLScript):
运行时错误“9”; 下标超出范围
请问有谁知道如何解决这个问题?感觉好像我并没有那么远,我也不想做任何太复杂的事情。我似乎无法让它工作!
【问题讨论】:
你没有提到哪一行给你错误,但你要么在活动工作簿中没有工作表“Workings”,要么在该工作簿中没有名为“CustomerContactDetails”的连接。 我现在已经更新了这个问题,感谢您指出这一点。我确实正确地命名了这些东西,有一个叫做那个的连接和一个叫做那个的表。我已经检查过了,变量是“填充”(不确定正确的术语)作为脚本。 【参考方案1】:试试这样,看看你得到什么输出
Sub UpdateScript()
Dim Script As String
Dim conn as WorkbookConnection
For Each conn in ActiveWorkbook.Connections
Debug.Print conn.Name
If conn.Name = "CustomerContactDetails" Then
SQLScript = Worksheets("Workings").Range("F1").Value
conn.OLEDBConnection.ConnectionString = SQLScript
conn.OLEDBConnection.Refresh
End If
Next conn
End Sub
编辑:看起来你拥有的是WorkbookQuery
我创建了一个(到 Oracle 数据库),您可以像这样访问和修改它:
Sub Tester()
Dim q As WorkbookQuery, lo As ListObject
Set lo = ActiveSheet.ListObjects("Query1")
Debug.Print ActiveWorkbook.Queries.Count
Set q = ActiveWorkbook.Queries("Query1")
Debug.Print q.Formula
'revise query
q.Formula = "let" & vbCrLf & _
" Source = Oracle.Database(""BLAH"", [HierarchicalNavigation=true," & _
"Query=""select * from table1""])" & _
vbCrLf & "in" & vbCrLf & "Source"
lo.Refresh 'I got a popup "do you want to run this?" here...
End Sub
请注意,在创建您无法修改的对象类型时尝试录制宏几乎总是有用的 - 这将指向您需要的语法。
【讨论】:
您好,感谢您的回复!我将它添加为我以前从未见过的“查询表”。此外,名称是“Query - CustomerContactDetails”(因为它是查询而不是连接?)。我尝试将 conn 变量更改为 QueryTable 而不是 WorkbookConnection,但得到“对象变量或未设置块变量”。我试图简单地将连接名称更改为“查询 - CustomerContactDetails”,但得到“对象不支持此属性或方法”。这是我可以用查询而不是连接来做的吗?如果有帮助,我正在使用 Excel 版本 2107。谢谢。 您是如何创建查询的? 数据 -> 获取数据 -> 从数据库 -> 从 SQL Server 数据库 -> 输入脚本并单击确定等。以上是关于使用 VBA 更新和现有 OLEDB 连接的主要内容,如果未能解决你的问题,请参考以下文章
清除 DataTable 中的 Byte[] 值时,OleDb Update 命令引发数据类型不匹配