具有动态查询到外部数据源的数据透视表

时间:2013-03-21 20:51:13

标签: excel excel-vba pivot-table vba

我的问题不是专门寻找解决方案的想法,而是更多地用于对我自己的解决方案进行健全性检查,因为自从我在Excel VBA中使用ADODB以来已经有一段时间了(至少有两个主要版本)。

所以情况就是这样。我正在为想要访问数据库视图的大块的用户创建Excel报告,该数据库视图太大而不适合内存。用户需要能够访问所有视图,因此硬编码过滤器是不可能的。除非我错过了一个更优雅的解决方案,否则他们需要的是能够以生成的SQL语句的形式动态控制连接上的过滤器,该语句将提供给pivotcache,然后告诉pivottable刷新。

我创建了一个“刷新”按钮,它会调出一个包含用户通常需要的所有过滤器的表单。用户输入过滤器值,我解析并验证它们,从值中形成一个正确的SQL语句。然后当我这样做时遇到问题:

'this has to be dynamic becuase I'm distributing to multiple users, using different testing/production databases on different workstations.
mypivottable.PivotCache.Connection = "ODBC;" & driver & myserver & myuser & trusted & app & workstationid & databse

'this also has to be dynamic becuase of the sql filters
mypivottable.PivotCache.CommandText = sql

所以我按下按钮就可以了!设置这些属性后,pivottable会自动刷新,因为它知道缓存后面有新数据,并在新条件下获取查询结果。

问题在于,当我查看外部数据源列表时,每次更改这些属性时,它都会创建一个新连接,并且不会自行清理。 100次使用后,周围有100个连接,其中99个未使用。如果我删除所有连接,那么它会不可逆转地破坏枢轴表。

有更好的方法吗?有没有一种程序化的方法来清理只有未使用的连接?

1 个答案:

答案 0 :(得分:1)

如果您只需更新SQL语句,则无需重置连接。我实际上遇到了类似的问题,这就是我解决它的方法:

Sub test()
' add logic...

    ' then change sql code
    With ThisWorkbook.Connections("your connection name").OLEDBConnection
            .CommandText = Array("select * from mytable where id = 1") ' adjust accordingly
            .Refresh
    End With
End Sub

您真正需要做的就是获取当前连接,然后更新CommandText属性。顺便说一句,我不确定为什么我需要使用Array(),但我遇到了没有它的问题。

我实际上写了一篇关于使用SQL创建数据透视表(link here)的博文。也许我应该再创建一个关于创建动态内容的内容:)