强制在一个非常复杂的场景中刷新数据透视表

里面的详细描述

背景

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

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

时间顺序的因素/解决scheme

并发症1

一个PT不能直接连接到一个存储过程,如它可以表等

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

并发症1A

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

  • 解决scheme :使用VBA,特别是表的工作表模块上的工作表更改事件来强制刷新PT。 这工作很好,所有工作都是100%。

并发症2

当从远程位置(Web门户)打开位于同一工作簿和此工作簿中的PT时,将看到类似“Error 1004:Source file not found”的错误。 PT试图使用工作簿的path连接到它的源,但它将临时URL看作其path。

  • 解决scheme :不是直接使用PivotCache.Refresh刷新PT,而是使用PivotCache.Refresh ,无论出于何种原因,当前者向我提供Error 1004时实际上工作。

并发症3

所以现在我需要现在检测表中的变化,然后使用Activeworkbook.RefreshAll 。 但是,尽pipe使用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 

造成另一个问题的可能解决scheme

看起来好像Activeworkbook.RefreshAll正在执行,然后macros还在继续刷新。 这似乎是导致Enable_Events事件和blnAbort被及时重置,刷新和触发一个更改,整个事情再次开始。 我将数据连接属性BackgroundRefresh更改为false。

但是,现在我得到错误Method 'RefreshAll' of object '_Workbook' failed ,debugging只是跳转到Activeworkbook.RefreshAll这是没有用的。

有任何想法吗?

你如何调用源表的刷新? 如果用户通过button刷新它,那么你可以强制刷新数据透视表的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

更新:

因此,在回应你的意见:
从我可以告诉它听起来真的是唯一的问题是由交织事件创build的无限循环(刷新数据透视表的事件调用更改事件,刷新数据透视表等等,等等等等)。

我认为在这一点上最简单的解决scheme是在发生刷新事件时禁用所有事件,不应该引发不需要的事件(导致循环)。 在刷新数据透视表的代码之前,input以下代码:

  '// Start Code Snippet... Application.EnableEvents = False '// Do your refresh routine here.... Application.EnableEvents = True '// End Code Snippet 

这有帮助吗? 如果没有,我会再试一次:) …谢谢,布赖恩