里面有详细说明
背景
我有一个带有数据透视表(“PT”)的电子表格,许多用户将通过我公司的门户网站访问该电子表格。假设用户几乎没有使用 Excel 的经验,并且对“附加步骤”几乎没有容忍度。因此,除了正常的枢轴操作之外的用户交互将不起作用。
我正在运行 SQL Server 2008 并使用存储过程来生成数据。我必须使用存储过程,因为我需要能够从 Excel 传递一个参数(这并不理想,但我有很多保护措施)。
因素/解决方案的时间顺序
并发症 1
PT 不能像表等那样直接连接到存储过程。
- 解决方案这意味着必须首先将数据导入到一个表中(该表可以连接到存储过程),然后该表将成为 PT 的源。
并发症 1A
当表刷新(更新数据连接)时,PT 不会自行刷新,因为它没有触发事件。
- 解决方案:使用 VBA,特别是表格工作表模块上的工作表更改事件来强制刷新 PT。这很好用,一切都在 100% 工作。
并发症 2
当从远程位置(门户网站)打开位于同一工作簿和此工作簿中的 PT 时,您将收到类似于“错误 1004:找不到源文件”的错误。PT 尝试使用工作簿的路径连接到其源,但它将临时 URL 视为其路径。
- 解决方案:与其直接刷新 PT 使用
PivotCache.Refresh
,不如RefreshTable
使用Activeworkbook.RefreshAll
which 在前者给我时无论出于何种原因确实有效Error 1004
。
并发症 3
所以现在我需要检测表中的变化,然后使用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
及时重置,以便刷新并触发更改,整个事情又开始了。我将数据连接属性更改BackgroundRefresh
为 false。
但是,现在我得到了错误Method 'RefreshAll' of object '_Workbook' failed
,调试只是跳转到Activeworkbook.RefreshAll
没有帮助的地方。
有任何想法吗?