从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表
Posted
技术标签:
【中文标题】从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表【英文标题】:Auto Refresh Excel 2007 Pivot Table after data in separate sheet updated from SQL Server DB 【发布时间】:2011-06-07 11:42:37 【问题描述】:背景:
我在 Excel 中有三张工作表。
-
带有数据透视表的汇总表,可从下面的 #2 中提取数据
从 SQL Server DB 中提取数据的数据表。 (拉出一个类别类型和一个美元值)
具有用于刷新数据和理想情况下数据透视表的按钮的工作表。
问题: 当我单击按钮时,数据表会正确刷新,但数据透视表不会。该工作簿在早上 5 点自动运行,并将结果以 PDF 格式发送给人们,因此我必须想办法在 PDF 生成、发送和工作簿关闭之前刷新数据透视表。
我尝试过的: 首先,当按钮被点击时,它会运行:
ActiveWorkbook.RefreshAll
Application.CalculateFull
它确实正确地更新了数据表,而不是枢轴。
我试过了:
在上述两个命令之间和之后添加以下命令均无济于事:Sheets("Summary").PivotTables("PivotTable6").PivotCache.Refresh
Sheets("Summary").PivotTables("PivotTable6").RefreshTable
我曾尝试两次(背靠背)运行这两个命令,如下所示:
ActiveWorkbook.RefreshAll
Application.CalculateFull
ActiveWorkbook.RefreshAll
Application.CalculateFull
希望它能够在第一次运行中获取数据,并在第二次运行中成功进行数据透视刷新。没用。
我试图让 Excel 认为我关闭并重新打开工作簿,然后重新运行刷新: ThisWorkbook.Saved = True
Workbooks(1).Activate
ActiveWorkbook.RefreshAll
Application.CalculateFull
我尝试这样做的原因是因为在运行工作簿后(枢轴不刷新)我保存并关闭。我重新打开(枢轴仍然错误,数据是正确的),我重新运行,(数据再次正确并且相同),现在枢轴是正确的。所以我希望模拟这个。
在这一点上,我想不出其他任何事情。我正处于我认为 Excel 无法做到这一点的地步。还有一件事。最初我们将数据直接从 SQL Server DB 导入数据透视表,但我们不断收到这些错误,因此我们将采取不同的方法:
已删除部分:/xl/pivotTables/pivotTable1.xml
部分。 (数据透视表)
已删除部分:/xl/pivotTables/pivotTable5.xml
部分。 (数据透视表)
已删除记录:来自/xl/workbook.xml
部分(工作簿)的工作簿属性
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error014800_01.xml</logFileName>
<summary>Errors were detected in file 'T:\Reports\RP\Archive\Historical Excel\01-11\RP_01-07-11.xlsm'</summary>
<removedParts summary="Following is a list of removed parts:">
<removedPart>Removed Part: /xl/pivotTables/pivotTable1.xml part. (PivotTable view)</removedPart>
<removedPart>Removed Part: /xl/pivotTables/pivotTable5.xml part. (PivotTable view)</removedPart>
</removedParts>
<removedRecords summary="Following is a list of removed records:">
<removedRecord>Removed Records: Workbook properties from /xl/workbook.xml part (Workbook)</removedRecord>
</removedRecords>
</recoveryLog>
非常感谢任何帮助。
【问题讨论】:
虽然看看是否有修复会很有趣。我想通了为什么数据透视表总是坏掉。我从查询中删除了一个日期字段,它停止破坏我的数据透视表。基本上反复试验删除所有字段并添加回来,直到它坏了。不确定这一领域有什么奇怪的地方。 【参考方案1】:您可以使用工作表更改事件来触发数据透视表的刷新。
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrHandler
Application.EnableEvents = False
'Check to see if the worksheet range raising this event overlaps the range occupied by our data dump
If (Not (Intersect(Target, ActiveSheet.ListObjects("DATA_TABLE_NAME_HERE").Range) Is Nothing)) Then
'If it does, then refesh the pivot tables that depend on this data (not automatic, name each table pivot table explicity)
ActiveSheet.PivotTables("PIVOT_TABLE_NAME_HERE").RefreshTable
End If
ErrHandler:
Application.EnableEvents = True
End Sub
您可能需要将ActiveSheet
替换为Sheets("whatever")
,具体取决于您的工作簿框架。
【讨论】:
【参考方案2】:我遇到过同样的情况,我发现这是由于在连接上启用了后台查询。
我在我的大多数工作表中都包含以下配置,以强制设置禁止后台查询。
Sub SetNoBackgroundQuery()
Dim i As Integer
Dim j As Integer
i = ThisWorkbook.Connections.Count
If i = 0 Then End
For j = 1 To i
ThisWorkbook.Connections(j).ODBCConnection.BackgroundQuery = False
' Debug.Print ThisWorkbook.Connections(j).Name
Next j
End Sub
【讨论】:
以上是关于从 SQL Server DB 更新单独工作表中的数据后自动刷新 Excel 2007 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据
当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?
使用 SQL Server DTS 包有条件地在目标表中插入/更新行