使用 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 连接的主要内容,如果未能解决你的问题,请参考以下文章

VBA 更新或删除 CSV 中的行

清除 DataTable 中的 Byte[] 值时,OleDb Update 命令引发数据类型不匹配

重新计算自定义 VBA 函数,仅应请求

使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法

访问VBA更新列以进行连接

通过工作簿VBA从主列表更新价格