我一直在与这个问题作斗争几天,并阅读了很多关于重命名连接的帖子,但仍然无法实现我所需要的。
基本上我有一个工作簿,它有多个工作表,每个工作表使用不同的连接使用不同的数据透视表。
我需要使用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"我可以重复重命名和删除步骤。
这应该没问题,但出于某种原因,它只是崩溃了,我还没有尝试过它
有没有人对此有实际解决方案?我应该再尝试一下聪明的东西吗?
感激不尽的任何想法
答案 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
...把剩下的代码
我完全不确定你的为什么会崩溃。我找到了一个模糊的参考/解决方案,解决了以下问题:
使用直接加载到数据透视缓存的参数化查询创建Excel文件(即使用命令文本中的参数“?”)
保存beatufully制作的文件并关闭
/ *** 显然,Pivots不支持参数。问题在于电子表格中的参数单元格。实际上,当您关闭文件时,查询“忘记”参数单元格是什么,并使用空格代替。这就是Excel崩溃的原因。我想这是因为数据库表“不能用于”参数查询。但是......这是我的解决方法:不需要额外的表 - 只有数据透视表。
首先创建常见查询(无参数。)
根据查询结果创建数据透视表。
将查询更改为参数查询。
在Excel中刷新数据之前,请不要选择单元格值作为参数。
相反,使用提示:连接属性=&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表的连接,然后使用该表作为数据透视表的源。
我希望这对某人有所帮助,因为我几天都在摸不着头脑。