我有一个连接到Access数据库查询的Excel pivotcache。但是,如果我在Access中更改源数据(例如,更改值,添加/删除记录),我必须刷新pivotcache,然后再次运行查询以检索整个数据集上的所有记录。这是非常低效的。我只想检索经常更改的记录(理想情况下,只记录更改但将来会考虑的记录)。
我已尝试过以下解决方案,但它们不适合我的目的:
*在同一工作表中的Excel中创建两个查询表,并在包含两个查询表的整个工作表上创建一个数据透视表。我只刷新“当前”查询表。但是,我被限制为65536行,小于我的查询中的记录数
*创建两个数据透视表。但是,对于必须两次设置数据透视表的用户来说,这是一项太多的努力。我希望优化发生在幕后,而不是用户必须改变他们的习惯。
我现在正在考虑的潜在解决方案是使用两个ADO记录集刷新pivotcache,一个用于历史数据,另一个用于频繁更改的当前数据。如果我更改当前数据,我只运行当前数据集的查询。
但是,我似乎无法将pivotcache转换为ADO记录集。 “pvtRecordset.MoveFirst”行引发错误。它是出于测试目的。如果该行不起作用,那么我无法使用rsCombineRecordsets函数将新记录集与pivotcache组合。
另一种方法是将ADO记录集转换为pivotcache(即设置pivotcache.recordset = ADOrecordset)。历史数据的ADO记录集保存在内存中,因此我们只需要打开一次记录集。但是,我不知道如何让它工作。数据透视表数据保持不变,因为它仍显示“strSqlHist”的结果,而不是“strSqlHist”和“strSqlCurr”的组合。
Sub Main()
RefreshPivotCache "CURRENT"
End Sub
Public Function RefreshPivotCache(strRefreshCmd As String)
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim pvtCache As PivotCache
Dim pvtRecordset As ADODB.Recordset
Dim ptt As PivotTable
Dim strSqlHist As String, strSqlCurr As String
Dim strCon As String
Dim rstCollection As New Collection
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=I:\Cash Management\Cash_M.mdb;"
strSqlHist = "SELECT * FROM v_CFMT WHERE Trx_Date < DateValue('01-DEC-2009')"
strSqlCurr = "SELECT * FROM v_CFMT WHERE Trx_Date >= DateValue('01-DEC-2009')"
If strRefreshCmd = "NEW" Then
'Open the connection and fill the Recordset.
cnn.Open strCon
Set rst = cnn.Execute(strSqlHist)
'Add pivot cache and assign the cache source to the recordset
Set pvtCache = ThisWorkbook.PivotCaches.Add(SourceType:=xlExternal)
Set pvtCache.Recordset = rst
'Create pivot table and assign to pivot cache
Set ptt = pvtCache.CreatePivotTable(TableDestination:=ActiveCell, TableName:="PT_ADO")
ElseIf strRefreshCmd = "CURRENT" Then
'Open the connection and fill the Recordset.
cnn.Open strCon
Set rst = cnn.Execute(strSqlCurr)
'Convert pivotcache to recordset - does not work
Set pvtRecordset = ActiveCell.PivotTable.PivotCache.Recordset
pvtRecordset.MoveFirst 'Operation is not allowed when the object is closed
'Combine the two recordsets and assign to the pivotcache recordset
rstCollection.Add pvtRecordset
rstCollection.Add rst
Set pvtRecordset = rsCombineRecordsets(rstCollection) 'custom function.
End If
'Release objects from memory
cnn.Close
Set cnn = Nothing
If CBool(rst.State And adStateOpen) Then rst.Close
Set rst = Nothing
Set ptt = Nothing
Set rstCollection = Nothing
End Function
总之,我如何部分刷新pivotcache或组合两个pivotcaches?