【问题标题】:Excel pivot connection renamed to "Connection" in VBAExcel 枢轴连接在 VBA 中重命名为“连接”
【发布时间】:2015-01-25 01:28:03
【问题描述】:

我已经与这个问题作斗争了几天,阅读了很多关于重命名连接的帖子,但仍然无法实现我所需要的。

基本上我有一个工作簿,其中有多个工作表,每个工作表都有一个使用不同连接的不同数据透视表。

我需要使用 VBA 将日期范围标准从“控制”选项卡插入到每个连接的 sql 语句中,因为我们都知道枢轴不能使用?参数。

但是,我们也知道,当您修改连接时,Excel 会重命名连接,因此使用 VBA 更改命令文本最终会创建新连接并留下冗余连接。

使用此论坛中的其他一些非常有用的帖子,我成功地设法 - 更改命令文本 - 删除旧连接并重命名新连接,假设其名称为“连接”

因此:

text = "... new SQL query here..."
ActiveWorkbook.Connections("GLCosts").ODBCConnection.CommandText = text
   ' assume excel has renamed the "GLCosts" connection to "Connection"    
ActiveWorkbook.Connections("Connection").Refresh
   ' delete the original and rename the new one to the old name
ActiveWorkbook.Connections("GLCosts").Delete
ActiveWorkbook.Connections("Connection").name = "GLCosts"

只要每个 Sub() 依次执行此操作,就可以了,因为“新”连接名称将始终为“Connection”(即不是“Connection1”等)

但是 我发现 Excel 仅在 COMMAND.TEXT 发生更改时重命名连接

因此,如果用户实际上并没有更改日期标准值(保存在 Sheets("Control").Range("D4") 中)但确实运行宏来刷新枢轴,那么宏将失败,因为命令文本没有被修改,也没有新的连接字符串可以重命名为旧名称。

所以.... 我试图变得聪明。在每个 Sub() 中,我首先设置 text = "...一个有效的 sql 查询,但不是我想要的那个...",然后用这个虚拟查询替换连接的 command.text ,从而强制 excel 创建一个新连接我可以重命名。然后,当我设置 text =“...正确的 sql 查询”时,excel 将再次创建一个名为“Connection”的新连接,我可以重复重命名和删除步骤。

这应该没问题,但由于某种原因,它只是崩溃了 excel,我没有再次尝试过

有人对此有实际的解决方案吗?我应该再试试聪明的东西吗?

感谢您的任何想法

【问题讨论】:

  • 不敢相信没有人解决了这个问题。我定义得不好?

标签: excel connection-string pivot-table vba


【解决方案1】:

我在更新 ODBC 连接的CommandText 属性时也遇到了这个错误。我发现如果您暂时切换到 OLEDB 连接,更新您的 CommandText 属性,然后切换回 ODBC,它不会创建新连接。不要问我为什么……这对我有用。

创建一个新模块并插入以下代码:

Option Explicit

Sub UpdateWorkbookConnection(WorkbookConnectionObject As WorkbookConnection, Optional ByVal CommandText As String = "", Optional ByVal ConnectionString As String = "")

With WorkbookConnectionObject
    If .Type = xlConnectionTypeODBC Then
        If CommandText = "" Then CommandText = .ODBCConnection.CommandText
        If ConnectionString = "" Then ConnectionString = .ODBCConnection.Connection
        .ODBCConnection.Connection = Replace(.ODBCConnection.Connection, "ODBC;", "OLEDB;", 1, 1, vbTextCompare)
    ElseIf .Type = xlConnectionTypeOLEDB Then
        If CommandText = "" Then CommandText = .OLEDBConnection.CommandText
        If ConnectionString = "" Then ConnectionString = .OLEDBConnection.Connection
    Else
        MsgBox "Invalid connection object sent to UpdateWorkbookConnection function!", vbCritical, "Update Error"
        Exit Sub
    End If
    If StrComp(.OLEDBConnection.CommandText, CommandText, vbTextCompare) <> 0 Then
        .OLEDBConnection.CommandText = CommandText
    End If
    If StrComp(.OLEDBConnection.Connection, ConnectionString, vbTextCompare) <> 0 Then
        .OLEDBConnection.Connection = ConnectionString
    End If
    .Refresh
End With

End Sub

此UpdateWorkbookConnection 子例程仅适用于更新 OLEDB 或 ODBC 连接。连接不一定必须链接到数据透视表。它还解决了另一个问题,即使有多个基于同一连接的数据透视表,您也可以更新连接。

