MS Excel 2003:部分刷新PivotCache或组合PivotCache

时间:2010-01-03 03:07:02

标签: excel-vba ms-access excel vba

我有一个连接到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?

1 个答案:

答案 0 :(得分:0)

当您说“将记录集存储到内存中”时,您是否想要获取断开连接的记录集?见how to create a disconnected recordset