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中,excel,connection-string,pivot-table,vba,Excel,Connection String,Pivot Table,Vba,我已经与这个问题斗争了几天,读了很多关于重新命名连接的帖子,但仍然无法实现我需要的 基本上,我有一个工作簿,它有多个工作表,每个工作表使用不同的连接使用不同的透视表 我需要使用VBA将日期范围条件从“Control”选项卡插入到每个连接的sql语句中,因为我们都知道pivots不能使用?参数 但是,我们也知道,修改连接时Excel会重命名该连接,因此使用VBA更改命令文本最终会创建新连接并留下冗余连接 在这个论坛上使用一些其他非常有用的帖子,我成功地做到了 -更改命令文本 -删除旧连接并重命名新
感激地收到的任何想法以下是我所做的,不依赖硬编码的引用,来管理在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]”
如果结束
。。。把剩下的代码放进去
我不太清楚你的车为什么会撞坏。我确实找到了一个模糊的问题参考/解决方案,其中出现了以下情况:
***/我在更新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"