Excel枢轴连接重命名为" Connection"在VBA中

时间:2014-11-26 16:13:28

标签: excel-vba connection-string pivot-table vba excel

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

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

我需要使用VBA从" Control"中插入日期范围标准。 tab进入每个连接的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()依次执行此操作,那么它应该没有问题,因为" new"连接名称将始终为" Connection" (即不是" Connection1"等)

无论其 我发现Excel只重命名连接如果有一个更改COMMAND.TEXT

因此,如果用户实际上没有更改日期标准值(在表格中保存("控制")。范​​围(" D4"))但是运行宏刷新枢轴然后宏失败,因为命令文本没有被修改,并且没有新的连接字符串要重命名为旧名称。

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

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

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

感激不尽的任何想法

3 个答案:

答案 0 :(得分:0)

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

首先,在VBA改变现有的Pivot Cache / Connections之前,在代码中声明一个字符串变量(currentPvtConn),并将值设置为您要刷新的Pivot的当前Pivot Cache名称。另外,delcare第二个字符串变量(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

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

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

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

...把​​剩下的代码

我完全不确定你的为什么会崩溃。我找到了一个模糊的参考/解决方案,解决了以下问题:

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

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

  3. 重新打开并尝试刷新
  4. Excel崩溃并关闭;没有机会“修复”
  5. / *** 显然,Pivots不支持参数。问题在于电子表格中的参数单元格。实际上,当您关闭文件时,查询“忘记”参数单元格是什么,并使用空格代替。这就是Excel崩溃的原因。我想这是因为数据库表“不能用于”参数查询。但是......这是我的解决方法:不需要额外的表 - 只有数据透视表。

    1. 首先创建常见查询(无参数。)

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

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

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

    5. 相反,使用提示:连接属性=&gt;参数=&GT; “使用以下字符串提示值:”。

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

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

答案 1 :(得分:0)

我在更新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 :(得分:0)

我也遇到过这个问题。我知道线程已经老了,但我认为无论如何我都会分享一个解决方法。

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

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

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