强制数据透视表在非常复杂的情况下刷新

时间:2013-08-30 20:19:48

标签: sql-server excel vba excel-vba pivot

中的详细说明

背景

我有一个带有数据透视表(“PT”)的电子表格,许多用户可以通过我公司的门户网站访问该表。假设用户对Excel几乎没有经验,对“附加步骤”几乎没有容忍度。因此,除了正常的枢轴操作之外的用户交互将不起作用。

我正在运行SQL Server 2008并使用存储过程来生成数据。我必须使用存储过程,因为我需要能够从Excel传递一个参数(这不是理想的,但我有很多安全措施)。

因素/解决方案的时间顺序

并发症1

PT无法直接连接到存储过程,就像表格等一样。

  • 解决方案这意味着必须先将数据导入表格(可以连接到存储过程),然后此表格将成为PT的来源。

并发症1A

当表刷新(更新数据连接)时,PT不会自行刷新,因为它没有触发事件。

  • 解决方案:使用VBA,特别是工作表更改事件在表的工作表模块上强制刷新PT。这很有效,一切都在100%工作。

并发症2

当从远程位置(Web门户)打开位于同一工作簿和此工作簿中的PT时,您将收到类似“错误1004:未找到源文件”的错误。 PT尝试使用工作簿的路径连接到其源,但它将临时URL视为其路径。

  • 解决方案:不是使用PivotCache.Refresh直接刷新PT,RefreshTable使用Activeworkbook.RefreshAll,无论出于什么原因,当前者给我{ {1}}。

并发症3

所以现在我需要检测表中的更改,然后使用Error 1004。但是尽管使用了Activeworkbook.RefreshAll,甚至设置了一个布尔值来防止更改事件在执行Application.EnableEvents = False时被踢入,我得到一个无限循环。

工作表模块:

Activeworkbook.RefreshAll

标准模块:

Private blnAbort As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
    If blnAbort = True Then Exit Sub
        blnAbort = True
        Call Refresh
        blnAbort = False
    End If
End Sub

导致其他问题的可能解决方案:

似乎Public Sub Refresh() Application.EnableEvents = False ActiveWorkbook.RefreshAll Application.EnableEvents = True End Sub 正在被执行,然后宏仍在继续,同时它仍然令人耳目一新。这似乎导致Activeworkbook.RefreshAll事件和Enable_Events及时重置,以便刷新某些内容并触发更改,整个事情再次启动。我将数据连接属性blnAbort更改为false。

但是,现在我收到错误BackgroundRefresh并且调试只是跳到Method 'RefreshAll' of object '_Workbook' failed,这没有帮助。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您如何调用源表的刷新?如果用户通过按钮刷新它,那么你可以强制刷新数据透视表的pivotcache ......

工作表代码模块中的

Private Sub BtnRefreshData_Click()
    '// Insert the "refreh" routine or call a procedure to refresh the 
    '// data from the stored procedure here..

    '// Once the data is done being refreshed, manually refresh the pivot cache 
    '// for the pivot table. The code looks like this:

     Sheet1.PivotTables("MyPivotTable").PivotCache.Refresh

    '// If you have a lot of pivot tables to refresh from your "source" data-table
    '// then you can always just do a foreach loop...

     Dim sht1 As Worksheet: Set sht1 = Sheet1
     Dim pTable As PivotTable

     For Each pTable in sht1.PivotTables
         pTable.PivotCache.Refresh
     Next pTable

End Sub

让我知道这是否有所帮助,或者更具体地说明为什么像这样的直接行动不会起作用,我会尽力再试一次。如果确实有效,请告诉我!谢谢,Brian

<强>更新

所以回应你的评论:
从我能说的话听起来真的是你唯一的问题是交织事件创建的无限循环(刷新数据透视表的事件调用更改事件,刷新枢轴表等等...)。

我认为此时最简单的解决方案是在刷新事件发生时禁用所有事件,这不应触发不需要的事件(导致循环)。在刷新数据透视表的代码之前,输入以下代码:

    '// Start Code Snippet...

    Application.EnableEvents = False

    '// Do your refresh routine here....

    Application.EnableEvents = True

    '// End Code Snippet

这有帮助吗?如果没有,我会再试一次:) ...谢谢,Brian