要启动更新,只需使用连接对象和命令文本参数调用函数,如下所示:

UpdateWorkbookConnection ActiveWorkbook.Connections("Connection"), "exec sp_MyAwesomeProcedure"

您也可以选择更新连接字符串。

【讨论】:

  • 感谢詹姆斯和布赖恩。出于某种原因,这些答案进入了我的垃圾邮件文件夹,而我才刚刚看到它们。所以很抱歉詹姆斯没有回应。基本上已经放弃了解决方案,只是忍受了这个问题。当我有时间时,我很想尝试一下。谢了。
【解决方案2】:

这就是我所做的,它不依赖于硬编码的引用,以管理在 Excel 中以编程方式更新 pivotCache 的烦人过程。

首先,在您让 VBA 更改您现有的 Pivot Cache/Connections 之前,在您的代码中声明一个字符串变量 (currentPvtConn) 并将值设置为您打算刷新的 Pivot 的当前 Pivot Cache 名称。此外,删除第二个字符串变量(newPvtConn)来保存新连接的名称 Excel 无疑会生成...

Dim currentPvtConn As String
Dim newPvtConn As String

currentPvtConn = ActiveSheet.PivotTables("pvtUser").PivotCache.WorkbookConnection

...现在放置您的代码以修改 CommandText...

刷新命令执行后,Excel 将创建名为“Connection#”的卑鄙的新连接,而您也将保留旧的、未触及的连接。为了清理这个混乱,我们需要捕获新创建的连接名称并将其存储在我们之前创建的 newPvtConnection 变量中......

newPvtConn = ActiveSheet.PivotTables("pvtUser").PivotCache.WorkbookConnection

由于您现在将两个名称都存储为局部变量,因此您实际上可以将两个字符串和

最后,删除原来的连接并重命名新创建的连接。 IF 语句确保在删除/重命名任何内容之前创建了一个新连接。

If (StrComp(currentPvtConn, newPvtConn) <> 0) Then
    ActiveWorkbook.Connections(currentPvtConn).Delete
    ActiveWorkbook.Connections(newPvtConn).Name = "[My Original Connection Name]"
End If

...放其余代码

我完全不确定为什么你的会崩溃。对于发生以下情况的问题,我确实找到了一个晦涩的参考/解决方案:

  1. 使用直接加载到数据透视缓存的参数化查询创建 Excel 文件(即使用命令文本“?”中的参数)

  2. 保存精心制作的文件并关闭

  3. 重新打开并尝试刷新
  4. Excel 严重崩溃并关闭;没有“修复”的机会

/*** 显然,Pivots 不支持参数。问题在于电子表格中的参数单元格。实际上,当您关闭文件时,查询“忘记”参数单元格是什么,而是使用空白。这就是 Excel 崩溃的原因。我猜这是因为数据透视表“不能用于”参数查询。但是...这是我的解决方法:不需要额外的表 - 只需数据透视表。

  1. 先创建通用查询(无参数)。

  2. 根据查询结果创建数据透视表。

  3. 将查询改为参数查询。

  4. 在 Excel 中刷新数据之前,不要选择单元格值作为参数。

改为使用提示:连接属性=> 参数=>“使用以下字符串提示输入值:”。

因此,当您在数据透视表上单击“刷新”时,系统会提示您输入参数。

我知道它不像引用单元格那样优雅,但这样 Excel 就不会崩溃。此外,您不必同时刷新结果和数据透视表,而只需刷新数据透视表。 Source MSDN: (bottom-of-page comment) ***/

【讨论】:

  • 感谢 James - 会尝试您的路线,但工作簿中有多个枢轴,并且真的希望避免必须单独刷新或多次键入月/年
【解决方案3】:

我也遇到过这个问题。我知道线程很旧,但我想我还是会分享一个解决方法。

我正在使用 Excel 2013(尽管它也可能在早期版本中工作),并发现在 VBA 中更改 ODBCconnection.commandtext 时,我得到了相同的效果,其中使用旧命令创建了一个名为“Connection”的新连接文本并链接到数据透视表。但是原始连接具有新的命令文本,但它不再连接到枢轴。

如果您要在 VBA 中更改的连接链接到 Excel 表而不是数据透视表,我发现未创建新的“连接”,而是通过代码更改了原始连接但仍保持链接到桌子。 所以我在隐藏的工作表上创建了一个链接到 Excel 表的连接,然后将此表用作数据透视表的源。

我希望这对某人有所帮助,因为这几天我一直在摸不着头脑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2018-08-18
    相关资源
    最近更新 更多