中的详细说明
我有一个带有数据透视表(“PT”)的电子表格,许多用户可以通过我公司的门户网站访问该表。假设用户对Excel几乎没有经验,对“附加步骤”几乎没有容忍度。因此,除了正常的枢轴操作之外的用户交互将不起作用。
我正在运行SQL Server 2008并使用存储过程来生成数据。我必须使用存储过程,因为我需要能够从Excel传递一个参数(这不是理想的,但我有很多安全措施)。
并发症1
PT无法直接连接到存储过程,就像表格等一样。
并发症1A
当表刷新(更新数据连接)时,PT不会自行刷新,因为它没有触发事件。
并发症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
,这没有帮助。
有什么想法吗?
答案 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