Excel数据透视连接重命名为";“连接”;在VBA中

Excel数据透视连接重命名为";“连接”;在VBA中,excel,connection-string,pivot-table,vba,Excel,Connection String,Pivot Table,Vba,我已经与这个问题斗争了几天,读了很多关于重新命名连接的帖子,但仍然无法实现我需要的 基本上,我有一个工作簿,它有多个工作表,每个工作表使用不同的连接使用不同的透视表 我需要使用VBA将日期范围条件从“Control”选项卡插入到每个连接的sql语句中,因为我们都知道pivots不能使用?参数 但是,我们也知道,修改连接时Excel会重命名该连接,因此使用VBA更改命令文本最终会创建新连接并留下冗余连接 在这个论坛上使用一些其他非常有用的帖子,我成功地做到了 -更改命令文本 -删除旧连接并重命名新

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

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

我需要使用VBA将日期范围条件从“Control”选项卡插入到每个连接的sql语句中,因为我们都知道pivots不能使用?参数

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

在这个论坛上使用一些其他非常有用的帖子,我成功地做到了 -更改命令文本 -删除旧连接并重命名新连接,假定其名称为“connection”

因此:

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

然而 我发现Excel仅在COMMAND.TEXT发生更改时才重命名连接

因此,如果用户实际上没有更改日期标准值(保存在工作表(“Control”).Range(“D4”)中),而是运行宏刷新数据透视,则宏将失败,因为命令文本尚未修改,并且没有新的连接字符串可重命名为旧名称

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

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

有没有人对此有实际的解决方案?我应该再试一次吗


感激地收到的任何想法

以下是我所做的,不依赖硬编码的引用,来管理在Excel中以编程方式更新数据透视缓存的烦人过程

首先,在VBA更改现有的Pivot缓存/连接之前,请在代码中声明一个字符串变量(currentPvtConn),并将值设置为要刷新的Pivot的当前Pivot缓存名称。此外,第二个字符串变量(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
If(StrComp(currentPvtConn,newPvtConn)0)则
ActiveWorkbook.Connections(currentPvtConn).删除
ActiveWorkbook.Connections(newPvtConn).Name=“[My Original Connection Name]”
如果结束
。。。把剩下的代码放进去

我不太清楚你的车为什么会撞坏。我确实找到了一个模糊的问题参考/解决方案,其中出现了以下情况:

  • 使用直接加载到Pivot缓存的参数化查询创建Excel文件(即使用命令文本“”中的参数)

  • 保存精心编制的文件并关闭

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

  • 首先创建公共查询(无参数。)

  • 基于查询结果创建透视表

  • 将查询更改为参数查询

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

  • 相反,使用prompt:connectionproperties=>Parameters=>“使用以下字符串提示输入值:”

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

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

    我在更新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
    

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

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

    我正在使用Excel 2013(尽管它在早期版本中也可以工作),并发现在VBA中更改ODBCconnection.commandtext时,我会得到相同的效果,即使用旧命令文本创建一个名为“connection”的新连接,并链接到透视表。但是原始连接有新的命令文本,但是它没有连接到pivo
    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 ActiveWorkbook.Connections("Connection"), "exec sp_MyAwesomeProcedure"